# KeyEvent **Repository Path**: Lin_g/key-event ## Basic Information - **Project Name**: KeyEvent - **Description**: 用于小家电的触摸按键处理: 1: TouchKey 生成按键键值 2: KeyEvent 根据生成的按键键值来处理按键的长短按功能 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 7 - **Created**: 2021-12-25 - **Last Updated**: 2025-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TouchKey ## 简介 主要将 8bit , 16bit , 32bit , 64bit , 触摸按键信息, 转换成一个 8bit 的按键键值 ## API 从总线中读取按键 static uint8_t read_touch_key_from_bus(uint8_t SYS_RAM *pData) * 参数 `pData` : 将 8bit , 16bit , 32bit , 64bit (或是通过其他总线读取) 数据转换成字节数组 * 返回 `GET_TOUCH_KEY_SUCCESS` 或者 `GET_TOUCH_KEY_FAIL` 获取 按键1 和 按键2 和 按键按下数量 static uint8_t get_touch_key1_and_key2(const uint8_t SYS_RAM *pData, uint8_t SYS_RAM *key1, uint8_t SYS_RAM *key2) - 参数 pData: 按键数据(read_touch_key_from_bus 函数转换后的字节数组) key1: 按键1 key2: 按键2 - 返回 按键按下数量(超过3个按键时, 视为3个) 获取按键键值 uint8_t get_touch_key(uint8_t *pkeyValue, uint8_t *pkeyPower) - 参数 `pkeyValue`:按键键值 `pkeyPower`:电源按键状态键值(如果电源键按下时, 该变量等于电源键键值) - 返回 `GET_TOUCH_KEY_SUCCESS` 或者 `GET_TOUCH_KEY_FAIL` ## 按键键值 - KEY_VAL_NONE (0x00) 无键值, 没有按键按下 - KEY_VAL_INVALID (0xFF) 无效键值, 多个按键按下时, 无法组成组合键 - KEY_VAL_INVALID_WAIT_UP (0XFE) 等待组合键释放(滑条除外) - 键值小于0xA0 代表的是滑条的键值(0x10-0x1A ... 0x90-0x9a) - 键值大于等于0xA0, 小于0xFE 代表的是功能按键(可以在这里进行增加所需的功能按键键值) ## 使用 需要修改处(TouchKey.c): 1. TODO标签处: /* TODO 根据实际情况修改以下宏定义 */ 2. TODO标签处: /* TODO 根据实际情况修改映射表 */ 3. TODO标签处: /* TODO 通过总线读取按键的时候, 需要在这里实现总线读取 */ 如果是总线读取的话(如IIC), 需要在这里实现所需的总线读取按键通信处理 将读取到的按键转换成字节数组 修改完上述的情况, 周期性调用(推荐50ms) `uint8_t get_touch_key(uint8_t *pkeyValue, uint8_t *pkeyPower)` 来获取按键键值。 示例: `demo.c` 文件中的 `void SoftTime_Tick50ms(void)`函数(第44行到57行) # KeyEvent ## 简介 根据 `TouchKey`生成的按键键值, 来处理按键的长短按键功能 ## API 初始化(优先调用) void KeyEvent_Init(void) 创建短按按键 ShortKey_T *KeyEvent_CreateShort(void (*event_cb)(KeyEvent_E), uint8_t key_val) - 参数 `event_cb`:事件回调函数 `key_val`:当前需要创建的按键的按键键值 - 返回 短按按键句柄 创建长短按键 LongKey_T *KeyEvent_CreateLong(void (*event_cb)(KeyEvent_E), uint8_t key_val, uint16_t long_start, uint16_t long_hold) - 参数 `event_cb`:事件回调函数 `key_val`:当前需要创建的按键的按键键值 `long_start`: 长按开始时间(单位: ms) `long_hold`: 长按保持时间(单位: ms) - 返回 长短按键句柄 短按按键扫描(实现短按按键的功能) 可以发生的事件:`KEY_EVENT_DOWN` 和 `KEY_EVENT_UP` static void KeyEvent_ShortTick(uint8_t key_val) - 参数 `key_val`: 当前获取到的按键键值 长按按键扫描(实现长短按键的功能) 可以发生的事件:`KEY_EVENT_DOWN` 和 `KEY_EVENT_UP`和 `KEY_EVENT_LONG_START`和 `KEY_EVENT_LONG_HOLD`和 `KEY_EVENT_LONG_UP` static void KeyEvent_LongTick(uint8_t key_val) - 参数 `key_val`: 当前获取到的按键键值 按键扫描(内部调用短按按键扫描和长按按键扫描) void KeyEvent_Tick(uint8_t key_val) - 参数 `key_val`: 当前获取到的按键键值 ## 事件类型 - `KEY_EVENT_NONE` 无 - `KEY_EVENT_DOWN` 按下 - `KEY_EVENT_UP` 按下抬起(不触发长按才有) (如果按下期间触碰到另一个键后[键值已经为0xFF], 不会触发该事件) - `KEY_EVENT_LONG_START` 长按开始 - `KEY_EVENT_LONG_HOLD` 长按保持 - `KEY_EVENT_LONG_UP` 长按抬起 ## 使用 需要修改处(KeyEvent.h): 1. TODO标签处: /* TODO 根据实际情况修改 */ 2. 初始化`KeyEvent_Init` 3. 创建按键 'KeyEvent_CreateShort' 或`KeyEvent_CreateLong` 4. 周期性调用(推荐50ms)`KeyEvent_Tick` 示例: `demo.c`