【实现目标】用定时器中断实现数码管数值的递减
◆◆◆软件开发环境: CCS + TI System Configuration Tool
◆◆◆硬件开发环境:TI提供的LP-MSPM0L1306开发板,数码管模块以及排线
◆◆◆工作原理
74HC595是一个串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则是在RCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。
数码管模块的原理图如下
◆◆◆操作步骤
1. 用排线连接开发板与数码管模块。数码管与开发板的连接图,如下
2. 新建或者copy一个空项目(详见课程一的帖子)
3. 配置.syscfg参数。
GPIO配置如下
定时器配置如下
4. 编写程序
显示服务程序:
//应用数据
void Display_0ut()
{
HC595_RCK(0);
delay_cycles(32);
HC595_RCK(1);
delay_cycles(32);
}
//写数据
void HC595_WriteData(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(data & 0x80)
{
HC595_DAT(1);
}
else
{
HC595_DAT(0);
}
data <<= 1;
HC595_CLK(0);
delay_cycles(32);
HC595_CLK(1);
delay_cycles(32);
}
}
//发送数据
void HC595_Send_Data(uint8_t dis_num,uint8_t dis_bit)
{
HC595_WriteData(dis_num);
HC595_WriteData(1<<dis_bit);
Display_0ut();
}
//拆分显示数据
void Display_Data(uint16_t u16DataH)
{
uint16_t templ,tempH;
uint8_t num_q,num_b,num_s,num_g;
tempH = u16DataH;
num_q = tempH/1000;
num_b = tempH/100%10;
num_s = tempH/10%10;
num_g = tempH%10;
HC595_Send_Data(Disp_DX[num_q],7);
HC595_Send_Data(Disp_DX[num_b],6);
HC595_Send_Data(Disp_DX[num_s],5);
HC595_Send_Data(Disp_DX[num_g],4);
}
定时器中断处理程序:
void TIMER_0_INST_IRQHandler(void)
{
switch(DL_TimerG_getPendingInterrupt(TIMER_0_INST))
{
case DL_TIMER_IIDX_ZERO:
TimerCnt++;
if(TimerCnt >=100)
{
TimerCnt=0;
tempval++;
if(tempval>10)tempval=0;
}
break;
default:
break;
}
}
主程序:
int main(void)
{
SYSCFG_DL_init();
//开中断
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
while (1) {
Display_Data(tempval);
}
}
5. 编译并调试。效果如下
这样第二个任务就完成了。