怎么选择丹徒网站建设,衣服搭配网站建设,模板网优酷,公司内部自己做抽奖网站在嵌入式系统开发中#xff0c;按键输入处理是一个常见且重要的环节。然而#xff0c;许多开发者在处理按键时#xff0c;往往会遇到按键消抖、组合按键、长按/短按等功能实现的复杂性。如何在保证系统高效运行的同时#xff0c;简化按键事件的处理呢#xff1f; 今天按键输入处理是一个常见且重要的环节。然而许多开发者在处理按键时往往会遇到按键消抖、组合按键、长按/短按等功能实现的复杂性。如何在保证系统高效运行的同时简化按键事件的处理呢 今天我们向大家介绍一个小巧而灵活的按键处理库——FlexibleButton。它基于标准 C 语言简单易用却具备强大的功能可以让你轻松实现按键事件的各种处理需求。
一、FlexibleButton的核心特性 单击、连击、短按、长按、自动消抖 FlexibleButton 支持多种常见的按键事件单击、连击、短按、长按甚至自动消抖机制。无论你的按键设计复杂还是简单它都能帮你高效处理。 灵活的按键组合 如果你的系统需要支持多个按键的组合FlexibleButton 提供了灵活的组合按键设置。用户可以自由配置按键组合并通过回调函数处理事件非常方便。 解耦硬件设计 FlexibleButton 的设计解耦了具体的按键硬件结构使得它可以支持各种类型的按键包括轻触按键和自锁按键。无论你采用什么硬件架构FlexibleButton 都能轻松适配。 按键数量的无限扩展 FlexibleButton 的架构支持按键数量的扩展理论上你可以根据需求无限增加按键数量而不需要担心性能下降或库的复杂性增加。 低功耗和中断支持 在低功耗和中断场景下FlexibleButton 也能发挥重要作用。它支持通过中断方式来处理按键事件保证系统在低功耗状态下也能高效工作。 简单的按键扫描 FlexibleButton 的按键扫描机制非常简洁仅需三行代码就能完成所有按键状态的读取。无论你使用的是哪种平台三行按键扫描算法都能让你迅速上手。
二、核心设计三行按键扫描
FlexibleButton 的高效性源于其简洁的设计三行按键扫描算法。这一设计使得按键状态的读取和事件处理变得异常简洁和高效。 for (int i 0; i BUTTON_COUNT; i) {button_state[i] read_button_state(i); // 读取当前按键状态if (button_state[i] ! previous_state[i]) {handle_button_event(i, button_state[i]); // 处理按键事件}
}
这三行代码简洁明了充分体现了FlexibleButton的高效性和简易性。通过这种扫描方式我们可以一次性读取所有按键的状态并通过回调机制处理每个按键的状态变化。
1确定用户按键 typedef enum
{USER_BUTTON_0 0, // 对应 IoT Board 开发板的 PIN_KEY0USER_BUTTON_1, // 对应 IoT Board 开发板的 PIN_KEY1USER_BUTTON_2, // 对应 IoT Board 开发板的 PIN_KEY2USER_BUTTON_3, // 对应 IoT Board 开发板的 PIN_WK_UPUSER_BUTTON_MAX
} user_button_t;static flex_button_t user_button[USER_BUTTON_MAX];
上述代码定义了 4 个按键数据结构存储在 user_button 数组中。
2程序入口 int flex_button_main(void)
{rt_thread_t tid RT_NULL;user_button_init();/* 创建按键扫描线程 flex_btn线程栈 1024 byte优先级 10 */tid rt_thread_create(flex_btn, button_scan, RT_NULL, 1024, 10, 10);if(tid ! RT_NULL){rt_thread_startup(tid);}return 0;
}
/* 使用 RT-Thread 的自动初始化 */
INIT_APP_EXPORT(flex_button_main);
如上代码所示首先使用user_button_init(); 初始化用户按键硬件该步骤将用户按键绑定到FlexibleButton 库。然后使用 RT-Thread 的 INIT_APP_EXPORT 接口导出为上电自动初始化创建了一个“flex_btn” 名字的按键扫描线程线程里扫描检查按键事件。
3按键初始化代码 user_button_init(); 初始化代码如下所示
static void user_button_init(void)
{int i;/* 初始化按键数据结构 */rt_memset(user_button[0], 0x0, sizeof(user_button));/* 初始化 IoT Board 按键引脚使用 rt-thread PIN 设备框架 */rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT_PULLUP); /* 设置 GPIO 为上拉输入模式 */rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT_PULLUP); /* 设置 GPIO 为上拉输入模式 */rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT_PULLUP); /* 设置 GPIO 为上拉输入模式 */rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT_PULLDOWN); /* 设置 GPIO 为下拉输入模式 */for (i 0; i USER_BUTTON_MAX; i ){user_button[i].id i;user_button[i].usr_button_read common_btn_read;user_button[i].cb common_btn_evt_cb;user_button[i].pressed_logic_level 0;user_button[i].short_press_start_tick FLEX_MS_TO_SCAN_CNT(1500);user_button[i].long_press_start_tick FLEX_MS_TO_SCAN_CNT(3000);user_button[i].long_hold_start_tick FLEX_MS_TO_SCAN_CNT(4500);if (i USER_BUTTON_3){user_button[USER_BUTTON_3].pressed_logic_level 1;}flex_button_register(user_button[i]);}
}
核心的配置如下 配置项 说明 id 按键编号 usr_button_read 设置按键读值回调函数 cb 设置按键事件回调函数 pressed_logic_level 设置按键按下时的逻辑电平 short_press_start_tick 短按起始 tick使用 FLEX_MS_TO_SCAN_CNT 宏转化为扫描次数 long_press_start_tick 长按起始 tick使用 FLEX_MS_TO_SCAN_CNT 宏转化为扫描次数 long_hold_start_tick 超长按起始 tick使用 FLEX_MS_TO_SCAN_CNT 宏转化为扫描次数
注意short_press_start_tick、long_press_start_tick 和 long_hold_start_tick 必须使用 FLEX_MS_TO_SCAN_CNT 将毫秒时间转化为扫描次数。
user_button[i].short_press_start_tick FLEX_MS_TO_SCAN_CNT(1500); 表示按键按下开始计时1500 ms 后按键依旧是按下状态的话就断定为短按开始。
4事件处理代码 static void common_btn_evt_cb(void *arg)
{flex_button_t *btn (flex_button_t *)arg;rt_kprintf(id: [%d - %s] event: [%d - %30s] repeat: %d\n, btn-id, enum_btn_id_string[btn-id],btn-event, enum_event_string[btn-event],btn-click_cnt);if (flex_button_event_read(user_button[USER_BUTTON_0]) flex_button_event_read(user_button[USER_BUTTON_1]) FLEX_BTN_PRESS_CLICK){rt_kprintf([combination]: button 0 and button 1\n);}
}
示例代码中将所有的按键事件回调均绑定到 common_btn_evt_cb 函数在该函数中打印了按键 ID 和按键事件以及按键连击次数并演示了如何使用组合按键。
三、适用场景
FlexibleButton 的适用场景非常广泛特别适合以下几类项目
低功耗嵌入式系统 通过中断和按键消抖机制能够在低功耗模式下高效工作。 复杂按键输入场景 支持组合按键、长按/短按等多种按键事件。 跨平台开发 基于标准 C 语言支持各种硬件平台和操作系统甚至是裸机系统。 实时按键响应需求 通过事件回调机制保证按键事件能够快速响应并处理。
四、为何选择FlexibleButton
小巧而高效 相较于其他按键处理库FlexibleButton 不仅小巧还具有极高的处理效率非常适合嵌入式系统中的资源受限场景。 易于集成 由于使用了标准 C 语言 APIFlexibleButton 可以无缝集成到各种处理器平台和操作系统中不需要额外的依赖。 可扩展性强 它的架构设计让你可以根据需求自由添加更多按键且不会增加过多的复杂度。 支持事件回调 灵活的事件回调机制可以让你更直观地处理各种按键事件增强系统的响应速度和可维护性。 无论是简单的按键控制还是复杂的多按键组合FlexibleButton 都能帮助你轻松应对。它的高效性、灵活性和易用性使得它在嵌入式开发中成为理想的按键处理方案。通过FlexibleButton你可以专注于业务逻辑的实现而不必为按键处理的复杂性烦恼。
立即尝试 FlexibleButton让你的按键输入处理更简单、更高效https://github.com/murphyzhao/FlexibleButton