在圖示電路中,用 p1 口接一個(gè) 4 x 4 鍵盤(pán)。設(shè): so-s9 為數(shù)字鍵,鍵值為 0-9 ,用于向單片機(jī)系統(tǒng)輸入數(shù)據(jù); s10-s15 為命令鍵,鍵值為 a-f ,用于對(duì)計(jì)算機(jī)系統(tǒng)送操作命令;每鍵只 1 個(gè)功能;行線接 p1 口的高 4 位;列線接 p1 口的低 4 位。
(1)鍵盤(pán)掃描子程序
key: mov a, #0f 0h
mov p1,a
xrl a,p1
jz keyr ;無(wú)鍵按下返回
acall delay ;延時(shí)去抖動(dòng)
mov 30h,p1 ;讀閉合鍵行位置
mov p1,#0fh ;反轉(zhuǎn)
mov a,p1 ;讀閉合鍵列位置
orl 30h,a ;合成鍵盤(pán)位置碼
loop: mov a,p1 ;等待鍵釋放
xrl a, #0fh
jnz loop
acall delay ;延時(shí)去抖動(dòng)
keyr : ret
(2)鍵值轉(zhuǎn)換
鍵盤(pán)矩陣中各鍵的位置碼的特點(diǎn)是:對(duì)應(yīng)該鍵行、列的位為“ 0 ” ,其他各位均為“ 1 ” 。例如: s7 鍵的位置碼是: 11010111b = 0d7h ; s12 鍵的位置碼是: 01111110b = 7eh 。將各鍵的位置碼順序排列成鍵值表,用查表法進(jìn)行鍵值轉(zhuǎn)換。
鍵值轉(zhuǎn)換子程序
tran: mov dptr,#keytab ; dptr 指向鍵值表
mov r2,#0 ;鍵值初值送 r2
mov r3,#10h ;循環(huán)次數(shù)送 r3
loopt: mov a,r2
movc a, @a+dptr ;讀鍵值表
xrl a,30h ;與位置碼比較
jz ktr ;相等返回,鍵值在 r2 中
inc r2 ;鍵值 +1
djnz r3,loopt
ktr: ret ;若返回時(shí) r2=10h 為錯(cuò)
keytab: db 0eeh,0edh,0ebh,0e7h ;鍵值表
db 0deh,0ddh,0dbh,0d7h
db 0beh,0bdh,0bbh,0b7h
db 7eh,7dh,7bh,77h