[ 序 言 ]
按键是大多项目上都有的外设模块,分独立按键和ADC按键。本篇文章介绍的时实现的独立按键的驱动,优点在于能快速的搭建框架,减少工程师的工作量,加速产品落地,模块化的安装LiteButton。进而实现多功能的按键需求。
[ 开 源 仓 库 地 址 ]
Gitee:https://gitee.com/one-hundred-and-twenty-three11/lite-button
欢迎大家测试提出bug,可以私信我解bug。各位也可以提交代码上去,供大家一起学习、改进LiteButton。最新的代码也会同步到master分支上。
[ LiteButton 功 能 ]
1、实现按键的按下、抬起、单击、双击、长按开始、长按保持、长按抬起事件的触发,并利用回调函数解耦。
2、实现按键的添加,多个按键时,只要使用lite_button_add添加即可。
3、某个按键的移除,移除之后该按键不会触发任何事件。
4、按键扫描的可控化,lite_button_run和lite_button_stop实现按键的扫描控制,便于在不需要触发任何按键事件的时候调用。且停止后可以再次启用。
5、销毁按键列表,回收内存空间。按键用完之后可以彻底销毁按键列表。
6、实现按键的连击功能
[ LiteButton API 接 口 ]
extern void lite_button_config(bsp_button_config button_config, uint16_t button_num); extern void lite_button_add(Button *button, uint8_t active_level, read_gpio read_button, event_cb callback_fun); extern void lite_button_remove(Button *button); extern void lite_button_destroy(void); extern void lite_button_run(void); extern void lite_button_stop(void); extern void lite_button_scan(void);
[ LiteButton 测试代码 ]
#include <stdio.h> #include "LiteButton.h" Button Button0, Button1, Button2; void Button0_Callback(ButtonEvent event) { switch(event) { case BUTTON_DOWN : log_i("Button0 down.\r\n"); break; case BUTTON_UP : log_i("Button0 up.\r\n"); break; case BUTTON_PRESS_REPEAT : log_i("Button0 repeat.\r\n"); break; case BUTTON_SINGLE_CLICK : log_i("Button0 single click.\r\n"); break; case BUTTON_DOUBLE_CLICK : log_i("Button0 double click.\r\n"); break; case BUTTON_LONG_PRESS_START: log_i("Button0 long press start.\r\n"); break; case BUTTON_LONG_PRESS_HOLD : log_i("Button0 long press hold.\r\n"); break; case BUTTON_LONG_PRESS_UP : log_i("Button0 long press up.\r\n"); break; default: break; } } void Button1_Callback(ButtonEvent event) { ... } void Button2_Callback(ButtonEvent event) { ... } int main(void) { /* bsp_button_config:硬件层初始化按键GPIO的接口 3:共有几个独立按键 */ lite_button_config(bsp_button_config, 3); /* 添加独立按键 */ lite_button_add(&Button0, 0, read_but0_gpio, but0_cb); lite_button_add(&Button1, 0, read_but1_gpio, but1_cb); lite_button_add(&Button2, 0, read_but2_gpio, but2_cb); ..... /* 从按键列表中移除按键0,移除之后该按键无效 */ lite_button_remove(&Button0); /* 停止运行按键扫描,停止之后可使用lite_button_run再启用 */ lite_button_stop(); /* 运行按键扫描,默认lite button初始化就运行 */ lite_button_run(); /* 该函数调用后所有的按键都无法使用,且按键列表被摧毁让系统回收,重新使用只能重新lite_button_config再添加按键 */ lite_button_destroy(); for(;;) { /* 每隔5ms调用一次 */ if(!(ticks % 5)) lite_button_scan(); } return 0; }
测试代码中使用滴答定时器每隔5ms运行一次lite_button_scan函数,扫描按键列表中的所有按键。使用RTOS的可以在任务中直接调用处理,类似这样:
void KeyScan_Task(void *pvParameters) { Button button0; /* Button initialization */ lite_button_config(bsp_KeyConfig, 2); /* Add button */ lite_button_add(&button0, 0, bsp_ReadButton0, Button0_Callback); for(;;) { /* Key processing */ lite_button_scan(); vTaskDelay(SCAN_CYCLE); } }
SCAN_CYCLE是由LiteButton.h中提供的,默认是5ms。
[ 结 语 ]
文章至此就结束啦,项目代码在Gitee上拉取测试,拉代码的时候也记得顺带star下哦,也欢迎各位大佬提交优化代码,和我一起完善LiteButton吧,文章反馈不错的话就把ADC按键也集成进LiteButton中,配置可裁剪。
如果觉得本篇文章多少有点帮助的话,求赞、求关注、求评论、求转发,创作不易!你们的支持是小编创作最大的动力。