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

1.9 KiB
Raw Blame History

模块拆分 - 按键输入与事件产生 (Docs/50_module-breakdown/mod-key.md)

本模块描述物理按键输入引脚的检测、消抖、长短按事件封包,以及其作为事件产生者向事件队列投递的过程。

1. 模块职责说明

  • 职责范围
    1. 事件产生者 (Event Producer):物理按键 KEY_UP (P2.0), KEY_DOWN (P3.6), KEY_CONFIRM (P3.7), KEY_SOS (P2.3) 被按下触发低电平,按键模块负责将物理信号翻译为 KeyEvent 事件,并推送到事件队列中。
    2. 移位消抖:在 Timer1 10ms 中断分频中读取 IO 状态,连续 3 次检测一致则确认电平状态,滤波滤除物理抖动。
    3. 多事件防丢缓冲:维护一个深度为 4 级的环形事件队列。当主循环繁忙(例如正在处理复杂的 SPI 显示或 RF 编解码)时,后续到达的按键事件被压入队列保存,避免丢键。
    4. 长短按时序:确认键长按 3 秒产生 KEY_CONFIRM_LONG,▼ 键长按 2 秒产生 KEY_DOWN_LONGSOS 键按下即刻产生最高优先级的 KEY_SOS_ACTIVE 抢占求救事件。

2. 接口与函数说明

  • void Key_Init(void):将 Pin 19, 20, 21, 24 配置为高阻输入并开启内部上拉电阻 (P3PU |= 0xC0, P2PU |= 0x09)。
  • void Key_Scan_Process(void) 在 Timer1 的 10ms 定时周期中回调。
    • 读取 KEY_UP, KEY_DOWN, KEY_CONFIRM, KEY_SOS 引脚。
    • 累加按键维持计数器以判定长按与短按。
    • 将结果转换为 KeyEvent 传入事件队列。
  • bit Key_Push_Event(KeyEvent evt)将产生的事件压入事件环形队列Event Queue。若溢出返回 0。
  • KeyEvent Key_Pop_Event(void):主循环调用该接口,读出排队事件。若空返回 KEY_EVENT_NONE