基于89c52单片机,运用中断,实现按一个按键每按一次加一,按另一个按键每按一次减一,下限为0,上限为99,使用数码管显示
时间: 2024-05-03 09:19:57 浏览: 117
以下是基于89c52单片机的按键加减计数器代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key_add = P1^0; // 按键加1
sbit key_sub = P1^1; // 按键减1
sbit dula = P2^6; // 数码管段选1
sbit wela = P2^7; // 数码管位选
uchar code table[] = { // 数码管显示0~9的编码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar cnt = 0; // 计数器
void delay(uint t) { // 延时函数
uint i, j;
for (i = t; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(uchar num) { // 数码管显示函数
dula = 1; // 显示段选1
P0 = table[num / 10]; // 显示十位
delay(1);
dula = 0; // 关闭段选1
P0 = 0xff; // 全部关闭
delay(1);
dula = 1; // 显示段选1
P0 = table[num % 10]; // 显示个位
delay(1);
dula = 0; // 关闭段选1
P0 = 0xff; // 全部关闭
delay(1);
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 定时器0初值
TL0 = 0x18;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
while (1) {
display(cnt); // 显示计数器
if (key_add == 0) { // 按键加1被按下
delay(10); // 延时去抖
if (key_add == 0) { // 确认按键被按下
while (!key_add); // 等待按键释放
cnt++; // 计数器加1
if (cnt > 99) { // 上限为99
cnt = 99;
}
}
}
if (key_sub == 0) { // 按键减1被按下
delay(10); // 延时去抖
if (key_sub == 0) { // 确认按键被按下
while (!key_sub); // 等待按键释放
cnt--; // 计数器减1
if (cnt < 0) { // 下限为0
cnt = 0;
}
}
}
}
}
void timer0() interrupt 1 { // 定时器0中断服务函数
static uchar i = 0;
TH0 = 0xfc; // 重新赋初值
TL0 = 0x18;
i++;
if (i == 50) { // 50次中断为1秒
i = 0;
}
}
```
其中,定时器0中断每秒触发50次,计数器的值在按键加减的时候进行调整,最后通过数码管显示出来。
阅读全文