魯慶賓
(南陽理工學院 計算機科學與技術系,河南 南陽 473004)
鍵盤是一組按鍵的集合,是最常用的微機輸入設備。操作員可以通過鍵盤輸入數(shù)據(jù)或指令,實現(xiàn)簡單的人機通信[1]。連擊是鍵盤操作中常用的方法,可以在很大程度上提高鍵盤的使用效率[2]。
在下文中,短擊是指短暫按下某鍵,時間小于500 ms,長擊是指長時間按住某鍵不放,時間超過1 s。比如,在手機鍵盤中,短擊“*”鍵則可以在輸入框中輸入該符號,長擊則鎖定鍵盤或解鎖;短擊向下箭頭則執(zhí)行一次下移操作,長擊超過一定時間則可以執(zhí)行連續(xù)的下移操作。
筆者以 STC89C51的P1口設計的4×4式鍵盤為例[3],介紹在一個鍵盤中存在的以下3情況:一是該鍵按下只執(zhí)行單一功能;二是該鍵按下時短擊執(zhí)行該鍵第一功能,長擊執(zhí)行第二功能;三是該鍵按下時短擊執(zhí)行第一功能,長擊則每隔一個較短的時間連續(xù)執(zhí)行該鍵的功能。該方法在Keil C下編譯通過。
矩陣式鍵盤的結構如圖1所示[4]。從鍵盤的行線送出全0,讀取列線的值,如果鍵盤中有鍵按下,則相應的列線必然被拉為低電平,即讀取到列線的值不全為1,否則,當鍵盤中無鍵按下時,讀取到列線的值全為1。于是,當判斷鍵盤中無鍵按下時鍵盤掃描函數(shù)直接返回-1;有鍵按下時,需要判斷是哪一個按鍵按下,步驟為:從第0行送0,其他行送1,讀取列線的值,若讀取到的列線值不全為1,則所按下的鍵必在該行,否則,所按下的鍵不在該行,從下一行送0,其他行送1,直到最后一行。當判斷所按下按鍵在該行時,只要找到列線中輸入為0的列,行列位置即確定,對該位置進行編碼,此編碼即為插入圖1鍵值[5]。
圖1 圖4×4矩陣鍵盤接口Fig.1 Keyboard interface of 4×4 matrix
掃描得到鍵值[的函數(shù)如下:
鍵的處理流程圖如圖2所示。
圖2 按鍵處理流程圖Fig.2 Flow chart of keys processing
在以下的方法中,定義了兩個全局變量:
1)KeyStatus:按鍵按下后的狀態(tài)。程序中置了3狀態(tài):①時去抖狀態(tài),程序中使用狀態(tài)0;②擊狀態(tài),程序中使用狀態(tài)1;③擊后連續(xù)執(zhí)行某一功能狀態(tài),程序中使用狀態(tài)2。
2)在按鍵狀態(tài)0時,時間達到15 ms,去抖完成,執(zhí)行按鍵的第一功能,進入狀態(tài)1。當狀態(tài)1時間達到1 000 s,需要執(zhí)行第二功能的按鍵執(zhí)行第二功能,需要連續(xù)執(zhí)行某一功能的按鍵再次執(zhí)行一次第一功能,轉讓狀態(tài)2。當狀態(tài)2時間每到一次100 s,需要連續(xù)執(zhí)行某一功能的按鍵再次執(zhí)行一次第一功能。
按鍵執(zhí)行第一功能和連續(xù)執(zhí)行的函數(shù)假定為void KeyFirstFunction(unsigned char);執(zhí)行第二功能的函數(shù)假定為void KeySecondFunction(unsigned char);定時器 0 中斷服務程序為void T0IntServe();假定振蕩頻率為 12 MHz,定時時間為1 ms,程序代碼如下:
該方法的特點:
1)按鍵的處理只是在每次循環(huán)時掃描一下有沒有鍵按下,根據(jù)按鍵按下的時間確定當前按鍵的狀態(tài)。既沒有常規(guī)按鍵處理中的使用延時去抖,也沒有在等待按鍵釋放過程中的循環(huán)處理,避免了CPU在延時過程中什么事情也不干的問題,提高了CPU的使用效率。
2)根據(jù)按鍵按下的時間和各按鍵的功能設置其執(zhí)行的指令,巧妙解決了多個按鍵在連擊時處理方法復雜的問題,結構簡單、條理清晰。
經(jīng)過在多個項目中的實際證明,用這種方法不但可以快速有效地處理按鍵功能,而且程序稍加調整后,可以在定時中斷中掃描按鍵,另外定時器也可以作為時基產(chǎn)生器產(chǎn)生程序運行所需的時標。
[1]吳國經(jīng).單片機應用技術[M].北京:中國電力出版社,2004.
[2]李全利,遲榮強.單片機原理及接口技術[M].北京:高等教育出版社,2004.
[3]許泳龍.單片機原理及應用[M].北京:機械工業(yè)出版社,2005.
[4]張毅剛.MCS-計[M].哈爾濱:哈工大出版社,2004.
[5]李朝青.單片機原理及接口技術[M].北京:北京航空航天大學出版社,2006.
[6]周國運.單片機原理及應用[M].C語言版.北京:中國水利水電出版社,2009.