新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > 基于CPLD的矩陣鍵盤掃描模塊設計

        基于CPLD的矩陣鍵盤掃描模塊設計

        作者: 時間:2010-12-20 來源:網絡 收藏


        觸發模塊的時序仿真如圖3所示。

        本文引用地址:http://www.104case.com/article/191430.htm


        在圖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]Kreg[15..0],將Kscan[15..O]保存到Kreg[15..0];否則對Kreg[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語言實現如下:



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 玉林市| 股票| 西昌市| 永吉县| 闵行区| 清苑县| 清丰县| 英山县| 察哈| 广饶县| 许昌县| 沾益县| 金秀| 高雄市| 宜兰市| 易门县| 远安县| 遂宁市| 五莲县| 平和县| 桦川县| 加查县| 北碚区| 霍林郭勒市| 南丹县| 铅山县| 昆明市| 福贡县| 三台县| 通州区| 南丹县| 莱芜市| 霸州市| 琼海市| 安达市| 镇江市| 武穴市| 墨玉县| 安国市| 山西省| 玉环县|