|
Xilinx FPGA入門連載21:按鍵消抖與LED開關實例 特權同學,版權所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1jGjAhEm
鍵盤分編碼鍵盤和非編碼鍵盤。鍵盤上閉合鍵的識別由專用的硬件編碼器實現,并產生鍵編碼號或鍵值的稱為編碼鍵盤,如計算機鍵盤。而靠軟件編程來識別的稱為非編碼鍵盤。 在一般嵌入式應用中,用的最多的是非編碼鍵盤,也有用到編碼鍵盤的。非編碼鍵盤又分為獨立鍵盤和行列式(又稱為矩陣式)鍵盤。所謂獨立式鍵盤,即嵌入式CPU(或稱MCU)的一個GPIO口對應一個按鍵輸入,這個輸入值的高低狀態就是鍵值。矩陣鍵盤用于采集鍵值的GPIO是復用的,一般分為行和列采集,例如4*4矩陣鍵盤就只需要行列各4個按鍵就可以了,矩陣鍵盤的控制較獨立鍵盤要復雜得多,本實驗未涉及,所以對其原理不做詳細介紹。 獨立按鍵一般有2組管腳,雖然市面上我們常常看到有4個管腳的按鍵,但它們一般是兩兩導通的,這2組管腳在按鍵未被按下時是斷開的,在按鍵被按下時則是導通的。基于此原理,我們一般會把按鍵的一個管腳接地,另一個管腳上拉到VCC,并且也連接到GPIO。這樣,在按鍵未被按下時,GPIO的連接狀態為上拉到VCC,則鍵值為1;按鍵被按下時,GPIO雖然還是上拉到VCC,但同時被導通的另一個管腳拉到地了,所以它的鍵值實際上是0。 在本實驗中,我們有5個獨立按鍵。如圖所示,5個獨立按鍵一端接地,另一端在上拉的同時連接到FPGA的I/O口。當I/O口的電平為高(1)時,說明按鍵沒有被按下,當I/O口的電平為低(0)時,說明按鍵被按下了。
有人可能會說,按鍵值的采集判斷有什么難的,我讀連接按鍵的GPIO為1則未被按下,為0則被按下。話雖這么說,可實際情況可比這要復雜得多。如圖所示,按鍵在閉合和斷開時,觸點會存在抖動現象,這個抖動不僅和按鍵本身的機械結構有關,也和按鍵者的動作快慢輕重有關。因此,在按鍵按下或者釋放的時候都會出現一個不穩定的抖動時間,如果不處理好這個抖動時間,我們就無法正確采集到正確有效的按鍵值,所以我們的設計中必須有效消除按鍵抖動。如何進行有效的消抖,是本實驗的重點。
在我們的按鍵采集中,為了有效的濾除按鍵抖動,我們使用了一個大約40ms的計數器,在按鍵值沒有變化的時候,這個計數器總是不停的計數,并且計數到40ms最大值時進行一次當前按鍵值采樣(作為最終鍵值鎖存下來)。另外,我們專門設置2個寄存器對當前的按鍵輸入值進行多拍鎖存(并不作為最終的鍵值),并且利用這兩個寄存器前后值的變化來判斷當前鍵值是否有跳變(如從1變成0,或從0變成1)。若有鍵值的跳變,則40ms計數器就會清0,相當于重新開始計數,這樣就能夠保證按鍵被按下或者松開時短于40ms的抖動情況下不鎖存鍵值,從而達到濾除任何短于40ms的按鍵抖動。在實際應用中,40ms足以應付一般的按鍵抖動,當然具體環境也要具體分析,設計者可以根據需要調整這個計數器的計數值,只要能夠更好的滿足抖動的需要即可。 如圖所示,這里的40ms計數器只有在計數到最大值時產生鎖存當前鍵值的時能信號,在抖動期間按鍵的采樣周期也會相應的變長一些,但卻能夠得到更加穩定準確的鍵值。
除了前面所論及的按鍵消抖處理,該實驗還需要用到LED指示燈進行按鍵狀態的指示。 該實驗要實現一個獨立按鍵控制一個發光二極管亮暗狀態翻轉。上電初始,發光二極管不亮,當某一個按鍵被按下后(即鍵值為0),發光二極管被點亮,當按鍵再次被按下時,發光二極管則又滅了,按鍵控制發光二級管如此反復的進行亮暗變化。 將sp6.bit文件下載到FPGA中,接著可以分別取按下圖示的導航按鍵,對應的LED指示燈的亮滅將會翻轉。
|