89c51单片机用两个外部中断(按键),实现对一位LED数码管在0到9的之间的控制,可加可减,可循环。
时间: 2024-04-30 07:22:01 浏览: 186
好的,这里是一个基本的89C51单片机代码示例,可以通过两个外部中断控制一个数码管显示0到9之间的数字,通过按键实现增加或减少,并且可以循环显示。
```c
#include <reg51.h>
// 定义数码管控制端口和数码管显示表
sbit LED_CTRL = P1^0; // 数码管控制端口
unsigned char LED_DISPLAY[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
// 定义外部中断标志位和计数值
unsigned char flag = 0; // 标志位,判断外部中断是否触发
unsigned char count = 0; // 计数值,用于数码管显示
// 外部中断0 ISR
void EX0_ISR() interrupt 0 {
flag = 1;
}
// 外部中断1 ISR
void EX1_ISR() interrupt 2 {
flag = 2;
}
// 数码管显示函数
void display(unsigned char num) {
LED_CTRL = 0; // 共阳极数码管控制端口置低,使数码管选中
P0 = LED_DISPLAY[num]; // 显示数字
LED_CTRL = 1; // 关闭数码管
}
void main() {
EA = 1; // 开启全局中断
EX0 = 1; // 开启外部中断0
EX1 = 1; // 开启外部中断1
IT0 = 1; // 外部中断0触发方式设为下降沿触发
IT1 = 1; // 外部中断1触发方式设为下降沿触发
while(1) {
if(flag == 1) { // 外部中断0触发
count++; // 计数值加1
if(count > 9) count = 0; // 计数值循环显示
display(count); // 显示计数值
flag = 0; // 标志位清零
}
if(flag == 2) { // 外部中断1触发
count--; // 计数值减1
if(count < 0) count = 9; // 计数值循环显示
display(count); // 显示计数值
flag = 0; // 标志位清零
}
}
}
```
在这个示例代码中,我们使用P1.0作为数码管的控制端口,通过数组LED_DISPLAY来存储0到9的数字在数码管上的显示方式,使用两个外部中断(EX0和EX1)来控制数码管的显示,并且使用flag变量作为标志位来判断是哪个外部中断触发。在while循环中,我们根据flag的值来增加或减少计数值count,并且根据计数值来显示相应的数字。当计数值超过9或小于0时,我们将其重置为0或9,从而实现循环显示的效果。
阅读全文