单片机两个外部中断控制灯左移右移代码
时间: 2024-11-15 12:04:48 浏览: 31
在单片机中,比如使用51系列的8051或更现代的MCU,我们通常会通过设置外部中断源,并配合GPIO口来控制灯的左右移动。这里假设你有一个外部中断 INT0 和 INT1 分别对应两个按键,当按下按键时触发中断,我们将灯左移或右移。
以下是一个基本的ATmega328P(Arduino Uno类似)为例的代码片段:
```c
#include <avr/io.h>
#include <util/delay.h>
// 定义GPIO口和中断标志
volatile bool left_key_down = false;
volatile bool right_key_down = false;
ISR(INT0_vect) {
if (left_key_down) { // 如果左键按下
// 将GPIO口D上的灯向左移一位(例如LED7 -> LED6)
DDRD &= ~(1 << PD6); // 驱低LED6
PORTD |= (1 << PD6); // 设置LED6高电平点亮
left_key_down = false; // 清除中断标志
}
}
ISR(INT1_vect) {
if (right_key_down) { // 如果右键按下
// 将GPIO口D上的灯向右移一位(例如LED7 -> LED7)
DDRD |= (1 << PD7); // 驱高LED7
PORTD &= ~(1 << PD7); // 设置LED7低电平熄灭
right_key_down = false; // 清除中断标志
}
}
void setup() {
sei(); // 开启全局中断
EIMSK |= (1 << INT0) | (1 << INT1); // 启用INT0和INT1中断
MCUCR |= (1 << ISC01); // 设置INT0为下降沿触发
MCUCR |= (1 << ISC10); // 设置INT1为下降沿触发
DDRD |= (1 << PD6) | (1 << PD7); // 初始化LED6和LED7为输出
}
void loop() {
_delay_ms(10); // 暂停一下,便于观察灯的变化
// 如果有按键持续按住,可能会导致无限循环,此处仅示例代码简化处理
if (left_key_down || right_key_down) continue;
// 检查其他操作...
}
// 主函数外部定义按键检测函数
void key_left(int led_num) {
left_key_down = true;
_delay_ms(500);
left_key_down = false;
}
void key_right(int led_num) {
right_key_down = true;
_delay_ms(500);
right_key_down = false;
}
```
在实际应用中,你需要配合硬件连接,将按键接到对应的中断引脚,以及确保按键按下后的延时足够长以便完成一次完整的操作。然后在`key_left()`和`key_right()`函数中分别模拟按键按下的过程。
阅读全文