8.4.5 矩陣按鍵的掃描
我們講獨立按鍵掃描的時候,大家已經簡單認識了矩陣按鍵是什么樣子了。矩陣按鍵相當于4組每組各4個獨立按鍵,一共是16個按鍵。那我們如何區(qū)分這些按鍵呢?想一下我們生活所在的地球,要想確定我們所在的位置,就要借助經緯線,而矩陣按鍵就是通過行線和列線來確定哪個按鍵被按下的。那么在程序中我們又如何進行這項操作呢?
前邊講過,按鍵按下通常都會保持100ms以上,如果在按鍵掃描中斷中,我們每次讓矩陣按鍵的一個KeyOut輸出低電平,其它三個輸出高電平,判斷當前所有KeyIn的狀態(tài),下次中斷時再讓下一個KeyOut輸出低電平,其它三個輸出高電平,再次判斷所有KeyIn,通過快速的中斷不停的循環(huán)進行判斷,就可以最終確定哪個按鍵按下了,這個原理是不是跟數碼管動態(tài)掃描有點類似?數碼管我們在動態(tài)賦值,而按鍵這里我們在動態(tài)讀取狀態(tài)。
至于掃描間隔時間和消抖時間,因為現(xiàn)在有4個KeyOut輸出,要中斷4次才能完成一次全部按鍵的掃描,顯然再采用2ms中斷判斷8次掃描值的方式時間就太長了(248=64ms),那么我們就改用1ms中斷判斷4次采樣值,這樣消抖時間還是16ms(144)。下面就用程序實現(xiàn)出來,程序循環(huán)掃描板子上的K1~K16這16個矩陣按鍵,分離出按鍵動作并在按鍵按下時把當前按鍵的編號顯示在一位數碼管上(用0~F表示,顯示值=按鍵編號-1)。
這個程序完成了矩陣按鍵的掃描、消抖、動作分離的全部內容,希望大家認真研究一下,徹底掌握矩陣按鍵的原理和應用方法。在程序中還有兩點值得說明一下。
首先,可能你已經發(fā)現(xiàn)了,中斷函數中掃描KeyIn輸入和切換KeyOut輸出的順序與前面提到的順序不同,程序中我首先對所有的KeyIn輸入做了掃描、消抖,然后才切換到了下一次的KeyOut輸出,也就是說我們中斷每次掃描的實際是上一次輸出選擇的那行按鍵,這是為什么呢?因為任何信號從輸出到穩(wěn)定都需要一個時間,有時它足夠快而有時卻不夠快,這取決于具體的電路設計,我們這里的輸入輸出順序的顛倒就是為了讓輸出信號有足夠的時間(一次中斷間隔)來穩(wěn)定,并有足夠的時間來完成它對輸入的影響,當你的按鍵電路中還有硬件電容消抖時,這樣處理就是絕對必要的了,雖然這樣使得程序理解起來有點繞,但它的適應性是最好的,換個說法就是,這段程序足夠“健壯”,足以應對各種惡劣情況。
其次,是一點小小的編程技巧。注意看keyout = keyout & 0x03;這一行,在這里我是要讓keyout在0~3之間變化,加到4就自動歸零,按照常規(guī)你可以用前面講過的if語句輕松實現(xiàn),但是你現(xiàn)在看一下這樣程序是不是同樣可以做到這一點呢?因為0、1、2、3這四個數值正好占用2個二進制的位,所以我們把一個字節(jié)的高6位一直清零的話,這個字節(jié)的值自然就是一種到4歸零的效果了。看一下,這樣一句代碼比if語句要更為簡潔吧,而效果完全一樣。
8.5 簡易加法計算器
學到這里,我們已經掌握了一種顯示設備和一種輸入設備的使用,那么是不是可以來做點綜合性的實驗了。好吧,那我們就來做一個簡易的加法計算器,用程序實現(xiàn)從板子上標有0~9數字的按鍵輸入相應數字,該數字要實時顯示到數碼管上,用標有向上箭頭的按鍵代替加號,按下加號后可以再輸入一串數字,然后回車鍵計算加法結果,并同時顯示到數碼管上。雖然這遠不是一個完善的計算器程序,但作為初學者也足夠你研究一陣子了。
首先,本程序相對于之前的例程要復雜得多,需要完成的工作也多得多,所以我們把各個子功能都做成獨立的函數,以使程序便于編寫和維護。大家分析程序的時候就從主函數和中斷函數入手,隨著程序的流程進行就可以了。大家可以體會體會劃分函數的好處,想想如果還是只有主函數和中斷函數來實現(xiàn)的話程序會是什么樣子。
其次,大家可以看到我們再把矩陣按鍵掃描分離出動作以后,并沒有直接使用行列數所組成的數值作為分支判斷執(zhí)行動作的依據,而是把抽象的行列數轉換為了一種叫做標準鍵盤鍵碼(就是電腦鍵盤的編碼)的數據,然后用得到的這個數據作為下一步分支判斷執(zhí)行動作的依據,為什么多此一舉呢?有兩層含義:第一,盡量讓自己設計的東西(包括硬件和軟件)向已有的行業(yè)規(guī)范或標準看齊,這樣有助于別人理解認可你的設計,也有助于你的設計與別人的設計相對接,畢竟標準就是為此而生的嘛。第二,有助于程序的層次化而方便維護與移植,比如我們現(xiàn)在用的按鍵是44的,但如果后續(xù)又增加了一行成了45的,那么由行列數組成的編號可能就變了,我們就要在程序的各個分支中查找修改,稍不留神就會出錯,而采用這種轉換后,我們則只需要維護KeyCodeMap這樣一個數組表格就行了,看上去就像是把程序的底層驅動與應用層的功能實現(xiàn)函數分離開了,應用層不用關心底層的實現(xiàn)細節(jié),底層改變后也無需在應用層中做相應修改,兩層程序之間是一種標準化的接口。這就是程序的層次化,而層次化是構建復雜系統(tǒng)的必備條件,那么現(xiàn)在就先通過簡單的示例來學習一下吧。
作為初學者針對這種程序的學習方式是,先從頭到尾讀一到三遍,邊讀邊理解,然后邊抄邊理解,徹底理解透徹后,自己嘗試獨立寫出來。完全采用記憶模式來學習這種例程,一兩個例程你可能感覺不到什么提高,當這種例程背過上百八十個的時候,厚積薄發(fā)的感覺就來了。同時,在抄讀的過程中也要注意學習編程規(guī)范,這些可都是無形的財富,可以為你日后的研發(fā)工作加分的哦。
8.6 練習題
1、理解單片機最小系統(tǒng)三要素電路設計規(guī)則。
2、掌握函數間相互調用的方法和規(guī)則。
3、學會獨立按鍵和矩陣按鍵的電路設計方法和軟件編程思路。
4、用一個按鍵實現(xiàn)一個數碼管數字從F~0遞減的變化程序。
5、用矩陣按鍵做一個簡易減法計算器。
-
單片機
+關注
關注
6040文章
44594瀏覽量
636941 -
數碼管
+關注
關注
32文章
1883瀏覽量
91284 -
計算器
+關注
關注
16文章
437瀏覽量
37405 -
矩陣按鍵
+關注
關注
0文章
28瀏覽量
8380
發(fā)布評論請先 登錄
相關推薦
評論