在图示电路中,用 p1 口接一个 4 x 4 键盘。设: so-s9 为数字键,键值为 0-9 ,用于向单片机系统输入数据; s10-s15 为命令键,键值为 a-f ,用于对计算机系统送操作命令;每键只 1 个功能;行线接 p1 口的高 4 位;列线接 p1 口的低 4 位。
(1)键盘扫描子程序
key: mov a, #0f 0h
mov p1,a
xrl a,p1
jz keyr ;无键按下返回
acall delay ;延时去抖动
mov 30h,p1 ;读闭合键行位置
mov p1,#0fh ;反转
mov a,p1 ;读闭合键列位置
orl 30h,a ;合成键盘位置码
loop: mov a,p1 ;等待键释放
xrl a, #0fh
jnz loop
acall delay ;延时去抖动
keyr : ret
(2)键值转换
键盘矩阵中各键的位置码的特点是:对应该键行、列的位为“ 0 ” ,其他各位均为“ 1 ” 。例如: s7 键的位置码是: 11010111b = 0d7h ; s12 键的位置码是: 01111110b = 7eh 。将各键的位置码顺序排列成键值表,用查表法进行键值转换。
键值转换子程序
tran: mov dptr,#keytab ; dptr 指向键值表
mov r2,#0 ;键值初值送 r2
mov r3,#10h ;循环次数送 r3
loopt: mov a,r2
movc a, @a+dptr ;读键值表
xrl a,30h ;与位置码比较
jz ktr ;相等返回,键值在 r2 中
inc r2 ;键值 +1
djnz r3,loopt
ktr: ret ;若返回时 r2=10h 为错
keytab: db 0eeh,0edh,0ebh,0e7h ;键值表
db 0deh,0ddh,0dbh,0d7h
db 0beh,0bdh,0bbh,0b7h
db 7eh,7dh,7bh,77h