如何实现检测按下按键1后松开,再按下按键2,松开后再按下按键1,松开后再按下按键2,最后再长按按键1
时间: 2024-02-02 13:03:14 浏览: 105
key_短按_项目使用按键操作_长按_
你可以扩展上面提供的状态机来实现这个功能。在上面的状态机中,我们只考虑了按键1被按下和按键2被按下两种情况,现在我们需要考虑按键1和按键2的按下顺序和按下时间。具体实现如下:
```
const int button1 = 2; // 按键1连接到数字引脚2
const int button2 = 3; // 按键2连接到数字引脚3
const int longPressTime = 1000; // 长按时间,单位为毫秒
enum State { // 状态机的状态
WAITING_FOR_BUTTON_1,
WAITING_FOR_BUTTON_2_AFTER_BUTTON_1,
WAITING_FOR_BUTTON_1_AFTER_BUTTON_2,
WAITING_FOR_BUTTON_2_AFTER_BUTTON_1_AND_BUTTON_2,
BUTTONS_PRESSED,
BUTTON1_LONG_PRESSED
};
State currentState = WAITING_FOR_BUTTON_1; // 当前状态为等待按键1被按下
unsigned long button1PressedTime; // 按键1被按下的时间
unsigned long button2PressedTime; // 按键2被按下的时间
void setup() {
pinMode(button1, INPUT);
pinMode(button2, INPUT);
}
void loop() {
switch (currentState) {
case WAITING_FOR_BUTTON_1:
if (digitalRead(button1) == HIGH) { // 如果按键1被按下
button1PressedTime = millis(); // 记录按下时间
currentState = WAITING_FOR_BUTTON_2_AFTER_BUTTON_1; // 进入等待按键2被按下的状态
}
break;
case WAITING_FOR_BUTTON_2_AFTER_BUTTON_1:
if (digitalRead(button2) == HIGH) { // 如果按键2被按下
button2PressedTime = millis(); // 记录按下时间
currentState = WAITING_FOR_BUTTON_1_AFTER_BUTTON_2; // 进入等待按键1被按下的状态
} else if (digitalRead(button1) == LOW) { // 如果按键1被松开
currentState = WAITING_FOR_BUTTON_1; // 回到等待按键1被按下的状态
}
break;
case WAITING_FOR_BUTTON_1_AFTER_BUTTON_2:
if (digitalRead(button1) == HIGH) { // 如果按键1被按下
button1PressedTime = millis(); // 记录按下时间
currentState = WAITING_FOR_BUTTON_2_AFTER_BUTTON_1_AND_BUTTON_2; // 进入等待按键2被按下的状态
} else if (digitalRead(button2) == LOW) { // 如果按键2被松开
currentState = WAITING_FOR_BUTTON_2_AFTER_BUTTON_1; // 回到等待按键2被按下的状态
}
break;
case WAITING_FOR_BUTTON_2_AFTER_BUTTON_1_AND_BUTTON_2:
if (digitalRead(button2) == HIGH) { // 如果按键2被按下
button2PressedTime = millis(); // 记录按下时间
currentState = BUTTONS_PRESSED; // 进入按键1和按键2都被按下的状态
} else if (digitalRead(button1) == LOW) { // 如果按键1被松开
currentState = WAITING_FOR_BUTTON_1_AFTER_BUTTON_2; // 回到等待按键1被按下的状态
}
break;
case BUTTONS_PRESSED:
// 执行你想要的操作
if (digitalRead(button1) == LOW && digitalRead(button2) == LOW) { // 如果按键1和按键2都被松开
currentState = WAITING_FOR_BUTTON_1; // 回到等待按键1被按下的状态
} else if (digitalRead(button1) == HIGH && millis() - button1PressedTime > longPressTime) { // 如果按键1被长按
currentState = BUTTON1_LONG_PRESSED; // 进入按键1长按的状态
}
break;
case BUTTON1_LONG_PRESSED:
// 执行你想要的操作
if (digitalRead(button1) == LOW) { // 如果按键1被松开
currentState = WAITING_FOR_BUTTON_1; // 回到等待按键1被按下的状态
}
break;
}
}
```
在上面的代码中,我们定义了六个状态:等待按键1被按下、等待按键2被按下(在按键1被按下后)、等待按键1被按下(在按键2被按下后)、等待按键2被按下(在按键1和按键2都被按下后)、按键1和按键2都被按下、按键1长按。在循环中,我们使用switch语句根据当前状态来执行不同的代码。在每个状态中,我们检测按键的状态和按下的时间,如果符合条件,就转移到下一个状态。当按键1和按键2都被松开时,回到等待按键1被按下的状态。当按键1被长按时,进入按键1长按的状态。
阅读全文