任务描述:
使用定时器中断实现数码管数值从10到0 步长为一递减
资源使用,定时器,GPIO
硬件原理
数码管工作原理:
`led数码管`(LED Segment Displays)由多个[发光二极管]封装在一起组成 `“8”字型`的器件,引线已在内部连接完成,
只需引出它们的各个笔划,`公共电极`。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。
这些段分别由字母 `a,b,c,d,e,f,g,dp`来表示。——百度百科
原理图
接线图
Sysconfig配置引脚与TIMER
TIME0 中断
int TimerCnt,TmpVal; void TIMER_0_INST_IRQHandler(void) { switch (DL_Timer_getPendingInterrupt(TIMER_0_INST)) { case DL_TIMER_IIDX_ZERO: TimerCnt++; if (TimerCnt >= 100) { TimerCnt = 0; TmpVal--; if (TmpVal < 0) { TmpVal = 10; } } break; default: break; } }
数码管显示函数
void Disp_Data(uint16_t dataH, uint16_t dataL) { uint16_t tempH, tempL; uint8_t num_q, num_b, num_s, num_g; tempL = dataL; num_q = tempL / 1000; num_b = tempL / 100 % 10; num_s = tempL / 10 % 10; num_g = tempL % 10; HC595_SEND_DATA(Disp_DX[num_q], 3); HC595_SEND_DATA(Disp_DX[num_b], 2); HC595_SEND_DATA(Disp_DX[num_s], 1); HC595_SEND_DATA(Disp_DX[num_g], 0); tempH = dataH; 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); }
主函数
int main(void) { SYSCFG_DL_init(); uint16_t i=0,j=0; uint8_t val=0; TmpVal = 10; NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN); DL_TimerG_startCounter(TIMER_0_INST); while (1) { Disp_Data(0,TmpVal); } }
实际测试效果