key_board介紹
key_board用于單片機中的小巧多功能按鍵支持,軟件采用了分層的思想,并且做到了與平臺無關,用戶只需要提供按鍵的基本信息和讀寫io電平的函數即可,非常方便移植,同時支持多個矩陣鍵盤及多個單io控制鍵盤。
目前已實現按下觸發、彈起觸發、長按自動觸發、長按彈起觸發、多擊觸發、連續觸發等功能,并且能夠隨意組合(支持狀態的同一時間軸和非同一時間軸),后續還會添加更多的功能。
使用說明
1、初始化相關的硬件資源。
2、提供一個1ms的定時器,用于周期性的調用'key_check'函數。
3、提供按鍵的描述及讀寫io的函數。
4、將鍵盤注冊到系統。
5、具體的操作參考提供的stm32例程。
6、因為程序默認使用了堆內存,當發現程序運行結果不正常時,嘗試增大你的程序堆空間,或者注冊調試接口查看原因。
7、更詳細的使用教程見詳細使用說明或者提供的stm32例程。
已支持的鍵盤
1、矩陣鍵盤
矩陣鍵盤
2、單io按鍵
單io按鍵
詳細使用說明
將key_board.c,key_board.h,key_board_config.h放進key_board文件夾中并包含進你的工程,添加頭文件路徑。
基礎功能移植(以stm32矩陣鍵盤為例)
首先需要一個可使用的定時器(如果不想使用定時器也可直接放到主循環中,但不推薦,會導致時基不準確),固定為1ms觸發一次;
準備待檢測的按鍵的基本信息,可參考key_board_sample.c文件中的struct key_pin_t結構體,如:
structkey_pin_t{ GPIO_TypeDef*port;//按鍵端口號 uint16_tpin;//按鍵的引腳號 GPIO_PinStatevalid;//按鍵的有效電平(即按鍵按下時的電平) GPIO_PinStateinvalid;//按鍵的無效電平(即按鍵空閑時的電平) /* 可添加你的其它參數 */ };
定義待檢測的按鍵信息,可參考key_board_sample.c文件中的const struct key_pin_t key_pin_sig[]結構體數組,對應頭文件為key_board_sample.h,如:
//全局變量 conststructkey_pin_tkey_pin_sig[]={ { .port=KEY_PORT_J12, .pin=KEY_PIN_J12, .valid=KEY_PRESS_LEVEL_J12, .invalid=KEY_RELEASE_LEVEL_J12 }, { .port=KEY_PORT_J34, .pin=KEY_PIN_J34, .valid=KEY_PRESS_LEVEL_J34, .invalid=KEY_RELEASE_LEVEL_J34 }, { .port=KEY_PORT_J56, .pin=KEY_PIN_J56, .valid=KEY_PRESS_LEVEL_J56, .invalid=KEY_RELEASE_LEVEL_J56 }, };
如果為矩陣鍵盤還需要定義控制io的相關信息,可參考key_board_sample.c文件中的const struct key_pin_t key_pin_ctrl[]結構體數組,對應頭文件為key_board_sample.h,如:
conststructkey_pin_tkey_pin_ctrl[]={ { .port=KEY_PORT_J135, .pin=KEY_PIN_J135, .valid=KEY_CTL_LINE_ENABLE, .invalid=KEY_CTL_LINE_DISABLE }, { .port=KEY_PORT_J246, .pin=KEY_PIN_J246, .valid=KEY_CTL_LINE_ENABLE, .invalid=KEY_CTL_LINE_DISABLE }, };
實現按鍵io的電平讀取函數,可參考key_board_sample.c文件中的pin_level_get函數,如:
staticinlineboolpin_level_get(constvoid*desc) { structkey_pin_t*pdesc; pdesc=(structkey_pin_t*)desc; returnHAL_GPIO_ReadPin(pdesc->port,pdesc->pin)==pdesc->valid; }
如果為矩陣鍵盤還需要實現按鍵io的電平寫入函數,可參考key_board_sample.c文件中的pin_level_set函數,如:
staticinlinevoidpin_level_set(constvoid*desc,boolflag) { structkey_pin_t*pdesc; pdesc=(structkey_pin_t*)desc; HAL_GPIO_WritePin(pdesc->port,pdesc->pin,flag?pdesc->valid:pdesc->invalid); }
定義按鍵的id及功能結構體struct key_public_sig_t,可參考key_board_sample.c文件中的const struct key_public_sig_t key_public_sig[]結構體數組,對應頭文件key_board.h,如:
conststructkey_public_sig_tkey_public_sig[]={ KEY_PUBLIC_SIG_DEF(KEY_UP, key_pin_sig[0],pin_level_get,KEY_FLAG_NONE), KEY_PUBLIC_SIG_DEF(KEY_LEFT, key_pin_sig[1],pin_level_get,KEY_FLAG_NONE), KEY_PUBLIC_SIG_DEF(KEY_DOWN, key_pin_sig[2],pin_level_get,KEY_FLAG_NONE), //下面的是因為使用的矩陣鍵盤而擴展出來的三個按鍵 KEY_PUBLIC_SIG_DEF(KEY_ENTER, key_pin_sig[0],pin_level_get,KEY_FLAG_NONE), KEY_PUBLIC_SIG_DEF(KEY_RIGHT, key_pin_sig[1],pin_level_get,KEY_FLAG_NONE), KEY_PUBLIC_SIG_DEF(KEY_EXIT, key_pin_sig[2],pin_level_get,KEY_FLAG_NONE), };
如果為矩陣鍵盤還需要定義控制io的id及功能結構體struct key_public_ctrl_t,可參考key_board_sample.c文件中的const struct key_public_ctrl_t key_public_ctrl[]結構體數組,對應頭文件key_board.h,如:
conststructkey_public_ctrl_tkey_public_ctrl[]={ KEY_PUBLIC_CTRL_DEF( key_pin_ctrl[0],pin_level_set), KEY_PUBLIC_CTRL_DEF( key_pin_ctrl[1],pin_level_set), };
初始化鍵盤,可參考key_board_sample.c文件中的GPIO_Key_Board_Init函數,如:
voidGPIO_Key_Board_Init(void) { //硬件io的初始化 GPIO_InitTypeDefGPIO_InitStruct; unsignedinti; RCC_KEY_BOARD_CLK_ENABLE(); GPIO_InitStruct.Pull=GPIO_PULLUP; GPIO_InitStruct.Mode=GPIO_MODE_INPUT; for(i=0;i
主流程偽代碼框架,更多例子參考main_test.c文件:
intmain(void) { //初始化硬件io,并注冊鍵盤 GPIO_Key_Board_Init(); //初始化定時器,用于按鍵掃描(1ms) init_tmr(); for(;;) { if(key_check_state(KEY_UP,KEY_RELEASE)) { PRINTF("KEY_UPKEY_RELEASErn"); } if(key_check_state(KEY_UP,KEY_PRESS)) { PRINTF("KEY_UPKEY_PRESSrn"); } } } //定時器到期回調處理函數 voidtmr_irq_callback(void) { //調用按鍵掃描核心函數 key_check(); }
擴展功能長按的使用
首先確保key_board_config.h文件中宏KEY_LONG_SUPPORT已處于使能狀態,并且正確設置了宏KEY_DEFAULT_LONG_TRRIGER_TIME的值;
設置按鍵功能需要對長按進行檢測,如:
KEY_PUBLIC_SIG_DEF(KEY_UP, key_pin_sig[0],pin_level_get,KEY_FLAG_PRESS_LONG|KEY_FLAG_RELEASE_LONG)
使用例程:
if(key_check_state(KEY_UP,KEY_PRESS_LONG)) { PRINTF("KEY_UPKEY_PRESS_LONGrn"); } if(key_check_state(KEY_UP,KEY_RELEASE_LONG)) { PRINTF("KEY_UPKEY_RELEASE_LONGrn"); }
擴展功能連按的使用
首先確保key_board_config.h文件中宏KEY_CONTINUOUS_SUPPORT已處于使能狀態,并且正確設置了宏KEY_DEFAULT_CONTINUOUS_INIT_TRRIGER_TIME和KEY_DEFAULT_CONTINUOUS_PERIOD_TRRIGER_TIME的值;
設置按鍵功能需要對連按進行檢測,如:
KEY_PUBLIC_SIG_DEF(KEY_UP, key_pin_sig[0],pin_level_get,KEY_FLAG_PRESS_CONTINUOUS)
使用例程:
if(key_check_state(KEY_UP,KEY_PRESS_CONTINUOUS)) { PRINTF("KEY_UPKEY_PRESS_CONTINUOUSrn"); }
擴展功能多擊的使用
首先確保key_board_config.h文件中宏KEY_MULTI_SUPPORT已處于使能狀態,并且正確設置了宏KEY_DEFAULT_MULTI_INTERVAL_TIME的值;
設置按鍵功能需要多擊進行檢測,如:
KEY_PUBLIC_SIG_DEF(KEY_UP, key_pin_sig[0],pin_level_get,KEY_FLAG_PRESS_MULTI|KEY_FLAG_RELEASE_MULTI)
使用例程:
unsignedintres; res=key_check_state(KEY_UP,KEY_PRESS_MULTI); if(res) { PRINTF("KEY_UPKEY_PRESS_MULTI:%drn",res); } res=key_check_state(KEY_UP,KEY_RELEASE_MULTI); if(res) { PRINTF("KEY_UPKEY_RELEASE_MULTI:%drn",res); }
擴展功能組合狀態(同一時間軸)
感謝網友:石玉虎[@shi-yuhu]的反饋,已更正之前錯誤的使用案例。
使用例程:
unsignedintkey_down_release_long,key_up_release_long; key_down_release_long=key_check_state(KEY_DOWN,KEY_RELEASE_LONG); key_up_release_long=key_check_state(KEY_UP,KEY_RELEASE_LONG); if(key_down_release_long key_up_release_long) { PRINTF("KEY_DOWNKEY_RELEASE_LONG KEY_UPKEY_RELEASE_LONGn"); }
擴展功能組合狀態(非同一時間軸)
首先確保key_board_config.h文件中宏KEY_COMBINE_SUPPORT已處于使能狀態,并且正確設置了宏KEY_DEFAULT_COMBINE_INTERVAL_TIME的值;
使用例程:
//用于保存注冊后的組合狀態id staticunsignedinttest_id1,test_id2; //定義要檢測的狀態 conststructkey_combine_ttest_combine1[]={ {.id=KEY_UP,.state=KEY_PRESS}, {.id=KEY_DOWN,.state=KEY_PRESS_LONG}, {.id=KEY_UP,.state=KEY_PRESS}, }; //注冊組合狀態 test_id1=key_combine_register(test_combine1,ARRAY_SIZE(test_combine1)); conststructkey_combine_ttest_combine2[]={ {.id=KEY_UP,.state=KEY_PRESS}, {.id=KEY_DOWN,.state=KEY_PRESS}, {.id=KEY_UP,.state=KEY_PRESS}, {.id=KEY_DOWN,.state=KEY_PRESS}, }; test_id2=key_combine_register(test_combine2,ARRAY_SIZE(test_combine2)); if(key_check_combine_state(test_id1)) { PRINTF("combinetest_id1rn"); } if(key_check_combine_state(test_id2)) { PRINTF("combinetest_id2rn"); }
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
單片機
+關注
關注
6060文章
44833瀏覽量
645169 -
定時器
+關注
關注
23文章
3273瀏覽量
116867
發布評論請先 登錄
基于AT32(STM32)單片機的模塊化代碼之——按鍵代碼模塊化

評論