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事件