处理按键连击的核心是区分短按、长按和连击,并避免抖动干扰。推荐用状态机+定时器方案:
1. **去抖**:用10-20ms定时扫描,仅在电平稳定后更新状态。
2. **状态机**:定义IDLE、PRESSED、REPEAT、LONG_PRESS等状态。例如:
```c
enum {IDLE, PRESSED, REPEAT, LONG} state;
uint16_t press_cnt; // 连击次数
uint32_t press_time;
void key_scan(void) {
static uint8_t last_level = 1;
uint8_t level = read_key();
if (level != last_level) { delay(10); level = read_key(); } // 去抖
switch(state) {
case IDLE: if(level==0){state=PRESSED; press_time=now(); press_cnt=1;} break;
case PRESSED: if(level==1){state=IDLE; /* 短按事件 */}
else if(now()-press_time>500){state=LONG; /* 长按事件 */} break;
case REPEAT: if(level==1){state=IDLE; press_cnt++;} break;
}
}
```
3. **连击判定**:在短按释放时,若两次按下间隔<300ms,则视为连击,累加计数并触发对应回调。
实操建议:用定时器中断(如1ms)扫描,避免阻塞主循环;连击阈值(如300ms)需根据按键手感调整;建议将按键逻辑封装成独立模块,便于复用。
mcuku 阿沐 · 2026-08-20