蓝桥杯单片机数码管定时器动态扫描的参考代码
时间: 2023-10-22 15:10:37 浏览: 106
蓝桥杯总结.pdf
这里提供一份蓝桥杯单片机数码管定时器动态扫描的参考代码,供大家参考。
```c
#include <reg51.h> //头文件
// 数码管位选信号
unsigned char code LED_W[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
// 数码管段选信号
unsigned char code LED_D[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
};
// 定时器中断服务函数
void Timer0_ISR() interrupt 1 {
static unsigned char count = 0; // 计数器
static unsigned char index = 0; // 位选信号索引,表示当前显示的是哪一位数码管
count++; // 计数器加1
if (count >= 100) { // 计数器达到100时,表示100ms已经过去了
count = 0; // 计数器清零
P0 = LED_W[index]; // 先将位选信号输出到P0口
P2 = LED_D[index]; // 再将对应的段选信号输出到P2口
index = (index + 1) % 8; // 索引加1,循环显示8个数码管
}
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1,16位定时器
TH0 = 0xFC; // 定时器初值,定时1ms
TL0 = 0x66;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
while(1); // 主函数空循环,等待中断触发
}
```
该代码中,通过定时器0产生1ms的中断,然后在中断服务函数中动态扫描8个数码管。其中,`LED_W`为数码管的位选信号,`LED_D`为数码管的段选信号。在每次中断服务函数中,先输出位选信号,再输出对应的段选信号,就可以实现数码管的动态扫描了。
阅读全文