|
確定矩陣式鍵盤上何鍵被按下,介紹一種“行掃描法”。 行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法. 判斷鍵盤中有無鍵按下: 將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。 判斷閉合鍵所在的位置: 在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。 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)用延時去抖 ajmp key ;返回繼續(xù)檢測按鍵 k1: lcall delay2 lcall delay2 ;有鍵按下延時去抖動 lcall ks ;再調(diào)用檢測按鍵程序 jnz k2 ;確認有按下進行下一步 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)到鍵值理程序進行鍵值處理 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)用延時去抖動程序 lcall ks ;調(diào)用按鍵檢測程序 jnz k4 ;按鍵沒有松開繼續(xù)返回檢測 pop acc ;將堆棧的值送入acc ret next: inc r4 ;將列值加一 MOV a,r2 ;將r2的值送入a jnb acc.7,key ;掃描完至key處進行下一掃描 rl a ;掃描未完將a中的值右移一位進行下一列的掃描 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延時去抖動子程序 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 輪流顯示鍵盤因為無法表達*# 就用h表示,b用8表示 end |