版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第第頁一個(gè)應(yīng)用于單片機(jī)的按鍵處理模塊
key_board介紹
key_board用于(單片機(jī))中的小巧多功能按鍵支持,軟件采用了分層的思想,并且做到了與平臺(tái)無關(guān),用戶只需要提供按鍵的基本信息和讀寫io電平的函數(shù)即可,非常方便移植,同時(shí)支持多個(gè)矩陣鍵盤及多個(gè)單io控制鍵盤。
目前已實(shí)現(xiàn)按下觸發(fā)、彈起觸發(fā)、長(zhǎng)按自動(dòng)觸發(fā)、長(zhǎng)按彈起觸發(fā)、多擊觸發(fā)、連續(xù)觸發(fā)等功能,并且能夠隨意組合(支持狀態(tài)的同一時(shí)間軸和非同一時(shí)間軸),后續(xù)還會(huì)添加更多的功能。
使用說明
初始化相關(guān)的(硬件)資源。提供一個(gè)1ms的(定時(shí)器),用于周期性的調(diào)用'key_check'函數(shù)。提供按鍵的描述及讀寫io的函數(shù)。將鍵盤注冊(cè)到系統(tǒng)。具體的操作參考提供的(stm32)例程。因?yàn)槌绦蚰J(rèn)使用了堆內(nèi)存,當(dāng)發(fā)現(xiàn)程序運(yùn)行結(jié)果不正常時(shí),嘗試增大你的程序堆空間,或者注冊(cè)調(diào)試接口查看原因。更詳細(xì)的使用(教程)見詳細(xì)使用說明或者提供的stm32例程。已支持的鍵盤
矩陣鍵盤矩陣鍵盤單io按鍵單io按鍵詳細(xì)使用說明
將key_board.c,key_board.h,key_board_config.h放進(jìn)key_board文件夾中并包含進(jìn)你的工程,添加頭文件路徑。
基礎(chǔ)功能移植(以stm32矩陣鍵盤為例)
首先需要一個(gè)可使用的定時(shí)器(如果不想使用定時(shí)器也可直接放到主循環(huán)中,但不(推薦),會(huì)導(dǎo)致時(shí)基不準(zhǔn)確),固定為1ms觸發(fā)一次;
準(zhǔn)備待(檢測(cè))的按鍵的基本信息,可參考key_board_sample.c文件中的structkey_(pi)n_t結(jié)構(gòu)體,如:
structkey_pin_t{GPIO_TypeDef*port;//按鍵端口號(hào)uint16_tpin;//按鍵的引腳號(hào)GPIO_PinStatevalid;//按鍵的有效電平(即按鍵按下時(shí)的電平)GPIO_PinStateinvalid;//按鍵的無效電平(即按鍵空閑時(shí)的電平)/*可添加你的其它參數(shù)*/};定義待檢測(cè)的按鍵信息,可參考key_board_sample.c文件中的conststructkey_pin_tkey_pin_sig[]結(jié)構(gòu)體數(shù)組,對(duì)應(yīng)頭文件為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的相關(guān)信息,可參考key_board_sample.c文件中的conststructkey_pin_tkey_pin_ctrl[]結(jié)構(gòu)體數(shù)組,對(duì)應(yīng)頭文件為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},};實(shí)現(xiàn)按鍵io的電平讀取函數(shù),可參考key_board_sample.c文件中的pin_level_get函數(shù),如:
staticinlineboolpin_level_get(constvoid*desc){structkey_pin_t*pdesc;pdesc=(structkey_pin_t*)desc;returnHAL_GPIO_Re(ad)Pin(pdesc->port,pdesc->pin)==pdesc->valid;}如果為矩陣鍵盤還需要實(shí)現(xiàn)按鍵io的電平寫入函數(shù),可參考key_board_sample.c文件中的pin_level_set函數(shù),如:
staticinlinevoidpin_level_set(constvoid*desc,boolflag){structkey_pin_t*pdesc;pdesc=(structkey_pin_t*)desc;HAL_GPIO_Wri(te)Pin(pdesc->port,pdesc->pin,flag?pdesc->valid:pdesc->invalid);}定義按鍵的id及功能結(jié)構(gòu)體structkey_public_sig_t,可參考key_board_sample.c文件中的conststructkey_public_sig_tkey_public_sig[]結(jié)構(gòu)體數(shù)組,對(duì)應(yīng)頭文件key_board.h,如:
conststructkey_public_sig_tkey_public_sig[]={KEY_PUBLIC_SIG_DEF(KEY_UP,如果為矩陣鍵盤還需要定義控制io的id及功能結(jié)構(gòu)體structkey_public_ctrl_t,可參考key_board_sample.c文件中的conststructkey_public_ctrl_tkey_public_ctrl[]結(jié)構(gòu)體數(shù)組,對(duì)應(yīng)頭文件key_board.h,如:
conststructkey_public_ctrl_tkey_public_ctrl[]={KEY_PUBLIC_CTRL_DEF(初始化鍵盤,可參考key_board_sample.c文件中的GPIO_Key_Board_Init函數(shù),如:
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,并注冊(cè)鍵盤GPIO_Key_Board_Init();//初始化定時(shí)器,用于按鍵掃描(1ms)init_tmr();for(;;){if(key_check_state(KEY_UP,KEY_RELEASE)){PRINTF("KEY_UPKEY_RELEASE");}if(key_check_state(KEY_UP,KEY_PRESS)){PRINTF("KEY_UPKEY_PRESS");}}}//定時(shí)器到期回調(diào)處理函數(shù)voidtmr_irq_callback(void){//調(diào)用按鍵掃描核心函數(shù)key_check();}擴(kuò)展功能長(zhǎng)按的使用
首先確保key_board_config.h文件中宏KEY_LONG_SUPPORT已處于使能狀態(tài),并且正確設(shè)置了宏KEY_DEFAULT_LONG_TRRIGER_(TI)ME的值;
設(shè)置按鍵功能需要對(duì)長(zhǎng)按進(jìn)行檢測(cè),如:
KEY_PUBLIC_SIG_DEF(KEY_UP,}if(key_check_state(KEY_UP,KEY_RELEASE_LONG)){PRINTF("KEY_UPKEY_RELEASE_LONG");}擴(kuò)展功能連按的使用
首先確保key_board_config.h文件中宏KEY_CONTINUOUS_SUPPORT已處于使能狀態(tài),并且正確設(shè)置了宏KEY_DEFAULT_CONTINUOUS_INIT_TRRIGER_TIME和KEY_DEFAULT_CONTINUOUS_PERIOD_TRRIGER_TIME的值;
設(shè)置按鍵功能需要對(duì)連按進(jìn)行檢測(cè),如:
KEY_PUBLIC_SIG_DEF(KEY_UP,}擴(kuò)展功能多擊的使用
首先確保key_board_config.h文件中宏KEY_MULTI_SUPPORT已處于使能狀態(tài),并且正確設(shè)置了宏KEY_DEFAULT_MULTI_INTERVAL_TIME的值;
設(shè)置按鍵功能需要多擊進(jìn)行檢測(cè),如:
KEY_PUBLIC_SIG_DEF(KEY_UP,res=key_check_state(KEY_UP,KEY_PRESS_MULTI);if(res){PRINTF("KEY_UPKEY_PRESS_MULTI:%d",res);}res=key_check_state(KEY_UP,KEY_RELEASE_MULTI);if(res){PRINTF("KEY_UPKEY_RELEASE_MULTI:%d",res);}擴(kuò)展功能組合狀態(tài)(同一時(shí)間軸)
感謝網(wǎng)友:石玉虎[@shi-yuhu]的反饋,已更正之前錯(cuò)誤的使用案例。
使用例程:
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}擴(kuò)展功能組合狀態(tài)(非同一時(shí)間軸)
首先確保key_board_config.h文件中宏KEY_COMBINE_SUPPORT已處于使能狀態(tài),并且正確設(shè)置了宏KEY_DEFAULT_COMBINE_INTERVAL_TIME的值;
使用例程:
//用于保存注冊(cè)后的組合狀態(tài)idstaticunsignedinttest_id1,test_id2;//定義要檢測(cè)的狀態(tài)conststructkey_combine_ttest_combine1[]={{.id=KEY_UP,.state=KEY_PRESS},{.id=KEY_DOWN,.state=KEY_PRESS_LONG},{.id=KEY_UP,.state=KEY_PRESS},};//注冊(cè)組合狀態(tài)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(te
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年科技研發(fā)項(xiàng)目保證金合同模板3篇
- 有關(guān)公司慰問信匯編7篇
- 軍訓(xùn)第二天心得體會(huì)
- 頂崗實(shí)習(xí)月報(bào)范文【五篇】
- 寫人物傳記的作文600字5篇
- 女工三八婦女節(jié)演講稿6篇
- 鄉(xiāng)鎮(zhèn)關(guān)于生態(tài)環(huán)境保護(hù)工作總結(jié)
- 九年級(jí)語文下冊(cè) 第三單元 10《唐雎不辱使命》教學(xué)實(shí)錄1 新人教版
- 網(wǎng)上學(xué)習(xí)作業(yè)答案
- 醫(yī)院護(hù)士實(shí)習(xí)報(bào)告(集錦15篇)
- YY/T 0698.4-2009最終滅菌醫(yī)療器械包裝材料第4部分:紙袋要求和試驗(yàn)方法
- 平面設(shè)計(jì)需求表、流程表
- GB/T 20980-2021餅干質(zhì)量通則
- 《元朝的統(tǒng)一》同步練習(xí)
- FZ/T 62012-2009防螨床上用品
- 《中國(guó)工農(nóng)紅軍長(zhǎng)征》說課稿
- 阿爾茨海默病的免疫課件
- 大型制造企業(yè)IT信息系統(tǒng)技術(shù)架構(gòu)規(guī)劃
- 小學(xué)美術(shù)《簡(jiǎn)筆畫》校本課程全冊(cè)教案
- 《輿論學(xué)》讀書報(bào)告
- 氣道護(hù)理 課件
評(píng)論
0/150
提交評(píng)論