|
“零耗時鍵盤”介紹: “零耗時”并非不耗時。它主要是將原本需要延時消除鍵盤抖動的時間轉化為對定時器的計數來替代。這樣就可將節約的時間用于對其他事件的處理。 “零耗時”鍵盤程序的編寫很簡單,首先要做到: 1.用總鍵盤個數除消除鍵盤抖動的時間20mS.本例有4個鍵,即20mS/4=5mS。 所以,定時器0中斷時間常數應該定義為5mS. 2.設置1個壓鍵20mS計數器數組KeyPressCount[]。用于對各鍵盤的壓鍵次數計數。 由于全部鍵盤掃描需要20mS,故KeyPressCount[]內的值為20mS的倍數。 3.設置1個鍵掃描位置計數器KeyCount,用于記錄當前鍵掃描的位置。 注意鍵掃描函數KeyScan()每次只掃描1個鍵(本例即為IRQ_Timer0())。 4.設置1個鍵掃描鍵值計數器數組KeyDblCount[],用于記錄鍵值以處理雙擊狀態。 本例主要講解“零耗時”鍵盤程序的編寫,一般不主張在MCU系統下用雙擊鍵。多建議采用長壓鍵來替代雙擊鍵。
特別注意: “零耗時”鍵盤程序屬于“掃而不描”類型,即每次只掃描1個鍵而不管其他鍵的狀態。這樣就可在一定的時間范圍內“并行”地處理多個鍵盤事件。鍵掃描位置計數器KeyCount的值就是鍵盤掃描結果的鍵值。故也改進了經典的鍵掃描函數KeyScan()需要逐次掃描的缺點 “零耗時”鍵盤程序只區分鍵釋放,單擊鍵,雙擊鍵 和長壓鍵4種基本事件。區分只簡單地判別KeyPressCount[]的個數即可。 1.當無鍵壓下且KeyPressCount[]減到0時,可判別為鍵釋放事件發生。 2.當有鍵壓下且KeyPressCount[]=2時,可認為鍵已經經過20mS消抖處理,即單擊鍵事件發生。如果需要雙擊鍵處理,則需要附加KeyDblCount[]雙擊鍵計數器數組。 3.當有鍵壓下且KeyPressCount[]=3*50時,即3*50*20mS=3S時,認為3S長壓鍵事件發生。
對“零耗時鍵盤”的個人應用總結: 在MCU的裸奔中,“零耗時鍵盤”很容易構成一個基于時間片小型的操作系統。它可以“并行地”處理多個鍵盤事件及任務。它的節拍不是OS常用的10mS,而是20mS消抖時間的1/N份。由于20mS也做為視覺暫留的時間基準,故在常用的LED+KEY系統中裸奔表現很不錯。如果每個任務都能保證在20mS/N內完成,那么后臺程序可以廢除,即主程序只是個死循環。這在低功耗系統中應用很廣。 |