八位数码管动态显示编程
时间: 2023-07-08 12:38:15 浏览: 204
以下是基于51单片机的八位数码管动态显示程序,代码注释中有详细说明:
```
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
// 定义数码管段选码表,这里使用共阳极的数码管
uchar code table[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
// 定义数码管位选码表,这里使用共阳极的数码管
uchar code digit[] = {
0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f
};
// 定义显示缓存,存储每个数码管要显示的数字
uchar disp_buf[8];
// 定义计数器,用于控制数码管的刷新
uint cnt = 0;
// 定时器0中断服务程序
void timer0_isr() interrupt 1
{
TH0 = (65536 - 1000) / 256; // 重新设置定时器初值
TL0 = (65536 - 1000) % 256;
cnt++; // 计数器加1
if(cnt >= 8) cnt = 0; // 计数器溢出时清零
P2 = digit[cnt]; // 选通当前数码管
P0 = table[disp_buf[cnt]]; // 显示缓存中对应的数字
}
// 主函数
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 1000) / 256; // 设置定时器初值,1ms
TL0 = (65536 - 1000) % 256;
ET0 = 1; // 使能定时器0中断
EA = 1; // 全局中断使能
TR0 = 1; // 启动定时器0
while(1) // 主循环
{
// 更新显示缓存,这里演示将计数器的值显示出来
disp_buf[0] = cnt / 1000;
disp_buf[1] = cnt % 1000 / 100;
disp_buf[2] = cnt % 100 / 10;
disp_buf[3] = cnt % 10;
}
}
```
这段代码实现了每隔1ms刷新一次八位数码管,每次显示计数器的值。需要注意的是,如果使用共阴极的数码管,需要将数码管位选码表中的0和1反转,同时将数码管段选码表中的0和1反转。
阅读全文