Files
stc32g128k/Docs/50_module-breakdown/mod-key.md

1.7 KiB
Raw Blame History

模块拆分 - 按键扫描与事件判定 (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)

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 >= 300key_down_hold >= 300 达 3 秒时,注入 KEY_COMB_LONG 事件。
    • 检测到 key_sos_hold >= 500 达 5 秒时,注入 KEY_SOS_LONG 事件;若释放时未达 5 秒但大于 20ms注入 KEY_SOS_SHORT
    • 事件解析完毕后存入 key_event_buf