《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 設計應用 > 基于CPLD的矩陣鍵盤掃描模塊設計
基于CPLD的矩陣鍵盤掃描模塊設計
電子設計工程
鄭采君
摘要: 為了在不增加CPU工作負擔的前提下,實現標準鍵盤和矩陣鍵盤雙鍵盤同時工作,提出了一種基于復雜可編邏輯器件(CPLD)的矩陣鍵盤掃描方案,實現了在矩陣鍵盤狀態控制下CPLD自動完成鍵盤掃描、編碼、輸出的功能,CPU通過定時器中斷服務程序定時查詢矩陣鍵盤狀態,并將按鍵值直接送入鍵盤緩沖區,供其他程序使用。給出了CPLD部分模塊的VHDL語言實現和仿真波形。在矩陣鍵盤的掃描、編碼、輸出完全不需CPU控制的前提下,實現標準鍵盤和矩陣鍵盤雙鍵盤同時使用。
關鍵詞: CPLD 矩陣鍵盤
Abstract:
Key words :

  在基于PC104的便攜式野外測試設備的設計中,鍵盤是常用的輸入設備。對于便攜式設備野外工作時,一般使用小型(4x4)矩陣鍵盤就能滿足設備的信息輸入需要;室內調試時,使用標準PS2鍵盤更方便、靈活。一般的做法是保留PC104的鍵盤接口用于接標準鍵盤,利用擴展I/O接口完成小矩陣鍵盤的掃描和輸入。這樣做雖然可以實現設備雙鍵盤同時工作的功能,卻需耗費大量的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”的掃描碼觸發鍵盤掃描功能開始鍵盤掃描,掃描開始后,依次將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最小值就可以處理組合鍵。根據記錄的Kreg值可以判斷是哪個或哪幾個鍵按下,據此編碼按鍵值后輸出。將KX[3..0]置為“0000”,等待下一次按鍵發生。



2 基于CPLD的4x4矩陣鍵盤掃描模塊設計
   
根據上述掃描原理和工作流程,如果以PC104 CPU實現上述矩陣鍵盤的掃描過程,那么在有鍵按下后,CPU必須不停地掃描矩陣鍵盤電路,在此期間不能進行其他工作,降低了CPU工作效率,且CPU連續高速運轉增加系統功耗。
    本文的目的就是在不需要CPU參與的條件下以CPLD完成矩陣鍵盤按鍵事件觸發、按鍵的掃描定位以及按鍵的編碼和鍵值輸出工作,CPU只需要定時查詢有無鍵按下并讀走按下鍵的按鍵值送入鍵盤緩沖區。這樣就使CPU從繁重的矩陣鍵盤掃描工作中解脫出來。根據上述鍵盤掃描工作原理,基于CPLD的4x4矩陣鍵盤掃描模塊功能框圖如圖2所示。


    圖中,模塊KeyTri在時鐘信號CLK的控制下實現按鍵事件觸發和矩陣鍵盤掃描時序產生功能;模塊keycode在時鐘信號CLK和掃描時序碼SCode的控制下完成輸出鍵盤掃描碼KX,同時記錄16位鍵盤掃描數據等工作,并在所有鍵抬起后對按下的鍵編碼完成輸出功能;模塊nread實現按鍵碼的暫存、按鍵狀態的置位和清除以及矩陣鍵盤的使能;模塊PCPORT完成矩陣鍵盤與CPU的接口;模塊OSC與CreatClock產生控制鍵
盤掃描模塊工作的3 KHz時鐘信號CLK。
2.1 鍵盤掃描觸發模塊(KeyTri)的功能與時序仿真
   
鍵盤掃描過程中,掃描信號不停變化,以判斷鍵盤按鍵的按下和抬起。高速變化的鍵盤掃描信號不僅使系統功耗增加,而且還會對其他敏感電路造成干擾。因此在本設計中將鍵盤掃描模式設計成鍵按下觸發掃描方式,只有當鍵盤有鍵按下后,才觸發鍵盤掃描電路產生掃描鍵盤時序,所有鍵都放開后,停止對鍵盤的掃描,使電路處于相對靜止狀態,以減少對其他電路的干擾。
    鍵盤按下時會有抖動,在按鍵抖動時掃描鍵盤,可能會使鍵盤掃描電路產生誤判,因此在鍵盤按下與開始掃描之間應加入一段延時,延時結束后按鍵仍處于按下狀態,才允許開始鍵盤掃描,這樣做可以最大限度地避免掃描電路的誤判和漏判。
    鍵盤掃描觸發模塊實現的功能為:在KX="0000"的狀態下,如果有任意一個鍵被按下,KY必然不全為‘1’,觸發延時功能開始延時,延時結束后,如果KY仍不全為‘1’,說明該按鍵事件有效,啟動掃描時序產生1H~BH的4位循環掃描時序碼,控制后續的鍵盤掃描電路對鍵盤掃描,當ReSet變低時,立即將掃描時序碼置為OH,停止本次鍵盤掃描并等待下一次鍵盤按下事件到來。鍵盤掃描觸發模塊的VHDL語言實現如下:
   
   
   
    鍵盤掃描觸發模塊的時序仿真如圖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]譯碼產生按鍵編碼并輸出。有一個鍵按下,16位的鍵盤掃描值中有且只有一位為O,多鍵組合按下時,鍵盤掃描值中就會有多個位為‘0’,因此在鍵盤掃描過程中,記錄最小的鍵盤掃描值,使得掃描模塊不僅能夠處理單鍵,而且可以處理多鍵組合。具體工作過程說明如下:
    當SCode [3..0]=0時,KX="0000",置16位鍵盤掃描值Kscan[15..0]和Kreg[15..0]為全‘1’,此時無論哪一個鍵按下,都可使KY不全為‘1’,從而觸發掃描模塊工作;
    當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]     當SCode[3..0]=11且記錄Kscan[15..0]各位為全“1”時,產生鍵盤復位信號ReSet,結束本次鍵盤掃描。
    鍵盤掃描與編碼輸出模塊的核心模塊VHDL語言實現如下:
   
   
   
    鍵盤掃描與編碼輸出模塊的時序仿真圖如圖4所示。


2.3 鍵盤編碼輸出模塊(nread)的功能與時序仿真
   
在該模塊中,KeyrData的最高位KeyData(7)為鍵盤緩存狀態指示位,當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用于清除鍵盤緩存狀態指示位KeyData(7),當ClrKey=‘0’時,置KeyData(7)為‘O’。
    鍵盤編碼輸出模塊的VHDL語言實現如下:
   

    鍵盤編碼輸出模塊的時序仿真圖如圖5所示。


2.4 接口模塊(PCPORT)的功能與時序仿真
   
該模塊用于實現CPU讀入鍵盤碼以及矩陣鍵盤控制信號的輸出。開始時,CPU首先應通過該模塊送出OSCEn=‘1’信號,使振蕩器模塊(OSC)和時鐘產生模塊(CreatClock)開始工作,產生驅動掃描模塊工作的時鐘信號F3kHz:接下來送出鍵盤禁止信號enKeyOut=0;禁止矩陣鍵
盤在穩定工作前隨機輸出按鍵值;其次送出清除鍵盤緩存狀態指示位的ClrKey信號;最后再送出鍵盤使能信號enKeyOut=‘1’,開始模塊掃描鍵盤工作。接口模塊的時序仿真圖如圖6所示。


2.5 其他模塊的功能
   
振蕩器模塊(OSC)為利用Altera公司的IP核產生的MAXII系列CPLD內帶的振蕩器,用于在使能信號的控制下產生3.3 MHz的時鐘輸出。
    時鐘產生模塊(CreatClock),用于將3.3 MHz的時鐘分頻產生3 KHz的鍵盤掃描時鐘,驅動整個鍵盤掃描模塊工作。

3 控制軟件的設計
   
本文軟件設計的基本思想是:CPU利用定時中斷查詢矩陣鍵盤狀態并讀入矩陣鍵盤的按鍵碼,如果按鍵碼為需要立即響應的特殊功能鍵(如熱啟動鍵),即在中斷服務程序中作出處理,否則直接送入與標準鍵盤共用的鍵盤緩沖區,在鍵盤緩沖區與標準鍵盤送來的按鍵碼一起排隊等待CPU響應處理,從而實現雙鍵盤同時工作。在向鍵盤緩沖區寫入按鍵值時,必須使用DOS軟中斷,否則會由于中斷優先級的原因而使新寫入的按鍵碼得不到響應。
    矩陣鍵盤的控制軟件采用C語言編制,利用PC104的定時器中斷定時查詢矩陣鍵盤,如果有鍵值,將其存入PC104的鍵盤緩沖區,等待PC104使用。控制程序的源碼如下:


4 測試結果
   
本文所述的鍵盤掃描模塊已經在多功能電法接收機中使用,在使用過程中對矩陣鍵盤的響應時間、準確度、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的速度連續按6次,間隔5 s換一個鍵,將鍵值輸出到顯示器觀察輸入情況,測試結果為:總按鍵數:96;顯示按鍵數:96;漏判按鍵數:0;錯判按鍵數:0;準確率:100%。
    2)矩陣鍵盤占用CPU時間分析,通過對矩陣鍵盤按鍵值的讀入程序分析可知,當允許矩陣鍵盤輸出且有鍵按下時,每次中斷服務程序需要額外執行8條語句,大約用時4μs;當允許矩陣鍵盤輸出且沒有鍵按下時,每次中斷服務程序需要額外執行3條語句,大約用時1.5μs;與CPU完成矩陣鍵盤掃描工作(假設從鍵按下到釋放一般用時300 ms)相比,一次按鍵讀入CPU占用時間節省99.998%。
    3)雙鍵盤同時工作測試,測試方法將矩陣鍵盤和標準鍵盤同時接入系統,按1次/s的速度交替按兩鍵盤的按鍵100個,在顯示器上觀察按鍵輸出情況,得出雙鍵盤工作可靠性數據如下:總按鍵數:200;顯示按鍵數200;漏判按鍵數:0;錯判按鍵數:0;準確率:100%。因此,該模塊可以實現雙鍵盤同時工作。

5 結論
   
該模塊經過測試和使用,得出如下結論:1)基于CPLD的矩陣鍵盤掃描模塊占用CPU時間很少;2)可以實現雙鍵盤同時工作;3)誤判、漏判率低;4)反應速度快,能夠處理組合鍵。測試結果表明,該方案滿足設計要求。該模塊以按鍵的放開控制按鍵編碼輸出,因此在鍵按下一段時間后到釋放按鍵之前不能按一定的間隔連續輸出按下鍵的鍵值,矩陣鍵盤沒有連續按鍵輸出功能。鍵盤碼的讀入采用PC104定時器中斷(18.3 ms一次)定時查詢的方式實現,在大多數情況下都不會查詢到按鍵事件發生,也就是說矩陣鍵盤占用的比較少的CPU處理時間中絕大部分被白白浪費。如果能夠修改接口模塊實現更靈活的按鍵外中斷觸發方式讀入鍵值,還可以節省更多的時間。

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
一本一本久久| 免费不卡在线视频| 亚洲精品免费网站| 久久99在线观看| 午夜日韩视频| 亚洲欧美日韩国产精品| 一区二区三区国产| 999亚洲国产精| 亚洲精品一区在线观看| 亚洲人成在线观看网站高清| 亚洲第一精品夜夜躁人人躁| 在线观看成人av| 极品少妇一区二区三区| 国内精品久久国产| 国内精品久久久久影院优| 国产一区二区三区久久| 国产一区二区精品丝袜| 国外成人性视频| 一区二区三区在线高清| 黄色一区二区在线| 在线观看一区| 亚洲精品乱码久久久久久| 亚洲精品久久久蜜桃| 日韩一级欧洲| 亚洲午夜激情| 亚洲欧美日韩中文播放| 欧美一级在线视频| 亚洲第一精品在线| 亚洲精品乱码久久久久久| 亚洲精品视频在线播放| 一区二区三区福利| 亚洲免费视频网站| 欧美中文字幕在线视频| 久久免费的精品国产v∧| 美女黄色成人网| 欧美黄色影院| 国产精品成人一区| 国产日韩欧美a| 伊人成人在线| 日韩视频免费观看高清在线视频| 日韩视频在线免费观看| 亚洲天堂网站在线观看视频| 午夜欧美电影在线观看| 亚洲国产一成人久久精品| 日韩视频精品| 午夜精品成人在线视频| 久久久99爱| 欧美福利视频网站| 国产精品久久久久9999高清| 国产日韩在线一区二区三区| 精品9999| 99热免费精品| 欧美在线免费播放| 亚洲美女毛片| 欧美一区二区三区男人的天堂| 久久免费视频网站| 欧美日韩激情小视频| 国产精品一页| 亚洲国产欧美在线人成| 中文一区二区在线观看| 亚洲第一精品夜夜躁人人爽 | 亚洲一区免费网站| 久久大逼视频| 中文av一区二区| 久久久久国产精品www| 欧美日韩一区二区免费视频| 国产三级欧美三级| 亚洲精品视频在线观看免费| 性欧美18~19sex高清播放| 一本久久青青| 鲁大师影院一区二区三区| 国产精品vvv| 亚洲国产精品一区制服丝袜 | 久久国产欧美| 亚洲尤物视频在线| 欧美aa在线视频| 国产亚洲欧美在线| 在线一区欧美| 亚洲老司机av| 麻豆av一区二区三区久久| 国产精品美女999| 亚洲精品黄色| 亚洲电影免费观看高清| 欧美亚洲一区二区三区| 欧美精品国产一区二区| 韩国在线视频一区| 亚洲图片欧美午夜| 一本色道88久久加勒比精品| 久久一区精品| 国产日韩欧美一二三区| 一区二区欧美日韩| 99视频精品在线| 六月婷婷一区| 国内精品视频在线播放| 亚洲综合色激情五月| 制服丝袜亚洲播放| 欧美韩日高清| 亚洲高清在线观看一区| 欧美一级视频精品观看| 午夜激情综合网| 欧美午夜精品久久久久久人妖| 91久久中文| 最新国产成人av网站网址麻豆 | 国产精品亚洲不卡a| 日韩一级在线观看| 99亚洲伊人久久精品影院红桃| 美女网站久久| 伊人夜夜躁av伊人久久| 久久激情久久| 久久久久久久97| 国产一区二区精品久久| 午夜精品在线观看| 欧美在线观看一区二区三区| 国产精品五月天| 亚洲自拍16p| 先锋影音久久| 国产精品日韩在线一区| 国产精品99久久久久久久久久久久| 一本色道久久88综合亚洲精品ⅰ| 欧美风情在线| 亚洲精品日韩在线| 亚洲图片欧美一区| 国产精品久久久久久亚洲调教| 亚洲天堂av综合网| 午夜视频在线观看一区二区三区| 国产精品国产自产拍高清av王其| 一区二区三区高清在线观看| 亚洲永久精品国产| 国产精品视频免费观看| 午夜视频久久久久久| 久久久美女艺术照精彩视频福利播放| 国产亚洲一区二区三区在线播放| 欧美综合国产| 欧美大片免费观看| aⅴ色国产欧美| 亚洲欧美国产精品桃花| 国产欧美在线看| 久久黄色级2电影| 欧美福利一区二区| 日韩写真视频在线观看| 亚洲欧美日韩精品| 国产欧美91| 亚洲成人直播| 欧美日韩精品免费观看| 在线亚洲电影| 久久久久久综合网天天| 亚洲第一区在线观看| 99re6这里只有精品| 欧美日韩亚洲系列| 亚洲在线观看免费| 久热精品视频在线观看一区| 亚洲国产精品热久久| 亚洲无亚洲人成网站77777| 国产伦精品一区二区三区照片91| 亚洲大片精品永久免费| 欧美日韩国产成人在线观看| 亚洲天堂av综合网| 久久夜色精品国产欧美乱极品 | 亚洲视频在线观看三级| 国产精品手机视频| 久久精品国产免费| 欧美日本国产在线| 亚洲欧美成人一区二区在线电影 | 亚洲欧美在线网| 国内精品久久久| 日韩一级在线| 国产日产精品一区二区三区四区的观看方式| 久久精品观看| 欧美私人网站| 亚洲成人在线视频播放 | 最新成人av网站| 亚洲欧美日韩专区| 一区二区三区亚洲| 亚洲一区二区在线观看视频| 国产一区二区三区免费在线观看| 亚洲美女精品成人在线视频| 国产精品亚洲а∨天堂免在线| 亚洲日本va在线观看| 国产精品美女久久| 亚洲日本在线观看| 国产精品夜夜夜一区二区三区尤| 亚洲第一黄色| 国产精品美女久久久| 亚洲日韩视频| 国产日韩欧美高清免费| 一区二区三区视频观看| 国产一区二区三区四区三区四| 中文在线一区| 在线观看不卡| 欧美在线综合视频| 一区二区三区欧美亚洲| 欧美v亚洲v综合ⅴ国产v| 亚洲欧美成人精品| 欧美日韩亚洲一区二区三区在线 | 亚洲一区二区三区成人在线视频精品| 久久久久99精品国产片| 一区二区三区欧美成人| 欧美激情精品久久久六区热门 | 久久久www| 亚洲午夜免费视频|