51单片机上用中断程序用两个按键实现一个一个流水灯左右移动
时间: 2024-05-04 08:18:22 浏览: 101
好的,下面是一个简单的代码示例:
```c
#include <reg51.h>
#define LED P1
#define KEY_LEFT P3_3
#define KEY_RIGHT P3_2
unsigned char pattern = 0x01; // 初始流水灯模式
bit direction = 0; // 初始流水灯方向
void delay(unsigned int count) {
while (count--);
}
void left_isr(void) interrupt 0 {
delay(1000); // 延时去抖动
if (KEY_LEFT == 0) {
direction = 0; // 向左移
pattern <<= 1;
if (pattern == 0) {
pattern = 0x01;
}
}
}
void right_isr(void) interrupt 2 {
delay(1000); // 延时去抖动
if (KEY_RIGHT == 0) {
direction = 1; // 向右移
pattern >>= 1;
if (pattern == 0) {
pattern = 0x80;
}
}
}
void main() {
IT0 = 1; // INT0 下降沿触发中断
EX0 = 1; // 允许 INT0 中断
IT1 = 1; // INT1 下降沿触发中断
EX1 = 1; // 允许 INT1 中断
EA = 1; // 开启总中断
while (1) {
LED = pattern; // 更新流水灯
delay(10000); // 延时一段时间
if (direction) { // 向右移
pattern >>= 1;
if (pattern == 0) {
pattern = 0x80;
}
} else { // 向左移
pattern <<= 1;
if (pattern == 0) {
pattern = 0x01;
}
}
}
}
```
这个代码将 P1 端口作为流水灯输出口,P3_3 和 P3_2 端口作为左右移动按键的输入口。在中断服务函数中,通过判断按键的状态来控制流水灯的方向和模式。在主程序中,不断更新流水灯的模式,根据方向向左或向右移动,同时延时以控制流水灯的速度。请注意,这个示例中使用的是 8051 的中断机制,如果你使用的是其他的单片机,需要根据实际情况进行修改。
阅读全文