直接移植,避免重复造车,这个很赞,用到每多产品中。
https://github.com/0x1abin/MultiButton
简介
MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。
1.main()主函数在直接创建个任务
xTaskCreate(MultiButton_poll_Task, (char*)"MultiButton_poll_Task", 512, NULL, 14, NULL);//任务优先级数值越小,优先级越低
2.任务中定义一个按键struct Button btn1,
3.初始化IO及按键模块
5.创建一个软定时器,5ms扫描一次。
6.注册事件(本例程使用回调方式)(不使用轮询方式)
void MultiButton_poll_Task(void *pvParam)
{
bl_gpio_enable_input(8, 0, 1);//
button_init(&btn1, read_button_GPIO, 1, btn1_id);
button_start(&btn1);
//make the timer invoking the button_ticks() interval 5ms.
ButtonTimers = xTimerCreate("ButtonTimers",5/portTICK_PERIOD_MS,pdTRUE,( void * ) 0,vButtonTimersCallback);//pvTimerID: 软件定时器 ID,数字形式。该 ID 典型的用法是当一个回调函数分配给一个或者多个软件定时器时,在回调函数里面根据 ID 号来处理不同的软件定时器;可以用来标记定时器,表示自己是什么定时器;可以用来保存参数,给回调函数使用
xTimerStart(ButtonTimers,portMAX_DELAY);
button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_CLICK_Handler);
button_attach(&btn1, DOUBLE_CLICK, BTN1_DOUBLE_CLICK_Handler);
button_attach(&btn1, LONG_PRESS_HOLD, BTN1_LONG_PRESS_HOLD_Handler);
button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler);
vTaskDelete(NULL);
while(1)
{
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
} 需要特别注意
原理图中NC原来是没焊,晕了一会才发现。
bl_gpio_enable_input(8, 0, 1);//
GPIO8 作为 Bootstrap, 上电瞬间为高电平时,模组进入烧录模式;上电瞬间为低电平时,模组正常启动。
所以要内部拉低,按下按键时拉高
button_init(&btn1, read_button_GPIO, 1, btn1_id);
初始按键模块高电平有效。
回调主打印出,还没做实际用
static TimerHandle_t ButtonTimers;
static void vButtonTimersCallback(TimerHandle_t xTimer)
{
button_ticks();
}
void BTN1_SINGLE_CLICK_Handler(void* btn)
{
blog_info_user(MultiButton,"BTN1_SINGLE_CLICK_Handler");
}
void BTN1_DOUBLE_CLICK_Handler(void* btn)
{
blog_info_user(MultiButton,"BTN1_DOUBLE_CLICK_Handler");
}
void BTN1_LONG_PRESS_HOLD_Handler(void* btn)
{
blog_info_user(MultiButton,"BTN1_LONG_PRESS_HOLD_Handler");
}
void BTN1_PRESS_UP_Handler(void* btn)
{
blog_info_user(MultiButton,"BTN1_PRESS_UP_Handler");
}
原代码
|