.. _key-module: 按键 (Keys) ====================== 简介 ------------------------- SPV1x的按键API提供IO按键,AD按键和MATRIX按键(矩阵按键)功能。 通过在 `tick_handler_10ms()` 中调用 `key_scan()` ,按键API将以10ms的间隔扫描按键,并将符合要求的按键事件发送到消息队列。 按键事件对应的消息中,使用2个参数来表示具体的事件信息: `id` 字段表示哪一个按键, `val` 字段表示该按键的状态。按键状态在 `key.h` 中以枚举的形式提供,后续的内容将描述这些状态的产生时机。 .. c:enum:: key_status_t 按键的状态枚举定义。 - *Key_Status_None*:未使用。 - *Key_Status_Short*:按键短按。 - *Key_Status_Short_Up*:按键短按抬起。 - *Key_Status_Long*:按键长按。 - *Key_Status_Hold*:按键保持。 - *Key_Status_Long_Up*:按键长按抬起。 - *Key_Status_Double*:按键双击。 .. note:: 早期版本的按键API枚举类型使用的全大写,如 `KEY_STA_NONE` 、 `KEY_STA_SHORT` 。 在新版本的API中,枚举类型变量命名统一推荐为:单词首字母大小,单词之间用下划线分隔,意义明确的缩写单词可以保持为全大写。 按键API的全局配置 ------------------------- 在 `key.h` 中,有对按键API的全局配置。主要配置项如下: 1. 按键数量配置 .. code-block:: c #define KEY_NUM (16) //按键数量,0~255 系统支持的最大按键数量。根据实际需求进行配置,保证数量够用即可,数量越多,RAM和处理逻辑耗时越多。 2. 按键双击功能配置 (1). 双击功能使能配置 .. code-block:: c #define KEY_DOUBLE_CLICK_EN (1) //双击按键使能配置 双击功能会消耗额外的RAM,如果实际不会用到双击功能,请设置为关闭。 (2). 双击间隔时间配置 .. code-block:: c #define KEY_DOUBLE_CLICK_CNT (35) //双间隔时间,35*10ms 双击间隔。在第一次按键短按并松开后,如果第二次按键在 `KEY_DOUBLE_CLICK_CNT` 设定的时间内短按并松开,就会产生按键的双击事件 `Key_Status_Double` 。 3. 按键时间阈值配置 (1). 按键消抖时间配置 .. code-block:: c #define KEY_BASE_CNT (2) //按键基础滤波,2*10ms `KEY_BASE_CNT` 用于设定按键消抖时间。 (2). 按键短按时间配置 .. code-block:: c #define KEY_SHORT_CNT (3) //短按生效时间,3*10ms `KEY_SHORT_CNT` 用于设定按键短按生效时间。当按键的按下时间达到 `KEY_SHORT_CNT` 设定的时间时,将产生按键短按事件 `Key_Status_Short` 。 (3). 按键长按时间配置 .. code-block:: c #define KEY_LONG_CNT (75) //长按生效时间,75*10ms `KEY_LONG_CNT` 用于设定按键长按生效时间。当按键的按下时间达到 `KEY_LONG_CNT` 设定的时间时,将产生按键长按事件 `Key_Status_Long` 。 (4). 按键保持时间配置 .. code-block:: c #define KEY_HOLD_CNT (15) //保持生效时间,15*10ms `KEY_HOLD_CNT` 用于设定按键保持生效时间。当按键的按下时间达到 `(KEY_LONG_CNT+ KEY_HOLD_CNT)` 设定的时间后,按键保持就会激活,并发送按键保持事件 `Key_Status_Hold` ,此后,按键API将以 `KEY_HOLD_CNT` 设定的时间周期性发送按键保持事件。按键保持事件可用实现按键的连发(机打)功能。 .. note:: 当按键松开时,将会产生按键抬起事件,其具体情形如下: 1. 当按键抬起前,其按下时间小于 `KEY_SHORT_CNT` 设定的时间时,不会产生抬起事件。 2. 当按键抬起前,其按下时间大于等于 `KEY_SHORT_CNT` 设定的时间,但小于 `KEY_LONG_CNT` 设定的时间时,将产生短按抬起事件 `Key_Status_Short_Up` 。 3. 当按键抬起前,其按下时间大于等于 `KEY_LONG_CNT` 设定的时间,将产生长按抬起事件 `Key_Status_Long_Up` 。 4. 按键类型使能配置 .. code-block:: c #define KEY_IO_EN (1) ///