# 模块拆分 - 按键扫描与事件判定 (docs/50_module-breakdown/mod-key.md) 本模块描述按键状态消抖、长按计时判定以及组合按键识别。 ## 1. 模块职责说明 * **职责范围**: 1. 在 1ms 定时器中断中建立 10ms 扫描计时周期。 2. 对三个物理按键(KEY_UP SW1, KEY_SOS SW3, KEY_DOWN SW2)进行状态扫描。 3. 实现消抖检测(连续 20ms 检测到电平稳定才认定按键动作)。 4. 对按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)。 5. 将按键判定结果转换为 `KeyEvent` 枚举,并注入按键事件缓冲区 `key_event_buf` 供主循环异步读取。 ## 2. 数据结构定义 ### 按键事件枚举 (KeyEvent) ```c typedef enum { KEY_EVENT_NONE, KEY_UP_SHORT, KEY_UP_LONG, KEY_DOWN_SHORT, KEY_DOWN_LONG, KEY_SOS_SHORT, KEY_SOS_LONG, KEY_COMB_LONG // ▲ + ▼ 组合长按事件 } KeyEvent; ``` ## 3. 接口与函数说明 * `void Key_Scan_Process(void)`: 在 Timer 1 ISR 中每 10ms 调度一次。 * 读取 `KEY_UP`, `KEY_DOWN`, `KEY_SOS` 的 GPIO 逻辑电平。 * 如果发现按键电平状态改变,进行计数消抖。 * 如果按住不放,累加计时计数器(`key_up_hold`, `key_down_hold`, `key_sos_hold`)。 * 检测到 `key_up_hold >= 300` 且 `key_down_hold >= 300` 达 3 秒时,注入 `KEY_COMB_LONG` 事件。 * 检测到 `key_sos_hold >= 500` 达 5 秒时,注入 `KEY_SOS_LONG` 事件;若释放时未达 5 秒但大于 20ms,注入 `KEY_SOS_SHORT`。 * 事件解析完毕后存入 `key_event_buf`。