51单片机数码管一圈流水显示代码
时间: 2023-10-10 18:13:02 浏览: 103
下面是51单片机控制共阴数码管一圈流水显示的示例代码,以4位共阴数码管为例:
```c
#include <reg51.h>
// 数码管位选信号对应的端口定义
sbit DIG_1 = P1^0;
sbit DIG_2 = P1^1;
sbit DIG_3 = P1^2;
sbit DIG_4 = P1^3;
// 数码管段选信号对应的端口定义
sbit SEG_A = P2^0;
sbit SEG_B = P2^1;
sbit SEG_C = P2^2;
sbit SEG_D = P2^3;
sbit SEG_E = P2^4;
sbit SEG_F = P2^5;
sbit SEG_G = P2^6;
sbit SEG_DP = P2^7;
// 数码管显示的数字数组
unsigned char code DIG_CODE[] = {
// 0~9
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
// 数码管位选信号数组
unsigned char code DIG_SEL[] = {
0x01, 0x02, 0x04, 0x08
};
// 数码管流水显示的索引
unsigned char DIG_INDEX = 0;
// 定时器0中断服务函数
void Timer0_ISR() interrupt 1
{
// 关闭定时器0
TMOD &= ~0x01;
// 设置定时器0初值,1ms中断一次
TH0 = 0xfc;
TL0 = 0x18;
// 启动定时器0
TR0 = 1;
// 显示下一个数码管
DIG_INDEX++;
if (DIG_INDEX >= 4)
{
DIG_INDEX = 0;
}
DisplayDigit(DIG_INDEX);
// 显示当前数码管的数字
DisplayNumber(DIG_CODE[DIG_INDEX]);
// 延时一段时间
Delay(50);
}
// 数码管位选信号控制函数
void DisplayDigit(unsigned char digit)
{
// 关闭所有位选信号
DIG_1 = 1;
DIG_2 = 1;
DIG_3 = 1;
DIG_4 = 1;
// 根据当前位选信号选择要显示的数码管
switch (digit)
{
case 0:
DIG_1 = 0;
break;
case 1:
DIG_2 = 0;
break;
case 2:
DIG_3 = 0;
break;
case 3:
DIG_4 = 0;
break;
default:
break;
}
}
// 数码管段选信号控制函数
void DisplayNumber(unsigned char number)
{
// 根据要显示的数字选择对应的段选信号
SEG_A = (number & 0x01) ? 1 : 0;
SEG_B = (number & 0x02) ? 1 : 0;
SEG_C = (number & 0x04) ? 1 : 0;
SEG_D = (number & 0x08) ? 1 : 0;
SEG_E = (number & 0x10) ? 1 : 0;
SEG_F = (number & 0x20) ? 1 : 0;
SEG_G = (number & 0x40) ? 1 : 0;
SEG_DP = (number & 0x80) ? 1 : 0;
}
// 延时函数
void Delay(unsigned int time)
{
unsigned int i, j;
for (i = 0; i < time; i++)
{
for (j = 0; j < 120; j++);
}
}
// 主函数
void main()
{
unsigned char i;
// 初始化定时器0
TMOD &= ~0x01;
TMOD |= 0x01;
TH0 = 0xfc;
TL0 = 0x18;
// 打开总中断和定时器0中断
EA = 1;
ET0 = 1;
// 启动定时器0
TR0 = 1;
// 数码管流水显示
while (1)
{
for (i = 0; i < 4; i++)
{
DisplayDigit(i);
DisplayNumber(DIG_CODE[i]);
Delay(200);
}
}
}
```
以上代码通过使用定时器0中断来控制数码管的显示,每隔一定时间切换一次数码管并显示对应的数字,从而实现了数码管一圈流水显示的效果。在主函数中使用循环来实现数码管的流水显示,每次循环显示4个数码管,然后再从头开始循环显示。
阅读全文