2. 跑通例程
选了一个数码管显示递增数字的例程HX_DSC28027_IIC_TM1650来跑。
首先介绍下原理,设置定时器1ms中断,主程序对中断次数循环计数,360次中断即360ms通过iic接口向数码管发送显示指令,显示指令包括(千位,百位,十位,个位),还做了按键中断响应,当按下101按键时,递增千位数值,当按下103按键时,计数清零,数码管显示0000。
原理不复杂,用到了定时器中断,按键中断和iic
通信。详细程序如下。
-
-
int main(void)
-
{
-
/*初始化系统控制*/
-
InitSysCtrl();
-
-
/*初始化LED*/
-
InitLED();
-
-
/* 清除所有中断和初始化PIE向量表*/
-
/*禁用CPU中断*/
-
DINT;
-
/*初始化PIE控制寄存器到默认状态,默认状态是全部PIE中断被禁用和标志位被清除*/
-
InitPieCtrl();
-
/*禁用CPU中断和清除所有CPU中断标志位*/
-
IER = 0x0000;
-
IFR = 0x0000;
-
/*初始化PIE中断向量表,为PIE向量表中的所有中断向量配置对应向量的入口地址*/
-
InitPieVectTable();
-
-
/*定时器0初始化*/
-
timer0_init();
-
-
/*初始化IIC总线的Gpio*/
-
InitI2C_Gpio();
-
/*IIC初始化*/
-
I2CA_Init();
-
/*软件复位IIC从设备*/
-
softResetIIC_BUS();
-
//printf("rnTM1650 init...");//标准C的printf输出测试,串口调试助手设置波特率128000bps,ASCII格式显示
-
-
/*BIT6到BIT4为亮度调节,BIT0是 1 开启/0关闭*/
-
LigntVal = 0x11;
-
/*1级亮度,开启显示*/
-
TM1650_Send(CMD_SEG, LigntVal);
-
/*DIG0-DIG3均显示0*/
-
TM1650_Send(DIG0, SEG7Table[0]);
-
TM1650_Send(DIG1, SEG7Table[0]);
-
TM1650_Send(DIG2, SEG7Table[0]);
-
TM1650_Send(DIG3, SEG7Table[0]);
-
-
/*使能全局中断*/
-
EINT;
-
/*使能调试事件*/
-
-
while(1)
-
{
-
/*间隔为360ms*/
-
if(CpuTimer0.InterruptCount >= 360)
-
{
-
/*定时器0中断次数清零*/
-
CpuTimer0.InterruptCount = 0;
-
-
/*D401翻转*/
-
GpioDataRegs.GPATOGGLE.bit.GPIO6 = 1;
-
-
/*Tmp累加,从0-999循环*/
-
Tmp++;
-
if(Tmp > 999)
-
Tmp = 0;
-
-
/*DIG1显示Tmp的百位*/
-
TM1650_Send(DIG1, SEG7Table[Tmp / 100]);
-
/*DIG2显示Tmp的十位*/
-
TM1650_Send(DIG2, SEG7Table[(Tmp / 10) % 10]);
-
/*DIG3显示Tmp的个位*/
-
TM1650_Send(DIG3, SEG7Table[Tmp % 10]);
-
-
/*TM1650获取扫描按键S101 S102 S103,控制数码管数字显示及亮度调节*/
-
TM1650_Read(CMD_KEY, &keyVal);
-
-
/*S101按下时,DIG0显示内容+1*/
-
if(keyVal == 0x44)
-
{
-
keyReg++;
-
keyReg &= 0x0f;
-
TM1650_Send(DIG0, SEG7Table[keyReg]);
-
}
-
-
/*S102按下时,改变数码管显示亮度*/
-
if(keyVal == 0x4c) //
-
{
-
/*高四位为亮度调节,最后1位是开启、关闭显示*/
-
LigntVal = (LigntVal + 0x20) & 0x7F;
-
-
/*1级亮度,开启显示*/
-
TM1650_Send(CMD_SEG, LigntVal);
-
}
-
-
/*按下S103时*/
-
if(keyVal == 0x54)
-
{
-
Tmp = 0;
-
keyReg = 0;
-
-
/*DIG0-DIG3清零*/
-
TM1650_Send(DIG0, SEG7Table[0]);
-
TM1650_Send(DIG1, SEG7Table[0]);
-
TM1650_Send(DIG2, SEG7Table[0]);
-
TM1650_Send(DIG3, SEG7Table[0]);
-
-
/*D400翻转*/
-
GpioDataRegs.GPATOGGLE.bit.GPIO7 = 1;
-
}
-
}
-
}
-
}
-
复制代码
烧写可写入flash,也可写入ram。写入ram计算会更快一些,可以把一些无状态的函数放到ram中,有状态函数和存储数据库放到flash中。
debug过程中需要讲拨码开关全部拨到左侧。在ide中进行debug,通过watch面板观察断点时变量值,也可以通过live view观察变量值的连续变化情况。
最后上一个烧写成功,正在运行的图。再次感谢官方技术人员gengzh。