单片机按钮长按通用代码
时间: 2024-10-24 08:10:28 浏览: 33
基于STM32单片机实现一键长按
在单片机中,处理按钮长按事件的通用代码通常涉及以下几个步骤:初始化IO口、中断管理和定时器。这里以常见的Arduino Uno为例,使用外部中断的方式来实现:
```c++
#include <Keypad.h>
// 定义键盘矩阵和按键映射
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5}; // 接地端口
byte colPins[COLS] = {6, 7, 8, 9}; // 推挽端口
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
unsigned long long lastPressTime = 0; // 存储上一次按下时间
void setup() {
for (int i = 0; i < COLS; i++) {
pinMode(colPins[i], INPUT_PULLUP);
}
attachInterrupt(digitalPinToInterrupt(colPins[0]), buttonPressed, FALLING); // 按钮0下降沿触发
}
void loop() {
if (keypad.check()) { // 检查是否有键被按下
char key = keypad.getKey();
if (millis() - lastPressTime > 5000) { // 按下超过5秒视为长按
Serial.println("Button pressed and held!");
lastPressTime = millis(); // 更新上次按下时间
} else {
Serial.print("Button pressed: ");
Serial.print(key);
Serial.println();
}
}
}
void buttonPressed() {
lastPressTime = millis(); // 触发中断时更新时间
}
```
在这个例子中,我们首先创建了一个`Keypad`实例,然后在`setup()`函数中初始化IO口并设置中断。当按钮0按下并且释放时(FALLING边缘),会调用`buttonPressed`函数,此时检查当前是否满足长按条件。
阅读全文