AT89S51单片机外部中断引脚P3.3接按键S1,P1口接8个发光二极管,初始时,发光二极管D1亮,其他发光二极管灭;试用外部中断1编程实现,每按下一次按键,8个发光二极管循环下移。(D1亮-D2亮-...-D8亮-D1亮...)
时间: 2024-03-22 11:38:09 浏览: 66
好的,根据您的要求,我可以给您提供一个AT89S51单片机外部中断1的程序,实现按下按键S1时,8个发光二极管循环下移的功能。代码如下:
```c
#include <reg51.h>
#define LED P1
sbit KEY = P3^3;
void delay(unsigned int t) {
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 125; j++);
}
}
void main() {
unsigned char i = 0xFE;
LED = i;
IT0 = 1; // 外部中断1下降沿触发
EX0 = 1; // 开启外部中断1
EA = 1; // 开启总中断
while (1) {
// do nothing
}
}
void int0_isr() interrupt 0 {
unsigned char i = 0xFE;
delay(20); // 延时消抖
if (KEY == 0) {
i <<= 1;
if (i == 0xFF) {
i = 0xFE;
}
LED = i;
}
}
```
在这个程序中,我们使用了P1口的8个引脚来控制8个发光二极管的亮灭状态,使用P3.3口作为外部中断1的引脚,连接按键S1。程序中的`int0_isr()`函数为外部中断1的中断服务函数,当检测到按键S1被按下时,会执行该函数中的代码。
具体的实现逻辑如下:
1. 初始化LED变量为0xFE,即只有第一个发光二极管D1亮,其他发光二极管灭。
2. 开启外部中断1,并等待触发。
3. 当检测到按键S1被按下时,先进行20ms的延时消抖,然后判断按键是否被按下,如果按下则将LED变量左移一位,即将亮灯的位置向下移动一个,如果LED变量为0xFF,则说明已经到了最后一个发光二极管D8,此时将LED变量重新赋值为0xFE,从D1重新开始亮灯。
希望这个程序能够满足您的需求,如果有任何问题,请随时联系我。
阅读全文