arduino按键中断控制流水灯按键消抖
时间: 2023-06-13 17:03:28 浏览: 732
下面是一个Arduino控制流水灯并使用按键中断和消抖的示例代码:
```
const int buttonPin = 2; // 按键连接到数字引脚2
const int ledCount = 3; // 流水灯数量
int ledPins[] = {3, 4, 5}; // 流水灯连接到数字引脚3、4、5
volatile bool buttonState = LOW; // 按键状态(volatile变量用于多线程操作)
bool lastButtonState = LOW; // 上一次的按键状态
unsigned long lastDebounceTime = 0; // 上一次消抖时间
const unsigned long debounceDelay = 50; // 消抖时间
volatile bool interruptFlag = false; // 中断标志
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // 设定按键引脚为输入模式并开启上拉电阻
for(int i=0; i<ledCount; i++) {
pinMode(ledPins[i], OUTPUT); // 设定流水灯引脚为输出模式
}
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonInterrupt, FALLING); // 绑定按键中断函数
}
void loop() {
if(interruptFlag) { // 如果有中断发生
interruptFlag = false; // 重置中断标志
buttonState = digitalRead(buttonPin); // 读取按键状态
if(buttonState != lastButtonState) { // 如果按键状态发生改变
lastDebounceTime = millis(); // 记录消抖时间
lastButtonState = buttonState; // 更新上一次的按键状态
}
}
if(millis() - lastDebounceTime > debounceDelay) { // 如果消抖时间已过
if(buttonState == LOW) { // 如果按键被按下
for(int i=0; i<ledCount; i++) {
digitalWrite(ledPins[i], HIGH); // 点亮流水灯
delay(100); // 延时100毫秒
digitalWrite(ledPins[i], LOW); // 熄灭流水灯
}
}
}
}
void buttonInterrupt() {
interruptFlag = true; // 设置中断标志
}
```
代码中定义了一个按键引脚、三个流水灯引脚。按键中断函数`buttonInterrupt()`会在按键被按下时被调用,设置一个中断标志`interruptFlag`。在`loop()`函数中,如果有中断发生,就读取按键状态,并进行消抖处理。如果按键被按下,就点亮三个流水灯并进行延时和熄灭。代码中使用`delay()`函数进行延时,如果需要更高效的延时方法,可以使用`millis()`函数和时间戳进行计时。
阅读全文