官术网_书友最值得收藏!

3.5 矩陣式鍵盤的識別

矩陣式鍵盤由多個鍵排列而成,鍵開關(guān)被排列成M(行)×N(列)的矩陣結(jié)構(gòu),每個鍵開關(guān)位于行和列的交叉處。其連接示意圖如圖3-20所示。

圖3-20 矩陣式鍵盤工作原理示意圖

課件 矩陣式鍵盤掃描與識別方法

視頻 矩陣式鍵盤掃描與識別方法

圖3-20所展示的是4×4矩陣式鍵盤,共有16個鍵位,只用了P1口的8根口線[一般來講M(行)×N(列)矩陣式鍵盤所需要的口線數(shù)為M+N條]。與獨(dú)立式鍵盤相比,更加節(jié)省系統(tǒng)的I/O口資源。無論是獨(dú)立式鍵盤還是矩陣式鍵盤,其檢測方法都是通過檢測對應(yīng)口線是否為低電平來判斷按鍵是否被按下。但是矩陣式鍵盤的檢測要比獨(dú)立式鍵盤復(fù)雜得多。

矩陣式鍵盤的檢測主要有兩種方法:一種是逐行掃描法;另一種是行列反轉(zhuǎn)法。

1.逐行掃描法

觀察圖3-20所示的4×4矩陣式鍵盤,可以看到,在接口電路中有4條行線和4條列線分別接到每個按鍵開關(guān)的左右兩端。其中,4條行線的連接口線工作在輸出方式,4條列線的連接口線工作在輸入方式。

圖3-21 逐行掃描法的工作流程

逐行掃描法的工作流程如圖3-21所示。

首先CPU對4條行線置0,然后CPU從列線上讀入數(shù)據(jù),若讀入的數(shù)據(jù)全為1,表示無鍵按下,則結(jié)束掃描。只要讀入的數(shù)據(jù)中有一個不為1,則表示有鍵被按下。

接著,CPU先使第0行為0,其余3行為1,讀入全部列,若全為1,表示按鍵不在此行;接著向下掃描,使第1行為0,其余各行為1,再讀入全部列,若全為1,表示按鍵不在此列;然后重復(fù)上述步驟。直至第N行為0時,第M列也為0,則表明該按鍵位于第N行第M列。

2.行列反轉(zhuǎn)法

使用逐行掃描法需要進(jìn)行整個鍵盤的多次掃描,判斷過程較為復(fù)雜。使用行列反轉(zhuǎn)法可以克服這些問題,并加快按鍵的檢測速度。

使用行列反轉(zhuǎn)法的步驟如下:

(1)使矩陣式鍵盤連接行線的口線工作在輸出方式,連接列線的口線工作在輸入方式。CPU先向全部行線上輸出0,然后讀取列線上的電平。若有按鍵被按下,必然有一個列線為低電平;否則,表示沒有按鍵被按下,不必再進(jìn)行檢測。

(2)若檢測到某個列線為低電平之后,重新設(shè)置鍵盤行線的連接口線工作于輸入方式,列線工作于輸出方式,并將剛剛得到的列線值再次從列線上輸出,此時檢測所有行線上的電平,必然得到一個行線為低電平的行線值。

(3)將得到的行線值與列線值組合在一起,即為該按鍵的編碼值。將得到的鍵值與事先準(zhǔn)備好的所有按鍵的鍵值編碼比較,就知道哪個按鍵被按下了。

比如第2行第3列的按鍵被按下,采用行列反轉(zhuǎn)法,其工作過程見表3-3。

表3-3 行列反轉(zhuǎn)法工作過程表

【課堂練習(xí)】4×3矩陣式鍵盤的行列反轉(zhuǎn)法檢測。使用4×3矩陣式鍵盤與51單片機(jī)的P1口相連,按鍵后,在共陰極數(shù)碼管上會顯示所按鍵位代表的數(shù)字。電路連接如圖3-22所示。

圖3-22 編碼鍵盤的使用

【分析】這里使用的是自定義的4×3矩陣式鍵盤,其內(nèi)部結(jié)構(gòu)與普通的4×4矩陣式鍵盤基本一樣,只是少了一列。使用行列反轉(zhuǎn)法進(jìn)行鍵盤掃描,先畫出鍵盤連接的示意圖如圖3-22所示。下面仍以4×4矩陣式鍵盤為例進(jìn)行分析,只是在計算結(jié)果時要去掉最右側(cè)一列?,F(xiàn)在假設(shè)按下的鍵位是數(shù)字5這個鍵,先使P1口的值為0xf0(即低4位接行檢測線,高4位接列檢測線)。數(shù)字5鍵按下后,P1.1與P1.5連通,P1.1原為低電平,因此P1.5也變成了低電平,其他的不變。此時,獲取列檢測線上的值為1101B并保存起來。接著改變P1口的輸入/輸出狀態(tài),將低4位變?yōu)檩敵?,?位變?yōu)檩斎?;然后將剛獲取的列檢測線值,輸入P1口的高4位,同樣因為P1.1與P1.5已經(jīng)相連,所以瞬間P1.1也由原來的高電平變?yōu)榈碗娖?,其他各口線不改變,此時獲取行檢測線上的值為1101B。現(xiàn)在將獲取到的列檢測線值和行檢測線值組合在一起,形成1字節(jié),即11011101B,轉(zhuǎn)換成十六進(jìn)制為0xdd,這就是數(shù)字5鍵對應(yīng)的鍵盤編碼值。按照上面的分析,寫出該鍵盤上各鍵的編碼值,見表3-4。在程序中只要將獲取到的編碼與表3-4進(jìn)行比較即可得到該次按鍵的鍵名所代表的數(shù)值。

表3-4 4×3矩陣式鍵盤的編碼表

要將按鍵對應(yīng)的鍵名數(shù)值在數(shù)碼管上顯示出來,還需要為數(shù)碼管設(shè)定一下段選碼表,將段選碼表與鍵盤的鍵名數(shù)字在位置上一一對應(yīng)起來,就可以實(shí)現(xiàn)按下某一鍵,立刻在數(shù)碼管上顯示出相應(yīng)的數(shù)字來。

參考程序如下:

程序中scanKey(?。┻@個函數(shù)就是行列反轉(zhuǎn)法的代碼實(shí)現(xiàn),該函數(shù)返回的數(shù)值就是當(dāng)前按鍵值在整個鍵盤編碼中的位置,結(jié)合數(shù)碼管模塊的動態(tài)顯示程序,能實(shí)現(xiàn)更多、更復(fù)雜信息的錄入顯示功能。

主站蜘蛛池模板: 邵武市| 镇宁| 太湖县| 若羌县| 浮梁县| 凉城县| 蒙城县| 连平县| 沧源| 大庆市| 屯留县| 鱼台县| 贡觉县| 沙湾县| 仁布县| 云南省| 红河县| 牟定县| 台中市| 增城市| 江陵县| 丰原市| 青川县| 洛宁县| 基隆市| 沅陵县| 六盘水市| 呼伦贝尔市| 石门县| 会理县| 成都市| 陈巴尔虎旗| 蒙阴县| 秦安县| 扬州市| 兴山县| 都昌县| 蚌埠市| 邵武市| 滕州市| 浙江省|