Proteus 独立按键控制四位数码管程序
时间: 2023-08-10 22:02:16 浏览: 67
以下是基于 8051 单片机的 Proteus 独立按键控制四位数码管的程序示例:
```
#include <reg52.h>
// 数码管引脚定义
sbit DIG_A = P0^0;
sbit DIG_B = P0^1;
sbit DIG_C = P0^2;
sbit DIG_D = P0^3;
// 按键引脚定义
sbit KEY1 = P1^0;
sbit KEY2 = P1^1;
sbit KEY3 = P1^2;
sbit KEY4 = P1^3;
// 数码管显示表
unsigned char code DIG_TBL[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
// 全局变量
unsigned char cnt = 0; // 数码管当前显示的数字
unsigned char dig = 0; // 当前显示的数码管位数
// 延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 120; j++);
}
// 数码管显示函数
void display(unsigned char num) {
DIG_A = DIG_B = DIG_C = DIG_D = 1; // 关闭所有数码管
switch (dig) { // 根据当前位数选择要显示的数码管
case 0: DIG_A = 0; break;
case 1: DIG_B = 0; break;
case 2: DIG_C = 0; break;
case 3: DIG_D = 0; break;
}
P2 = DIG_TBL[num]; // 显示数字
}
// 中断函数
void key_isr() interrupt 0 {
delay(10); // 延时去抖动
if (KEY1 == 0) { // 按键 1
cnt++;
if (cnt > 9) cnt = 0;
} else if (KEY2 == 0) { // 按键 2
cnt--;
if (cnt > 9) cnt = 9;
} else if (KEY3 == 0) { // 按键 3
dig++; // 切换显示位数
if (dig > 3) dig = 0;
} else if (KEY4 == 0) { // 按键 4
dig--;
if (dig < 0) dig = 3;
}
}
// 主函数
void main() {
TMOD = 0x01; // 设置定时器 0 为模式 1
TH0 = 0x3c; // 定时器初值(1ms)
TL0 = 0xb0;
ET0 = 1; // 开启定时器 0 中断
EA = 1; // 开启全局中断
TR0 = 1; // 启动定时器 0
while (1) {
display(cnt); // 显示数码管
}
}
// 定时器 0 中断函数
void timer0_isr() interrupt 1 {
static unsigned char cnt2 = 0;
TH0 = 0x3c; // 重新设置定时器初值
TL0 = 0xb0;
cnt2++;
if (cnt2 > 20) { // 每 20ms 刷新一次数码管
cnt2 = 0;
dig++; // 切换显示位数
if (dig > 3) dig = 0;
}
}
```
该程序通过定时器中断和按键中断来实现独立按键控制四位数码管的功能,主函数中的 `while(1)` 循环不断调用 `display()` 函数来显示数码管,定时器中断每 20ms 刷新一次数码管的显示位数,按键中断则根据按键编号来增加或减少计数器的值,并切换显示位数。