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