用C语言写一个循环点亮AT89C51连接的P2,P0口八位一体数码管
时间: 2024-02-25 20:55:19 浏览: 88
用51控制数码管循环移动C程序
3星 · 编辑精心推荐
好的,以下是示例代码:
```c
#include <reg51.h>
// 数码管显示的数字对应的 P0 口输出值
unsigned char digit[10] = {
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
void delay(unsigned int t) {
while(t--);
}
void main() {
unsigned char cnt = 0; // 计数器,用于依次点亮每个数码管
unsigned char num = 0; // 要显示的数字
unsigned char digit_num = 0; // 数码管显示的位数,初始为个位数
while(1) {
// 显示数字
for(int i = 0; i < digit_num; i++) {
P0 = digit[num % 10]; // 取出个位数字并显示
P2 = 1 << cnt; // 点亮对应的数码管
delay(200); // 延时一段时间,使得数码管显示出来
P2 = 0x00; // 关闭所有数码管
num /= 10; // 将数字右移一位
cnt++; // 计数器加一
}
cnt = 0; // 计数器归零
// 判断是否需要增加位数
if(num > 0) {
digit_num++; // 位数加一
if(digit_num > 8) {
digit_num = 1; // 位数最多为 8 位,如果超过则从个位重新开始
}
}
// 数字加一
num++;
if(num >= 100000000) { // 如果超过了 8 位数,则从 0 开始
num = 0;
}
delay(2000); // 延时一段时间,使得数字的变化速度适中
}
}
```
上述代码使用了 89C51 单片机的寄存器编程,通过 P2 口控制八个数码管的点亮和关闭,使用一个循环依次点亮每个数码管,并在点亮后使用计数器将数字的每一位依次显示出来。在数字变化时,如果超过了 8 位数,则从 0 开始重新计数;如果需要增加位数,则从个位开始重新显示。为了使得数字的变化速度适中,加入了适当的延时。
阅读全文