基于AT89s52单片机的计数器,运用中断功能设计一个程序,单击按键使计数加一,单击另一个按键使计数减一,上限为99,并用数码管显示
时间: 2024-05-08 11:17:49 浏览: 202
以下是基于AT89s52单片机的计数器程序,使用中断功能设计:
```c
#include <REG52.h>
#define DIGIT P2 // 数码管控制端口
#define KEY1 P3_0 // 加1按键
#define KEY2 P3_1 // 减1按键
unsigned char code LED[10] = { // 数码管显示表
0xc0, // 0
0xf9, // 1
0xa4, // 2
0xb0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xf8, // 7
0x80, // 8
0x90 // 9
};
volatile unsigned char count = 0; // 计数器
void delay(unsigned int t) { // 延时函数
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 120; j++);
}
}
void display(unsigned char num) { // 数码管显示函数
DIGIT = 0xff; // 关闭数码管
if (num >= 10) { // 十位数
DIGIT = LED[num / 10];
delay(1);
}
DIGIT = 0xff; // 关闭数码管
DIGIT = LED[num % 10]; // 个位数
delay(1);
}
void key1_isr() interrupt 0 { // 加1按键中断函数
count++;
if (count > 99) {
count = 0;
}
display(count);
}
void key2_isr() interrupt 2 { // 减1按键中断函数
count--;
if (count > 99) {
count = 99;
}
display(count);
}
void main() {
KEY1 = 1; // 加1按键设置为输入
KEY2 = 1; // 减1按键设置为输入
IT0 = 1; // 加1按键设置为下降沿触发中断
IT1 = 1; // 减1按键设置为下降沿触发中断
EX0 = 1; // 打开加1按键中断
EX1 = 1; // 打开减1按键中断
EA = 1; // 打开总中断
display(count); // 初始化数码管显示
while (1); // 循环等待中断
}
```
程序中定义了一个计数器变量 `count`,并使用了两个按键 `KEY1` 和 `KEY2` 分别用于加一和减一操作。在中断函数中对计数器进行加一或减一操作,并进行上限和下限的判断。在主函数中设置按键和中断触发方式,并打开中断,然后调用数码管显示函数进行初始化显示,最后进入循环等待中断。
阅读全文