at89c51数码管动态显示0-9
时间: 2024-05-06 19:18:28 浏览: 103
编程实现在数码管上依次显示数字0-9
5星 · 资源好评率100%
下面是一个基于AT89C51单片机的数码管动态显示0-9的简单程序:
```
#include <reg51.h> // 引入AT89C51的寄存器定义
// 数码管段选信号定义
#define SEG_A P1_0
#define SEG_B P1_1
#define SEG_C P1_2
#define SEG_D P1_3
#define SEG_E P1_4
#define SEG_F P1_5
#define SEG_G P1_6
#define SEG_DP P1_7
// 数码管位选信号定义
#define DIGIT_1 P2_0
#define DIGIT_2 P2_1
#define DIGIT_3 P2_2
#define DIGIT_4 P2_3
// 数码管显示的数字
unsigned char digits[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 ms) { // 简单延时函数
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++);
}
}
void main() {
unsigned char i;
while (1) {
for (i = 0; i < 10; i++) { // 循环显示0-9
SEG_A = digits[i] & 0x01;
SEG_B = (digits[i] >> 1) & 0x01;
SEG_C = (digits[i] >> 2) & 0x01;
SEG_D = (digits[i] >> 3) & 0x01;
SEG_E = (digits[i] >> 4) & 0x01;
SEG_F = (digits[i] >> 5) & 0x01;
SEG_G = (digits[i] >> 6) & 0x01;
SEG_DP = (digits[i] >> 7) & 0x01;
DIGIT_1 = 1; // 显示第1位,其他位为0
DIGIT_2 = 0;
DIGIT_3 = 0;
DIGIT_4 = 0;
delay(10);
SEG_A = SEG_B = SEG_C = SEG_D = SEG_E = SEG_F = SEG_G = SEG_DP = 1;
DIGIT_1 = 0;
DIGIT_2 = 1; // 显示第2位,其他位为0
DIGIT_3 = 0;
DIGIT_4 = 0;
delay(10);
SEG_A = SEG_B = SEG_C = SEG_D = SEG_E = SEG_F = SEG_G = SEG_DP = 1;
DIGIT_1 = 0;
DIGIT_2 = 0;
DIGIT_3 = 1; // 显示第3位,其他位为0
DIGIT_4 = 0;
delay(10);
SEG_A = SEG_B = SEG_C = SEG_D = SEG_E = SEG_F = SEG_G = SEG_DP = 1;
DIGIT_1 = 0;
DIGIT_2 = 0;
DIGIT_3 = 0;
DIGIT_4 = 1; // 显示第4位,其他位为0
delay(10);
}
}
}
```
这个程序中使用了P1和P2端口来控制数码管的段选和位选信号,通过循环显示0-9来实现动态显示效果。在每次显示一个数字时,先将对应的段选信号设置为0,其他的段选信号设置为1,然后设置对应的位选信号为1,其他的位选信号设置为0,延时一段时间后再将所有的段选信号和位选信号都设置为1。重复这个过程来实现动态显示的效果。
阅读全文