錢程 趙莎莎
摘 要:文章針對目前單片機(jī)矩陣鍵盤模塊的低實(shí)時性問題,設(shè)計了一種基于TTL去抖算法的單片機(jī)矩陣鍵盤算法。利用TTL去抖算法的間隔時間采樣機(jī)制以及雙循環(huán)掃描法的逐行逐列掃描機(jī)制,保證矩陣鍵盤模塊響應(yīng)按鍵的實(shí)時性以及識別按鍵的準(zhǔn)確性。實(shí)驗(yàn)結(jié)果表明,該矩陣鍵盤算法識別按鍵準(zhǔn),響應(yīng)時間低,能夠識別組合鍵,通用性強(qiáng)。
關(guān)鍵詞:矩陣鍵盤;實(shí)時性;去抖;TTL
在嵌入式系統(tǒng)中,矩陣鍵盤是最常見的輸入設(shè)備。然而,機(jī)械按鍵在按下和松開時,會產(chǎn)生機(jī)械抖動,干擾輸入信號。為了避免這種干擾,在掃描矩陣鍵盤的過程中必須進(jìn)行去抖[1-3]。
一般的辦法是加入去抖延時[4-7],這樣雖然能達(dá)到去抖的目的,但在延時等待的時候,CPU不能執(zhí)行其他操作,因此實(shí)時性不高。而本文設(shè)計的基于生存時間值(Time To Live,TTL)的去抖算法,可以很好地解決上述問題。
本文將雙循環(huán)掃描法和TTL去抖算法結(jié)合起來,以尋求最優(yōu)算法。
1 TTL去抖算法
1.1 TTL算法
原始的TTL算法,是用在IPv4數(shù)據(jù)包頭部的一個數(shù)據(jù)段,用于避免數(shù)據(jù)包在網(wǎng)絡(luò)上被無限轉(zhuǎn)發(fā)[8-9]。
TTL的含義是生存時間值,數(shù)據(jù)包每經(jīng)過一個路由器,TTL的值就減1[10]。
如果TTL大于0,說明該數(shù)據(jù)包有效,應(yīng)該轉(zhuǎn)發(fā)。
反之,如果TTL等于0,說明該數(shù)據(jù)包已過期,應(yīng)該丟棄[11]。
1.2 TTL算法的擴(kuò)展
擴(kuò)展的TTL算法流程如圖1所示,用來判斷一個受干擾的信號是否有效。
(1)TTL是不斷遞減的計數(shù)器,每間隔單位時間,TTL就減1,直至減為0。
(2)如果檢測到事件信號,TTL就加2。
(3)如果TTL的值大于某個閾值,說明事件已發(fā)生,應(yīng)該處理;反之,如果TTL的值小于某個閾值,說明事件不一定發(fā)生,應(yīng)該忽略。
1.3 TTL去抖算法
擴(kuò)展的TTL算法,可以用于機(jī)械按鍵的軟件去抖,流程如圖2所示。
(1)TTL是不斷遞減的變量,每間隔單位時間,TTL就減1,直至減為0。
(2)如果檢測到按鍵被按下,該按鍵的TTL就加2。
(3)如果TTL的值大于某個閾值,說明按鍵真的被按下了,應(yīng)該處理;反之,如果TTL的值小于某個閾值,說明按鍵不一定被按下,應(yīng)該忽略。
2 改進(jìn)的矩陣鍵盤算法
2.1 矩陣鍵盤模塊的原理
本文所采用的開發(fā)平臺為TX-1C 51開發(fā)板。矩陣鍵盤的原理如圖3所示。
2.2 掃描法的選擇
2.2.1 線反轉(zhuǎn)法
這種方法是先讓4根列線輸出0000B,讀取4根行線的數(shù)據(jù)A;再行列反轉(zhuǎn),即讓4根行線輸出0000B,讀取4根列線的數(shù)據(jù)B;最后由AB組合成一個8位的二進(jìn)制數(shù)據(jù)即為鍵值[12-13]。
2.2.2 逐行掃描法
這種方法是先讓一根行線輸出0,其余行線輸出1,讀取列線的數(shù)據(jù),即為該行的鍵值。逐行掃描,4根行線各自輸出一次0,來讀取4行的鍵值[14-16]。
2.2.3 雙循環(huán)掃描法
顧名思義,這種方法是指在矩陣鍵盤中,列和行都各自循環(huán)掃描[16]。與逐行掃描法的區(qū)別在于,逐行掃描法是一次性讀取4根列線的值,而雙循環(huán)掃描法是分別讀取4根列線的值。
2.2.4 掃描法的選擇
組合鍵有3種類型,示意如圖4所示。
(1)跨行組合鍵,即同時按住多個按鍵,且每一行只按下了一個按鍵。
(2)同行組合鍵,即同時按住多個按鍵,且有兩個按鍵恰好在同一行。
(3)三角鍵,即同時按住多個按鍵,且有3個按鍵恰好占了兩行兩列。
3種掃描法的比較如表1所示。可以看出,線反轉(zhuǎn)法速度最快,而雙循環(huán)掃描法最適合用組合鍵。本文選擇雙循環(huán)掃描法。
2.3 軟件編程
2.3.1 定義全局變量
(1)uchar key_TTL[16];
對應(yīng)16個按鍵的TTL(用于去抖)
(2)uint keys_val=0;
16位組合鍵的鍵值(用于按鍵功能)
(3)uchar max_TTL=3;
TTL的閾值(判斷按鍵信號是否有效)
(4)uint last_keys_val=0;
上一時刻的鍵值(判斷鍵值變動)
2.3.2 矩陣鍵盤核心函數(shù)
void key_spy(void)
{
uint temp=0;
//雙循環(huán)掃描法 + 譯碼
uchar k,l;
for(l=0;l<4;l++)
{
P3=~(0x01< for(k=0;k<4;k++) { if((P3&(0x10< key_TTL[k+l*4]+=2; } } //TTL去抖 for(k=0;k<16;k++) { if(key_TTL[k]>0)key_TTL[k]--; if(key_TTL[k]>=max_TTL){ //把這個if里的>=改為=,就能自動連點(diǎn) key_TTL[k]--; temp=temp|(1<
}
}
keys_val=temp;
//按鍵功能
if(keys_val!=last_keys_val){
if(keys_val==((1<<0))){
//TODO:按下了0號鍵
}
else if(keys_val==((1<<3)|(1<<4))){
//TODO:同時按下了3號、4號鍵
}
//TODO:加入更多else if,
// 以擴(kuò)充鍵盤功能。
}
last_keys_val=keys_val;
}
2.3.3 核心程序的使用方法
在嵌入式系統(tǒng)的主循環(huán)或者定時器中斷里,加入key_spy(void);這條語句,并在key_spy(void)的按鍵功能區(qū)域,編寫按鍵的處理程序。
2.3.4 改進(jìn)的矩陣鍵盤算法的例程
本例程中,矩陣鍵盤的功能是:通過按特定的組合鍵,來改變?nèi)肿兞縦1和k2的值。
矩陣鍵盤和液晶屏的代碼省略。
主函數(shù)代碼如下:
void main()
{
while(1)
{
k3++;if(k3==100)k3=0;
//讓k3不斷增加
display3n(k1,k2,k3);
//數(shù)碼管實(shí)時顯示k1 k2 k3的值
key_spy();
//主循環(huán)里加入鍵盤程序
}
}
圖5為例程在TX-1C 51開發(fā)板上運(yùn)行的照片。
6位數(shù)碼管,左邊4位用來輸出兩個變量k1和k2的值, 右面兩位用來輸出變量k3的值。
在實(shí)際運(yùn)行中,數(shù)碼管右邊兩位的數(shù)字在不停變化。從按下按鍵到松開按鍵,都不會使這兩位數(shù)字的變化出現(xiàn)停頓,說明改進(jìn)的矩陣鍵盤算法占用CPU資源小。
在按下按鍵的時候,程序能迅速地相應(yīng)按鍵事件,立刻改變k1和k2的值,具有很高的實(shí)時性和準(zhǔn)確性。
3 評價和推廣
3.1 評價
TTL去抖算法是一種間隔時間采樣的方法。與傳統(tǒng)的延時去抖相比,TTL去抖算法可以很好地利用延時等待的時間,來處理別的任務(wù),從而提高整個系統(tǒng)的實(shí)時性。
TTL去抖算法可以配合線反轉(zhuǎn)法、雙循環(huán)掃描法使用。線反轉(zhuǎn)法掃描得更快,但是不支持組合鍵;而雙循環(huán)掃描法掃描得稍慢,支持組合鍵。這兩種方法與傳統(tǒng)的矩陣鍵盤檢測方法,在掃描時間上的比較如表2所示。
傳統(tǒng)的矩陣鍵盤檢測方法,往往需要等待按鍵松開,這樣按住按鍵不松,主程序就陷入死循環(huán)。
線反轉(zhuǎn)法和雙循環(huán)掃描法,按不同按鍵,所需的掃描時間會有細(xì)微差別,這是由于按鍵的檢測順序所導(dǎo)致的。
線反轉(zhuǎn)法和雙循環(huán)掃描法的實(shí)際用時差別不大。測試平臺用的是11.059 2 MHz的51單片機(jī)。在頻率更高的嵌入式系統(tǒng)中,兩種算法的實(shí)際用時會更短,差別會更小。
3.2 推廣
3.2.1 TTL去抖算法用于檢測斑馬線
TTL去抖算法,可以用于恩智浦杯智能汽車競賽中,選用線性CCD作為傳感器的光電組,用來給二值化后的線性CCD圖像檢測斑馬線,也就是檢測起跑線。
二值化后的線性CCD圖像是一行像素,一段連續(xù)的相同的像素,稱為一片區(qū)域;兩片區(qū)域的連接處,稱為一個跳變。
(1)TTLA和TTLB是兩個不斷遞減的計數(shù)器,每掃描一個像素,TTLA就減1,直至減為0;每掃描一個區(qū)域,TTLB就減1,直至減為0。
(2)每掃描到一個跳變,先判斷TTLA是否為0,再給TTLA賦初值。
(3)如果檢測到跳變的時候,TTLA不為零,那么上一個區(qū)域可能屬于斑馬線,令TTLB加2;反之,如果檢測到跳變的時候,TTLA為零,那么上一個區(qū)域不屬于斑馬線。
(4)如果TTLB的值大于某個閾值,說明之前的TTLB個區(qū)域確實(shí)是斑馬線,應(yīng)該處理;反之,如果TTLB的值小于某個閾值,說明之前的TTLB個區(qū)域的不一定是斑馬線,應(yīng)該忽略。
3.2.2 改進(jìn)的矩陣鍵盤算法的推廣
單片機(jī)現(xiàn)場賽,是要求參賽選手在規(guī)定時間內(nèi)按要求編寫單片機(jī)軟件的比賽,需要在最短的時間寫好底層驅(qū)動,才有時間編寫規(guī)定的功能。改進(jìn)的矩陣鍵盤算法把獲取鍵值、譯碼、去抖和按鍵功能幾個步驟[15]都精簡到一個子函數(shù)里,代碼短,結(jié)構(gòu)清晰,易于開發(fā),非常適合單片機(jī)現(xiàn)場賽。
平衡車,是對實(shí)時性要求極高的嵌入式系統(tǒng)。如果因?yàn)榘存I去抖而出現(xiàn)等待延時,那么將極有可能導(dǎo)致平衡車失衡,造成安全隱患?;赥TL去抖算法和線反轉(zhuǎn)法的矩陣鍵盤算法,將非常適合平衡車。
TTL去抖算法和雙循環(huán)掃描法組成的矩陣鍵盤算法,由于支持組合鍵,且實(shí)時性高,可以用來制作按鍵多的游戲機(jī),還可以用來做游戲鍵盤。
4 結(jié)語
為實(shí)現(xiàn)矩陣鍵盤模塊的快速響應(yīng)以及精準(zhǔn)檢測,設(shè)計了基于TTL的去抖算法的矩陣鍵盤算法,掃描部分采用雙循環(huán)掃描法來支持多鍵齊按的功能。通過實(shí)驗(yàn)驗(yàn)證可知:矩陣鍵盤算法實(shí)時性高,識別按鍵準(zhǔn)。
與部分矩陣鍵盤算法相比,此算法不依賴中斷、多線程,因此更適用于前后臺系統(tǒng)。代碼精簡,易于開發(fā)單按鍵、組合鍵的鍵盤功能,因此適用于很多場景。
[參考文獻(xiàn)]
[1]吉喆.單片機(jī)矩陣鍵盤去抖程序的設(shè)計[J].計算機(jī)光盤軟件與應(yīng)用,2012(7):167.
[2]崔朋.矩陣鍵盤在單片機(jī)工程中的應(yīng)用[J].黑龍江科技信息,2016(11):43.
[3]鄭采君.基于CPLD的矩陣鍵盤掃描模塊設(shè)計[J].電子設(shè)計工程,2010(10):169-175.
[4]武志鵬,焦紅衛(wèi).一種基于矩陣鍵盤掃描原理的程序設(shè)計[J].工業(yè)控制計算機(jī),2018(7):141-142.
[5]張成法,馬鳳娟.基于AT89C52的矩陣鍵盤編程[J].河北農(nóng)機(jī),2016(11):46-47.
[6]劉軍.4×4矩陣鍵盤控制LED原理及軟硬件設(shè)計、仿真調(diào)試[J].哈爾濱鐵道科技,2015(4):7-11.
[7]李其珂,付紅橋.基于嵌入式Linux的矩陣鍵盤驅(qū)動研究與實(shí)現(xiàn)[J].重慶理工大學(xué)學(xué)報(自然科學(xué)版),2012(12):88-92.
[8]王建平,左現(xiàn)剛,胡孟杰,等.固定節(jié)點(diǎn)3D網(wǎng)格部署的水下傳感器網(wǎng)絡(luò)分簇路由算法[J].火力與指揮控制,2017(5):84-89.
[9]楊建強(qiáng),寧彬.基于IPv6協(xié)議的操作系統(tǒng)指紋識別[J].湖北文理學(xué)院學(xué)報,2013(5):13-17.
[10]袁福祥,劉粉林,蘆斌,等.基于歷史數(shù)據(jù)的異常域名檢測算法[J].通信學(xué)報,2016(10):172-180.
[11]危婷,冷峰,張躍冬,等.DNS服務(wù)器緩存失效過程的研究[J].電信科學(xué),2013(9):94-97.
[12]曾曉春.線反轉(zhuǎn)法矩陣鍵盤程序設(shè)計[J].科技創(chuàng)新與應(yīng)用,2013(23):14.
[13]段崇秀.單片機(jī)中的矩陣鍵盤編程[J].硅谷,2012(5):172.
[14]周正貴.基于單片機(jī)技術(shù)的按鍵掃描電路分析[J].信息與電腦(理論版),2018(13):29-30.
[15]劉宸,黃世瑜.對電平計時的矩陣鍵盤識別方法研究[J].通信電源技術(shù),2018(2):5-6,10.
[16]黃麗英,章敏.淺析基于AT89C51矩陣鍵盤檢測的編程技巧[J].科技創(chuàng)業(yè)家,2013(2):160-161.