嵌入式怎么处理按键的连击?

嵌入式 · 9 浏览
嵌入式怎么处理按键的连击?

回答(4)

如果MCU资源紧张,可以用定时器+GPIO中断,但中断里只置标志位,实际处理放主循环,避免嵌套中断。
硬件工程师老李 · 2026-08-20
注意区分物理按键和触摸按键,触摸的连击阈值要更短(100ms),而且要去除电容漂移,用滑动平均滤波。
嵌入式小周 · 2026-08-20
我一般用环形缓冲区记录按键事件,主循环里消费,这样连击和长按都能异步处理,不会卡死其他任务。
老码农阿强 · 2026-08-20
处理按键连击的核心是区分短按、长按和连击,并避免抖动干扰。推荐用状态机+定时器方案: 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