添加定时器,很方便,能直接生成指定时间的中断
添加中断程序
void TIMER_0_INST_IRQHandler(void) { switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) { case DL_TIMER_IIDX_ZERO: work.timer_ms += 1; if ((work.timer_ms % 1000) == 0) { DL_GPIO_togglePins(GPIO_LEDSR_PORT,GPIO_LEDSR_PIN_0_PIN); work.timer_s++; } break; default: break; } }
由于材料包中的数码管总有问题,我换用了一个带专用数码管驱动(MAX7219)的数码管,通过总线通信,根据配置显示,自动动态,不用再软件里一直刷新原理图如下
芯片管脚描述
时序图
连线
DIN-PA4 CS-PA5 CLK-PA3
驱动直接在网上找了
//-------------------------------------------- // 功能:向MAX7219(U3)写入字节 // 入口参数:DATA // 出口参数:无 // 说明: void Write_Max7219_byte(uint8_t DATA) { uint8_t i; CS_L; for (i = 8; i >= 1; i--) { CLK_L; if (DATA & 0x80) DIN_H; else DIN_L; DATA = DATA << 1; CLK_H; } } //------------------------------------------- // 功能:向MAX7219写入数据 // 入口参数:address、dat // 出口参数:无 // 说明: void Write_Max7219(uint8_t address, uint8_t dat) { CS_L; Write_Max7219_byte(address); // 写入地址,即数码管编号 Write_Max7219_byte(dat); // 写入数据,即数码管显示数字 CS_H; } void Init_MAX7219(void) { Write_Max7219(0x09, 0x00); // 译码方式:BCD码 Write_Max7219(0x0a, 0x03); // 亮度 Write_Max7219(0x0b, 0x07); // 扫描界限;4个数码管显示 Write_Max7219(0x0c, 0x01); // 掉电模式:0,普通模式:1 Write_Max7219(0x0f, 0x01); // 显示测试:1;测试结束,正常显示:0 } void smg_init(void) { Init_MAX7219(); Write_Max7219(0x0f, 0x00); // 显示测试:1;测试结束,正常显示:0 }
应用函数
void smg_pro(void) { uint8_t t; Write_Max7219(1, 0); Write_Max7219(2, 0); Write_Max7219(3, 0); Write_Max7219(4, 0); Write_Max7219(5, 0); Write_Max7219(6, 0); Write_Max7219(7, 0); Write_Max7219(8, smgtabchar[t]); t--; if (t == 255) t = 0; }