51单片机编写六位数码管循环显示hello和21061
时间: 2023-06-13 20:02:09 浏览: 141
以下是基于51单片机的代码实现:
```c
#include <reg51.h>
// 数码管位选控制,低电平有效
sbit DIG1 = P2^2;
sbit DIG2 = P2^3;
sbit DIG3 = P2^4;
sbit DIG4 = P2^5;
sbit DIG5 = P2^6;
sbit DIG6 = P2^7;
// 数码管段选控制,高电平有效
sbit SEG_A = P1^0;
sbit SEG_B = P1^1;
sbit SEG_C = P1^2;
sbit SEG_D = P1^3;
sbit SEG_E = P1^4;
sbit SEG_F = P1^5;
sbit SEG_G = P1^6;
sbit SEG_DP = P1^7;
// 数码管段码表
unsigned char code SEG_TAB[] = {
// 0 ~ 9
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
// A ~ F
0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,
// 其他字符
0xbf, 0xff // H, L
};
void delay(unsigned int t) {
while (t--);
}
void main() {
unsigned char dig = 1; // 当前显示的数码管位
unsigned char cnt = 0; // 计数器,用于循环显示 hello 和 21061
while (1) {
// 数码管位选控制
DIG1 = dig == 1 ? 0 : 1;
DIG2 = dig == 2 ? 0 : 1;
DIG3 = dig == 3 ? 0 : 1;
DIG4 = dig == 4 ? 0 : 1;
DIG5 = dig == 5 ? 0 : 1;
DIG6 = dig == 6 ? 0 : 1;
// 数码管段选控制
if (dig == 1) {
P1 = SEG_TAB['H' - 'A'];
} else if (dig == 2) {
P1 = SEG_TAB['E' - 'A'];
} else if (dig == 3) {
P1 = SEG_TAB['L' - 'A'];
} else if (dig == 4) {
P1 = SEG_TAB['L' - 'A'];
} else if (dig == 5) {
P1 = SEG_TAB['O' - 'A'];
} else if (dig == 6) {
P1 = SEG_TAB[cnt % 10];
}
// 数码管位顺序
dig++;
if (dig > 6) {
dig = 1;
cnt++;
}
// 延时,控制数码管刷新频率
delay(500);
}
}
```
代码中使用了一个计数器 `cnt`,用于循环显示 hello 和 21061。当 `dig` 的值为 6 时,显示的是 `cnt % 10` 对应的数字。每次循环结束后,将 `cnt` 的值加 1,实现循环显示。由于使用了延时函数,控制数码管刷新频率,因此可以看到 hello 和 21061 在六个数码管之间不断循环显示。
阅读全文