今天來分享一種按鍵的處理方法方式:MultiButton。
1.Multi_Button簡介
MultiButton 是Github上的一個開源的按鍵處理組件,作者0x1abin。
GIthub地址:https://github.com/0x1abin/MultiButton
MultiButton一個小巧簡單易用的事件驅(qū)動型按鍵驅(qū)動模塊,可無限量擴(kuò)展按鍵,按鍵事件的回調(diào)異步處理方式可以簡化你的程序結(jié)構(gòu),去除冗余的按鍵處理硬編碼,讓你的按鍵業(yè)務(wù)邏輯更清晰。
按鍵支持的事件包括:
2.Multi_Button的使用
模塊只有兩個文件multi_button.c和multi_button.h,使用時,將.c文件添加到工程中。這里以STM32為例。
2.1.包含頭文件#include“multi_button.h”
2.2.定義按鍵結(jié)構(gòu)體和按鍵ID,這里定義了2個按鍵:
Button button1;Button button2;
#define btn1_id
1#define btn2_id 2
2.3.編寫一個讀取按鍵GPIO電平的函數(shù):
uint8_t read_button_GPIO(uint8_t button_id){
// you can share the GPIO read function with multiple Buttons switch(button_id)
{
case btn1_id:
return HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin);
break;
case btn2_id:
return HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
break;
default:
return 0;
break;
}}
2.4.初始化按鍵對象:
button_init(&button1, read_button_GPIO, 0, btn1_id);button_init(&button2, read_button_GPIO, 0, btn2_id);
在button_init函數(shù)中:
第一個參數(shù)為2.2中定義的按鍵結(jié)構(gòu)體指針。
第二個參數(shù)為綁定的2.3中編寫的讀取按鍵GPIO電平的函數(shù)。
第三個參數(shù)為按鍵的有效電平,0代表低電平有效,1代表高電平有效。
第四個參數(shù)為按鍵ID。
2.5.綁定按鍵回調(diào)函數(shù):
button_attach(&button1, PRESS_DOWN,
BTN_PRESS_DOWN_Handler);button_attach(&button1, PRESS_UP,
BTN_PRESS_UP_Handler);button_attach(&button1, PRESS_REPEAT,
BTN_PRESS_REPEAT_Handler);button_attach(&button1,
SINGLE_CLICK,
BTN_SINGLE_Click_Handler);button_attach(&button1,
DOUBLE_CLICK,
BTN_DOUBLE_Click_Handler);button_attach(&button1,
LONG_PRESS_START,
BTN_LONG_PRESS_START_Handler);button_attach(&button1,
LONG_PRESS_HOLD,
BTN_LONG_PRESS_HOLD_Handler);
button_attach(&button2,
PRESS_DOWN,
BTN_PRESS_DOWN_Handler);button_attach(&button2,
PRESS_UP,
BTN_PRESS_UP_Handler);button_attach(&button2,
PRESS_REPEAT,
BTN_PRESS_REPEAT_Handler);button_attach(&button2,
SINGLE_CLICK,
BTN_SINGLE_Click_Handler);button_attach(&button2,
DOUBLE_CLICK,
BTN_DOUBLE_Click_Handler);button_attach(&button2,
LONG_PRESS_START,
BTN_LONG_PRESS_START_Handler);button_attach(&button2,
LONG_PRESS_HOLD,
BTN_LONG_PRESS_HOLD_Handler);
這里綁定了所有的按鍵功能,用戶可根據(jù)實際需求進(jìn)行刪減。不同的按鍵回調(diào)函數(shù)可以相同,以按鍵按下的回調(diào)函數(shù)為例,函數(shù)如下:
void BTN_PRESS_DOWN_Handler(void* btn){
Button *temp_button = (Button *)btn;
switch(temp_button-》button_id)
{
case btn1_id:
printf(“btn1 press down
”);
break;
case btn2_id:
printf(“btn2 press down
”);
break;
default:
break;
}}
2.6.調(diào)用啟動函數(shù):
button_start(&button1);button_start(&button2);
2.7.最后,需要在一個定時任務(wù)中循環(huán)調(diào)用按鍵掃描函數(shù):
void scan_key(){
if(key_tick 《 TICKS_INTERVAL)return;
key_tick = 0;
button_ticks();}
需要注意的是,按鍵的掃描周期、長按、短按、雙擊的時間定義可以在.h文件中修改:
//According to your need to modify the constants.#define TICKS_INTERVAL
10
//ms#define DEBOUNCE_TICKS
3
//MAX 8#define SHORT_TICKS
(300 /TICKS_INTERVAL)#define LONG_TICKS
(1000 /TICKS_INTERVAL)
最后來測試一下效果,按鍵的按下、彈起、單擊、雙擊、長按等都能被檢測到,用起來還是挺方便的。
這個開源按鍵模塊的源代碼只有200行左右,有興趣的朋友可以自己研究一下。
測試工程鏈接:
鏈接:https://pan.baidu.com/s/1e33eN0Sbc2Pz8VnNjShjfw
提取碼:ijqz
審核編輯 :李倩
-
冗余
+關(guān)注
關(guān)注
1文章
111瀏覽量
20252 -
組件
+關(guān)注
關(guān)注
1文章
514瀏覽量
17865 -
GitHub
+關(guān)注
關(guān)注
3文章
473瀏覽量
16503
原文標(biāo)題:開源按鍵組件Multi_Button的使用,含測試工程
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論