一個(gè)應(yīng)用于單片機(jī)的按鍵處理模塊_第1頁
一個(gè)應(yīng)用于單片機(jī)的按鍵處理模塊_第2頁
一個(gè)應(yīng)用于單片機(jī)的按鍵處理模塊_第3頁
一個(gè)應(yīng)用于單片機(jī)的按鍵處理模塊_第4頁
一個(gè)應(yīng)用于單片機(jī)的按鍵處理模塊_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論