在STM32中区分长按和短按,核心是记录按键按下到释放的时间差。推荐用定时器或系统节拍(如HAL_GetTick())实现非阻塞检测。
**基础思路**:
1. 在GPIO中断或轮询中检测下降沿(按下),记录时间戳t_press。
2. 检测上升沿(释放),计算t_release - t_press。
3. 若差值 > 阈值(如1000ms)判为长按,否则为短按。
**示例代码(轮询+状态机)**:
```c
uint32_t press_time = 0;
bool is_pressed = false;
void Key_Scan(void) {
if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET) {
if (!is_pressed) {
is_pressed = true;
press_time = HAL_GetTick();
}
} else {
if (is_pressed) {
is_pressed = false;
uint32_t duration = HAL_GetTick() - press_time;
if (duration > 1000) {
// 长按处理
} else {
// 短按处理
}
}
}
}
```
**实操建议**:
- 使用定时器中断(如1ms)定期调用Key_Scan,避免主循环阻塞。
- 增加消抖(延时10-20ms)防止误触发。
- 若需区分长按后释放还是长按持续,可增加状态机(按下、等待释放、长按触发)。
注意:长按阈值需根据应用调整,并考虑按键硬件特性(如机械抖动)。
mcuku 阿沐 · 2026-08-17