在基于PC104的便攜式野外測試設備的設計中,,鍵盤是常用的輸入設備。對于便攜式設備野外工作時,,一般使用小型(4x4)矩陣鍵盤就能滿足設備的信息輸入需要,;室內調試時,使用標準PS2鍵盤更方便,、靈活,。一般的做法是保留PC104的鍵盤接口用于接標準鍵盤,利用擴展I/O接口完成小矩陣鍵盤的掃描和輸入,。這樣做雖然可以實現(xiàn)設備雙鍵盤同時工作的功能,,卻需耗費大量的CPU處理時間掃描矩陣鍵盤,造成CPU處理其他信息的能力下降,。而本文設計的基于CPLD的矩陣鍵盤掃描模塊能夠很好地解決上述問題,。
1 矩陣鍵盤掃描原理
圖1給出了4x4矩陣鍵盤的電路圖,在圖1中KX[3..0]為掃描碼輸入,,KY[3..0]為掃描碼輸出,。鍵盤掃描開始時,首先置KX[3..0]=“0000”,;鍵盤掃描碼寄存器和鍵盤掃描碼緩存器Kreg[15..0]和Kscan[15..0]置成“1111111111111111”(全1為沒有鍵按下,,有鍵按下時至少有一位為O),一旦有鍵按下,,KY[3..0]輸出不全為“O”的掃描碼觸發(fā)鍵盤掃描功能開始鍵盤掃描,,掃描開始后,依次將KX3,、KX2,、KX1、KX0置“0”,,分別將對應的4組KY[3..0]輸入值保存于Kscan[15..12],、Kscan[11..8]、Kscan[7..4],、Kscan[3..0]中,,而后比較Kscan和Kreg的大小,如果Kscan小于Kreg,,將Kscan保存于Kreg中,,重復上述掃描過程直到Kscan[15..0]各位輸出全為“1”時,說明按下的鍵全部抬起,,Kreg[15..0]中的每一個為“0”的位對應一個按下的鍵,,保留掃描過程中的Kreg最小值就可以處理組合鍵。根據(jù)記錄的Kreg值可以判斷是哪個或哪幾個鍵按下,據(jù)此編碼按鍵值后輸出,。將KX[3..0]置為“0000”,,等待下一次按鍵發(fā)生。
2 基于CPLD的4x4矩陣鍵盤掃描模塊設計
根據(jù)上述掃描原理和工作流程,,如果以PC104 CPU實現(xiàn)上述矩陣鍵盤的掃描過程,,那么在有鍵按下后,CPU必須不停地掃描矩陣鍵盤電路,,在此期間不能進行其他工作,,降低了CPU工作效率,且CPU連續(xù)高速運轉增加系統(tǒng)功耗,。
本文的目的就是在不需要CPU參與的條件下以CPLD完成矩陣鍵盤按鍵事件觸發(fā),、按鍵的掃描定位以及按鍵的編碼和鍵值輸出工作,CPU只需要定時查詢有無鍵按下并讀走按下鍵的按鍵值送入鍵盤緩沖區(qū),。這樣就使CPU從繁重的矩陣鍵盤掃描工作中解脫出來,。根據(jù)上述鍵盤掃描工作原理,基于CPLD的4x4矩陣鍵盤掃描模塊功能框圖如圖2所示,。
圖中,,模塊KeyTri在時鐘信號CLK的控制下實現(xiàn)按鍵事件觸發(fā)和矩陣鍵盤掃描時序產(chǎn)生功能;模塊keycode在時鐘信號CLK和掃描時序碼SCode的控制下完成輸出鍵盤掃描碼KX,,同時記錄16位鍵盤掃描數(shù)據(jù)等工作,,并在所有鍵抬起后對按下的鍵編碼完成輸出功能;模塊nread實現(xiàn)按鍵碼的暫存,、按鍵狀態(tài)的置位和清除以及矩陣鍵盤的使能,;模塊PCPORT完成矩陣鍵盤與CPU的接口;模塊OSC與CreatClock產(chǎn)生控制鍵
盤掃描模塊工作的3 KHz時鐘信號CLK,。
2.1 鍵盤掃描觸發(fā)模塊(KeyTri)的功能與時序仿真
鍵盤掃描過程中,,掃描信號不停變化,以判斷鍵盤按鍵的按下和抬起,。高速變化的鍵盤掃描信號不僅使系統(tǒng)功耗增加,,而且還會對其他敏感電路造成干擾。因此在本設計中將鍵盤掃描模式設計成鍵按下觸發(fā)掃描方式,,只有當鍵盤有鍵按下后,,才觸發(fā)鍵盤掃描電路產(chǎn)生掃描鍵盤時序,所有鍵都放開后,,停止對鍵盤的掃描,使電路處于相對靜止狀態(tài),,以減少對其他電路的干擾,。
鍵盤按下時會有抖動,在按鍵抖動時掃描鍵盤,可能會使鍵盤掃描電路產(chǎn)生誤判,,因此在鍵盤按下與開始掃描之間應加入一段延時,,延時結束后按鍵仍處于按下狀態(tài),才允許開始鍵盤掃描,,這樣做可以最大限度地避免掃描電路的誤判和漏判,。
鍵盤掃描觸發(fā)模塊實現(xiàn)的功能為:在KX="0000"的狀態(tài)下,如果有任意一個鍵被按下,,KY必然不全為‘1’,,觸發(fā)延時功能開始延時,延時結束后,,如果KY仍不全為‘1’,,說明該按鍵事件有效,啟動掃描時序產(chǎn)生1H~BH的4位循環(huán)掃描時序碼,,控制后續(xù)的鍵盤掃描電路對鍵盤掃描,,當ReSet變低時,立即將掃描時序碼置為OH,,停止本次鍵盤掃描并等待下一次鍵盤按下事件到來,。鍵盤掃描觸發(fā)模塊的VHDL語言實現(xiàn)如下:
鍵盤掃描觸發(fā)模塊的時序仿真如圖3所示。
在圖3中,,①和②之間的時間為去鍵盤抖動延時,,為了方便仿真,此處把延時時間設定為4個周期,,實際使用時,,應保持在20~30 ms左右。
2.2 鍵盤掃描與編碼輸出模塊(keycode)的功能與時序仿真
所謂鍵盤掃描,,就是在鍵盤的KX端依次送入掃描碼,,以便定位被按下的鍵。鍵盤編碼是對鍵盤掃描值譯碼得到按下鍵的按鍵值,。
該模塊完成的功能為:在掃描時序控制碼SCode[3..0]和CLK的下降沿控制下依次輸出4組掃描碼“0111”,、“1011”、“1101”,、“11 10”掃描整個鍵盤,,同時記錄鍵盤的掃描值,將記錄的4組掃描值組合成一組16位的鍵盤掃描值Kscan[15..0],,如果Kscan[15..0]小于Kreg[15..O],,將Kscan[15..0]保存于Kreg[15..0]中,當所有鍵放開后,,對Kreg[15..0]譯碼產(chǎn)生按鍵編碼并輸出,。有一個鍵按下,,16位的鍵盤掃描值中有且只有一位為O,多鍵組合按下時,,鍵盤掃描值中就會有多個位為‘0’,,因此在鍵盤掃描過程中,記錄最小的鍵盤掃描值,,使得掃描模塊不僅能夠處理單鍵,,而且可以處理多鍵組合。具體工作過程說明如下:
當SCode [3..0]=0時,,KX="0000",,置16位鍵盤掃描值Kscan[15..0]和Kreg[15..0]為全‘1’,此時無論哪一個鍵按下,,都可使KY不全為‘1’,,從而觸發(fā)掃描模塊工作;
當SCode[3..0]=1或2時,,KX="0111",,此時圖1中K12~K15有按下的鍵時,KY對應位為‘0’,,其他位為‘1’,,記錄KY到鍵盤掃描碼寄存器的Kreg[15..12];
當SCode[3..0]=3或4時,,KX=“1011”,,此時圖1中K08~K11有按下的鍵時,KY對應位為‘0’,,其他位為‘1’,,記錄KY到鍵盤掃描碼寄存器的Kreg[11..8];
當SCode[3..0]=5或6時,,KX=“1101”,,此時圖1中K04~K07有按下的鍵時,KY對應位為‘0’,,其他位為‘1’,,記錄KY到鍵盤掃描碼寄存器的Kreg[7..4];
當SCode[3..0]=7或8時,,KX=“1110”,,此時圖l中K00~K03有按下的鍵時,KY對應位為‘O’,,其他位為‘1’,,記錄KY到鍵盤掃描碼寄存器的Kreg[3..0];
當SCode[3..0]=9和10時,,如果Kscan[15..0]各位不全為“1”且Kscan[15..0]
鍵盤掃描與編碼輸出模塊的核心模塊VHDL語言實現(xiàn)如下:
鍵盤掃描與編碼輸出模塊的時序仿真圖如圖4所示,。
2.3 鍵盤編碼輸出模塊(nread)的功能與時序仿真
在該模塊中,KeyrData的最高位KeyData(7)為鍵盤緩存狀態(tài)指示位,,當KeyData(7)=‘0’時,,表示鍵盤緩存中沒有按鍵碼:當KeyData(7)=‘1’時,表示鍵盤緩存中有按鍵碼等待CPU讀取,。KeyData[6..0]為按下鍵的編碼,。ReSet的下降沿用于將KeyVal[6..0]存入KeyData[6..0],同時將KeyData(7)置成'1',。enKeyOut用于使能矩陣鍵盤輸出,,當enKeyOut=‘1’時,允許矩陣鍵盤輸出按鍵碼,;當enKeyOut=‘0’時,,禁止矩陣鍵盤輸出按鍵碼。ClrKey用于清除鍵盤緩存狀態(tài)指示位KeyData(7),,當ClrKey=‘0’時,,置KeyData(7)為‘O’。
鍵盤編碼輸出模塊的VHDL語言實現(xiàn)如下:
鍵盤編碼輸出模塊的時序仿真圖如圖5所示,。
2.4 接口模塊(PCPORT)的功能與時序仿真
該模塊用于實現(xiàn)CPU讀入鍵盤碼以及矩陣鍵盤控制信號的輸出,。開始時,CPU首先應通過該模塊送出OSCEn=‘1’信號,,使振蕩器模塊(OSC)和時鐘產(chǎn)生模塊(CreatClock)開始工作,,產(chǎn)生驅動掃描模塊工作的時鐘信號F3kHz:接下來送出鍵盤禁止信號enKeyOut=0;禁止矩陣鍵
盤在穩(wěn)定工作前隨機輸出按鍵值,;其次送出清除鍵盤緩存狀態(tài)指示位的ClrKey信號,;最后再送出鍵盤使能信號enKeyOut=‘1’,開始模塊掃描鍵盤工作,。接口模塊的時序仿真圖如圖6所示,。
2.5 其他模塊的功能
振蕩器模塊(OSC)為利用Altera公司的IP核產(chǎn)生的MAXII系列CPLD內帶的振蕩器,用于在使能信號的控制下產(chǎn)生3.3 MHz的時鐘輸出,。
時鐘產(chǎn)生模塊(CreatClock),,用于將3.3 MHz的時鐘分頻產(chǎn)生3 KHz的鍵盤掃描時鐘,,驅動整個鍵盤掃描模塊工作。
3 控制軟件的設計
本文軟件設計的基本思想是:CPU利用定時中斷查詢矩陣鍵盤狀態(tài)并讀入矩陣鍵盤的按鍵碼,,如果按鍵碼為需要立即響應的特殊功能鍵(如熱啟動鍵),,即在中斷服務程序中作出處理,否則直接送入與標準鍵盤共用的鍵盤緩沖區(qū),,在鍵盤緩沖區(qū)與標準鍵盤送來的按鍵碼一起排隊等待CPU響應處理,,從而實現(xiàn)雙鍵盤同時工作。在向鍵盤緩沖區(qū)寫入按鍵值時,,必須使用DOS軟中斷,,否則會由于中斷優(yōu)先級的原因而使新寫入的按鍵碼得不到響應。
矩陣鍵盤的控制軟件采用C語言編制,,利用PC104的定時器中斷定時查詢矩陣鍵盤,,如果有鍵值,將其存入PC104的鍵盤緩沖區(qū),,等待PC104使用,。控制程序的源碼如下:
4 測試結果
本文所述的鍵盤掃描模塊已經(jīng)在多功能電法接收機中使用,,在使用過程中對矩陣鍵盤的響應時間,、準確度、CPU處理時間占用,、以及雙鍵盤同時工作性能等指標進行了測試分析,,結果如下:
1)矩陣鍵盤響應時間和準確度測試,理論上計算矩陣鍵盤的最短響應時間為T=t1+t2+t3+t4=55.9 ms(其中,,t1為防抖動延時時間30ms,;t2鍵盤掃描最短用時,共掃描2次用22個F3 kHz時鐘周期6.6 ms,;t3為鍵盤值暫存時間,,3個F3kHz時鐘周期1 ms;t4為查詢鍵盤中斷間隔18.3 ms),,考慮到操作鍵盤的速度,,測試方法為全部16個鍵以3次/s的速度連續(xù)按6次,間隔5 s換一個鍵,,將鍵值輸出到顯示器觀察輸入情況,,測試結果為:總按鍵數(shù):96;顯示按鍵數(shù):96,;漏判按鍵數(shù):0,;錯判按鍵數(shù):0;準確率:100%,。
2)矩陣鍵盤占用CPU時間分析,,通過對矩陣鍵盤按鍵值的讀入程序分析可知,,當允許矩陣鍵盤輸出且有鍵按下時,每次中斷服務程序需要額外執(zhí)行8條語句,,大約用時4μs,;當允許矩陣鍵盤輸出且沒有鍵按下時,每次中斷服務程序需要額外執(zhí)行3條語句,,大約用時1.5μs,;與CPU完成矩陣鍵盤掃描工作(假設從鍵按下到釋放一般用時300 ms)相比,一次按鍵讀入CPU占用時間節(jié)省99.998%,。
3)雙鍵盤同時工作測試,測試方法將矩陣鍵盤和標準鍵盤同時接入系統(tǒng),,按1次/s的速度交替按兩鍵盤的按鍵100個,,在顯示器上觀察按鍵輸出情況,得出雙鍵盤工作可靠性數(shù)據(jù)如下:總按鍵數(shù):200,;顯示按鍵數(shù)200,;漏判按鍵數(shù):0;錯判按鍵數(shù):0,;準確率:100%,。因此,該模塊可以實現(xiàn)雙鍵盤同時工作,。
5 結論
該模塊經(jīng)過測試和使用,,得出如下結論:1)基于CPLD的矩陣鍵盤掃描模塊占用CPU時間很少;2)可以實現(xiàn)雙鍵盤同時工作,;3)誤判,、漏判率低;4)反應速度快,,能夠處理組合鍵,。測試結果表明,該方案滿足設計要求,。該模塊以按鍵的放開控制按鍵編碼輸出,,因此在鍵按下一段時間后到釋放按鍵之前不能按一定的間隔連續(xù)輸出按下鍵的鍵值,矩陣鍵盤沒有連續(xù)按鍵輸出功能,。鍵盤碼的讀入采用PC104定時器中斷(18.3 ms一次)定時查詢的方式實現(xiàn),,在大多數(shù)情況下都不會查詢到按鍵事件發(fā)生,也就是說矩陣鍵盤占用的比較少的CPU處理時間中絕大部分被白白浪費,。如果能夠修改接口模塊實現(xiàn)更靈活的按鍵外中斷觸發(fā)方式讀入鍵值,,還可以節(jié)省更多的時間。