51单片机把每个数码管隔开显示代码
时间: 2024-03-16 15:46:55 浏览: 37
51单片机使用8个数码管,在8个数码管上分别显示“12345678”这八个数字。
5星 · 资源好评率100%
下面是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 DIG_INDEX = 0;
// 数码管位选信号控制函数
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;
}
// 定时器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]);
}
// 主函数
void main()
{
// 初始化定时器0
TMOD &= ~0x01;
TMOD |= 0x01;
TH0 = 0xfc;
TL0 = 0x18;
// 打开总中断和定时器0中断
EA = 1;
ET0 = 1;
// 启动定时器0
TR0 = 1;
// 循环等待
while (1);
}
```
以上代码通过使用定时器0中断来控制数码管的显示,每隔1ms切换一次数码管并显示对应的数字,从而实现了数码管隔开显示的效果。
阅读全文