添加定时器,很方便,能直接生成指定时间的中断

添加中断程序
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;
}
我要赚赏金
