來源:學(xué)林電子 作者: 矩陣式鍵盤的結(jié)構(gòu)與工作原理: 在鍵盤中按鍵數(shù)量較多時(shí),為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P1口)就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時(shí),采用矩陣法來做鍵盤是合理的。 矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識(shí)別也要復(fù)雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時(shí),所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會(huì)被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。具體的識(shí)別及編程方法如下所述。 - 矩陣式鍵盤的按鍵識(shí)別方法
確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。 行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識(shí)別方法,如上圖所示鍵盤,介紹過程如下。 - 判斷鍵盤中有無鍵按下 將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。
- 判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
下面給出一個(gè)具體的例子: 8031單片機(jī)的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個(gè)上拉電阻到正電源+5V,并把列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個(gè)相交點(diǎn)。 - 檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。
- 去除鍵抖動(dòng)。當(dāng)檢測到有鍵按下后,延時(shí)一段時(shí)間再做下一步的檢測判斷。
- 若有鍵被按下,應(yīng)識(shí)別出是哪一個(gè)鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。P1.4-P1.7按下述4種組合依次輸出:
P1.7 1 1 1 0 P1.6 1 1 0 1 P1.5 1 0 1 1 P1.4 0 1 1 1
實(shí)例程序: ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV DPTR,#TAB ;將表頭放入DPTR LCALL KEY ;調(diào)用鍵盤掃描程序 MOVC A,@A+DPTR ;查表后將鍵值送入ACC MOV P0,A ;將Acc值送入P0口 CLR P2.1 ;開顯示 LJMP MAIN ;返回反復(fù)循環(huán)顯示 KEY: LCALL KS ;調(diào)用檢測按鍵子程序 JNZ K1 ;有鍵按下繼續(xù) LCALL DELAY2 ;無鍵按調(diào)用延時(shí)去抖 AJMP KEY ;返回繼續(xù)檢測按鍵 K1: LCALL DELAY2 LCALL DELAY2 ;有鍵按下延時(shí)去抖動(dòng) LCALL KS ;再調(diào)用檢測按鍵程序 JNZ K2 ;確認(rèn)有按下進(jìn)行下一步 AJMP KEY ;無鍵按下返回繼續(xù)檢測 K2: MOV R2,#0EFH ;將掃描值送入R2暫存 MOV R4,#00H ;將第一列值送入R4暫存 K3: MOV P1,R2 ;將R2的值送入P1口 L6: JB P1.0,L1 ;P1.0等于1跳轉(zhuǎn)到L1 MOV A,#00H ;將第一行值送入ACC AJMP LK ;跳轉(zhuǎn)到鍵值處理程序 L1: JB P1.1,L2 ;P1.1等于1跳轉(zhuǎn)到L2 MOV A,#04H ;將第二行的行值送入ACC AJMP LK ;跳轉(zhuǎn)到鍵值理程序進(jìn)行鍵值處理 L2: JB P1.2,L3 ;P1.2等于1跳轉(zhuǎn)到L3 MOV A,#08H ;將第三行的行值送入ACC AJMP LK ;跳轉(zhuǎn)到鍵值處理程 L3: JB P1.3,NEXT ;P1.3等于1跳轉(zhuǎn)到NEXT處 MOV A,#0cH ;將第四行的行值送入ACC LK: ADD A,R4 ;行值與列值相加后的鍵值送入A PUSH ACC ;將A中的值送入堆棧暫存 K4: LCALL DELAY2 ;調(diào)用延時(shí)去抖動(dòng)程序 LCALL KS ;調(diào)用按鍵檢測程序 JNZ K4 ;按鍵沒有松開繼續(xù)返回檢測 POP ACC ;將堆棧的值送入ACC RET NEXT: INC R4 ;將列值加一 MOV A,R2 ;將R2的值送入A JNB ACC.7,KEY ;掃描完至KEY處進(jìn)行下一掃描 RL A ;掃描未完將A中的值右移一位進(jìn)行下一列的掃描 MOV R2,A ;將ACC的值送入R2暫存 AJMP K3 ;跳轉(zhuǎn)到K3繼續(xù) KS: MOV P1,#0FH ;將P1口高四位置0低四位值1 MOV A,P1 ;讀P1口 XRL A,#0FH ;將A中的值與A中的值相異或 RET ;子程序返回 DELAY2: ;40ms延時(shí)去抖動(dòng)子程序 MOV R5,#08H L7: MOV R6,#0FAH L8: DJNZ R6,L8 DJNZ R5,L7 RET TAB: db 28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,30h,62h,0a2h,7eh ;0h0hc9878654a321 輪流顯示鍵盤因?yàn)闊o法表達(dá)*# 就用H表示,B用8表示 end |