勇敢的芯伴你玩轉Altera FPGA連載58:按鍵消抖原理 特權同學(xué),版權所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1i5LMUUD ![]() 鍵盤(pán)分編碼鍵盤(pán)和非編碼鍵盤(pán)。鍵盤(pán)上閉合鍵的識別由專(zhuān)用的硬件編碼器實(shí)現,并產(chǎn)生鍵編碼號或鍵值的稱(chēng)為編碼鍵盤(pán),如計算機鍵盤(pán)。而靠軟件編程來(lái)識別的稱(chēng)為非編碼鍵盤(pán)。 在一般嵌入式應用中,用的最多的是非編碼鍵盤(pán),也有用到編碼鍵盤(pán)的。非編碼鍵盤(pán)又分為獨立鍵盤(pán)和行列式(又稱(chēng)為矩陣式)鍵盤(pán)。所謂獨立式鍵盤(pán),即嵌入式CPU(或稱(chēng)MCU)的一個(gè)GPIO口對應一個(gè)按鍵輸入,這個(gè)輸入值的高低狀態(tài)就是鍵值。矩陣鍵盤(pán)用于采集鍵值的GPIO是復用的,一般分為行和列采集,例如4*4矩陣鍵盤(pán)就只需要行列各4個(gè)按鍵就可以了,矩陣鍵盤(pán)的控制較獨立鍵盤(pán)要復雜得多,本實(shí)驗未涉及,所以對其原理不做詳細介紹。 獨立按鍵一般有2組管腳,雖然市面上我們常?吹接4個(gè)管腳的按鍵,但它們一般是兩兩導通的,這2組管腳在按鍵未被按下時(shí)是斷開(kāi)的,在按鍵被按下時(shí)則是導通的;诖嗽,我們一般會(huì )把按鍵的一個(gè)管腳接地,另一個(gè)管腳上拉到VCC,并且也連接到GPIO。這樣,在按鍵未被按下時(shí),GPIO的連接狀態(tài)為上拉到VCC,則鍵值為1;按鍵被按下時(shí),GPIO雖然還是上拉到VCC,但同時(shí)被導通的另一個(gè)管腳拉到地了,所以它的鍵值實(shí)際上是0。 如圖8.10所示,在本實(shí)驗中,我們有一組4*4矩陣鍵盤(pán)。但是通過(guò)P12的PIN1-2短接時(shí),其實(shí)S1/S2/S3/S4可以作為獨立按鍵使用,它的一端接地,另一端在上拉的同時(shí)連接到FPGA的I/O口。當I/O口的電平為高(1)時(shí),說(shuō)明按鍵沒(méi)有被按下,當I/O口的電平為低(0)時(shí),說(shuō)明按鍵被按下了。 ![]() 圖8.10 矩陣按鍵電路圖 有人可能會(huì )說(shuō),按鍵值的采集判斷有什么難的,我讀連接按鍵的GPIO為1則未被按下,為0則被按下。話(huà)雖這么說(shuō),可實(shí)際情況可比這要復雜得多。如圖8.11所示,按鍵在閉合和斷開(kāi)時(shí),觸點(diǎn)會(huì )存在抖動(dòng)現象,這個(gè)抖動(dòng)不僅和按鍵本身的機械結構有關(guān),也和按鍵者的動(dòng)作快慢輕重有關(guān)。因此,在按鍵按下或者釋放的時(shí)候都會(huì )出現一個(gè)不穩定的抖動(dòng)時(shí)間,如果不處理好這個(gè)抖動(dòng)時(shí)間,我們就無(wú)法正確采集到正確有效的按鍵值,所以我們的設計中必須有效消除按鍵抖動(dòng)。如何進(jìn)行有效的消抖,是本實(shí)驗的重點(diǎn)。 ![]() 圖8.11 按鍵抖動(dòng)波形 在我們的按鍵采集中,為了有效的濾除按鍵抖動(dòng),我們使用了一個(gè)大約40ms的計數器,在按鍵值沒(méi)有變化的時(shí)候,這個(gè)計數器總是不停的計數,并且計數到40ms最大值時(shí)進(jìn)行一次當前按鍵值采樣(作為最終鍵值鎖存下來(lái))。另外,我們專(zhuān)門(mén)設置2個(gè)寄存器對當前的按鍵輸入值進(jìn)行多拍鎖存(并不作為最終的鍵值),并且利用這兩個(gè)寄存器前后值的變化來(lái)判斷當前鍵值是否有跳變(如從1變成0,或從0變成1)。若有鍵值的跳變,則40ms計數器就會(huì )清0,相當于重新開(kāi)始計數,這樣就能夠保證按鍵被按下或者松開(kāi)時(shí)短于40ms的抖動(dòng)情況下不鎖存鍵值,從而達到濾除任何短于40ms的按鍵抖動(dòng)。在實(shí)際應用中,40ms足以應付一般的按鍵抖動(dòng),當然具體環(huán)境也要具體分析,設計者可以根據需要調整這個(gè)計數器的計數值,8.12只要能夠更好的滿(mǎn)足抖動(dòng)的需要即可。 如圖所示,這里的40ms計數器只有在計數到最大值時(shí)產(chǎn)生鎖存當前鍵值的時(shí)能信號,在抖動(dòng)期間按鍵的采樣周期也會(huì )相應的變長(cháng)一些,但卻能夠得到更加穩定準確的鍵值。 ![]() 圖8.12 按鍵消抖處理 |