|
|
- /**
- * @brief 读取指定按键 GPIO 状态
- * @param button_id 按键 ID (0~BUTTON_NUM-1)
- * @return BUTTON_PRESSED / BUTTON_RELEASED
- * @note 用户根据实际硬件修改 KEY_* 宏或函数
- */
- static uint8_t read_button_gpio(uint8_t button_id)
- {
- switch (button_id) {
- case 0: return KEY_UPPER_IO; /* 上键 */
- case 1: return KEY_UNDER_IO; /* 下键 */
- case 2: return KEY_CONFIRM_IO; /* 确认键 */
- case 3: return KEY_RETURN_IO; /* 返回键 */
- default: return BUTTON_RELEASED; /* 默认释放状态 */
- }
- }
复制代码 以上部分绑定按键,返回状态则是按键按下与非按下状态
- /* =====================================================
- * 全局回调函数默认实现(弱定义)
- * 用户可以在应用层重写这些函数,实现全局按键播报等
- * 警告特别需要注意的是,此函数为回调程序,回调程序请不要使用delay_ms()程序,尽可能使用标志位
- * ===================================================== */
- __weak void Button_Single_Click_Callback(uint8_t button_id) {}
- __weak void Button_Double_Click_Callback(uint8_t button_id) {}
- __weak void Button_Long_Press_Callback(uint8_t button_id) {}
- __weak void Button_Multi_Click_Callback(uint8_t button_id, uint8_t click_count) {}
复制代码
你可以重新定义这些函数。
你唯一需要做的就是在一个定时器中循环调用
- void Button_Update_All(void)
复制代码 函数,其他的你都可以不用你管了,接下来就是怎么识别按键,实际上很简单
通过一个函数即可
- /* =====================================================
- * 获取指定按键事件
- * ===================================================== */
- /**
- * @brief 获取指定按键事件
- * @param button_id 按键 ID
- * @return ButtonEvent_t 当前事件
- * @note 读取后事件会被清零
- */
- ButtonEvent_t Button_Get_Event(uint8_t button_id)
复制代码 我们通过这个函数接口就可以获取到按键是什么状态了,按键的状态可以有
- /* =========================================================
- * 按键事件类型定义
- * ========================================================= */
- typedef enum {
- BUTTON_EVENT_NONE = 0, /* 无事件 */
- BUTTON_EVENT_SINGLE, /* 单击 */
- BUTTON_EVENT_DOUBLE, /* 双击 */
- BUTTON_EVENT_LONG, /* 长按 */
- BUTTON_EVENT_MULTI /* 多击(次数 > 2) */
- } ButtonEvent_t;
复制代码 例如我们使用按键单击
- if(Button_Get_Event(KEY_UNDER_IO)==BUTTON_EVENT_SINGLE)
- {
- }
复制代码 我们这里的:KEY_UNDER_ID就是在前面定义的按键ID,这个ID就是read_button_gpio中的哪一个按键,例如这里的是KEY_UNDER_ID=0
如果要想实现长按,那就将按键单击改成长按事件即可。
如果一个按键要想识别短按,长按,以及双击怎么办,实际上上也很简单,只需要使用:ButtonEvent_t定义一个按键状态标志就可以, 然后判断这个标志使用if()else if()结构进行嵌套判断即可
同时还通过一个按键按下次数识别程序
- /**
- * @brief 获取最近一次多击按下的次数
- * @param button_id 按键 ID(0 ~ BUTTON_NUM-1)
- * @return 多击次数(>2 才有效)
- * @note 仅在 BUTTON_EVENT_MULTI 后调用有效
- */
- uint8_t Button_Get_Click_Count(uint8_t button_id);
复制代码 可以在按键标志位:BUTTON_EVENT_MULTI后再进行一次按键按下次数识别
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|