XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX 作 者:ZHS(文化人)
XX 联系方式:文章末尾Chat快问
XX 版权声明:原创文章,欢迎评论和转载~转载时能告诉我一声就最好了
XX 要说的话:作者水平有限,难免有不足之处,恳请指正!
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
写在前面:nordic平台的BSP写的还是比较经典,值得搞明白然后加以利用~
1、buttons_leds_init(&erase_bonds); //按键函数初始化
static void buttons_leds_init(bool * p_erase_bonds)
{
bsp_event_t startup_event;
//按键和灯初始化函数,APP_TIMER_TICKS(100, APP_TIMER_PRESCALER):消抖时间 bsp_event_handler:回调函数
uint32_t err_code = bsp_init(BSP_INIT_LED | BSP_INIT_BUTTONS,
APP_TIMER_TICKS(100, APP_TIMER_PRESCALER),
bsp_event_handler);
APP_ERROR_CHECK(err_code);
err_code = bsp_btn_ble_init(NULL, &startup_event);
APP_ERROR_CHECK(err_code);
*p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
}
2、bsp_init()
m_registered_callback= bsp_event_handler()
3、bsp_event_to_button_action_assign()事件分配函数
把BSP事件分配给每个按键的每一种操作;
app_button_init()
gpiote_event_handler()
detection_delay_timeout_handler()
4、长按
button_timer_handler()长按的handler
bsp_button_event_handler()事件获取以及调用callback
根据对按键的操作,获取不同的BSP事件,然后调用回调函数,就是bsp_event_handler()
5、如何实现注册多个事件:
1)首先去掉分配函数里的限制条件;
这里直接改成了:event = (bsp_event)(BSP_EVENT_KEY_0 +button);
2)分别分配事件;
我是直接分配了三个:
err_code = bsp_event_to_button_action_assign(num, BSP_BUTTON_ACTION_PUSH, BSP_EVENT_DEFAULT);
err_code = bsp_event_to_button_action_assign(num, BSP_BUTTON_ACTION_LONG_PUSH, BSP_EVENT_DEFAULT);
err_code = bsp_event_to_button_action_assign(num, BSP_BUTTON_ACTION_RELEASE, BSP_EVENT_DEFAULT);
3)回调函数中处理:添加自己的处理
原始代码里只要分配了事件,已经可以实现短按、短按抬起、长按的检测,如果想检测长按抬起,需要添加几行代码,
4)这里可以修改长按的时间
总结:
1、短按/释放
去掉限制条件,分别分配push和release事件
2、长按/释放
去掉限制条件,分别分配long和release事件
3、短按/长按/释放
去掉限制条件,分别分配push、long和release事件