;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 4*4键盘程序
;******************************************************
;* 名称:readkyeboard
;* 功能:从键盘中读入按键值,存入寄存器A
;* 调用函数: key_on delay10ms key_p key_ccode
;* 输入:
;* 输出: A=按键值
;* 使用的寄存器:R2,R3,R5,R6,R7
******************************************************
readkeyboard:
begin: acall key_on ;判断有无键按下
jnz delay
ajmp readkeyboard
delay:acall delay10ms ;消除抖动
acall key_on
jnz key_num ;有键按下,转定按键位置
ajmp begin
key_num:acall key_p ;调定键位置子程序
anl a,#0FFh
jz begin ; 出错继续扫描
acall key_ccode ;对按键编码
push a
key_off:acall key_on ;等待按键释放
jnz key_off
pop a
ret
;<<<<<<<<< 判断是否有键按下子程序
key_on: mov a,#00h
orl a,#0fh
mov p1,a
mov a,p1
orl a,#0f0h
cpl a
ret
;<<<<<<<<<<<<<<编码程序
key_p:
mov r7,#0efh ; R7存列扫描值
l_loop:mov a,r7
mov p1,a
mov a,p1
orl a,#0f0h
mov r6,a ; R6存行读入值
cpl a
jz next
ajmp key_c
next: mov a,r7
jnb acc.7,error
rl a
mov r7,a
ajmp l_loop
error:mov a,#00h
ret
key_c:mov r2,#00h ;r2 行号
mov r3,#00h ;r3 列号
mov a,r6
mov r5,#04h
again1:jnb acc.0,out1
rr a
inc r2
djnz r5, again1
out1: inc r2
mov a,r7
mov r5,#04h
again2:jnb acc.4,out2
rr a
inc r3
djnz r5,again2
out2: inc r3
mov a, r2
swap a
add a,r3
ret
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<解码程序
key_ccode:
push a
swap a
anl a,#0fh
dec a
rl a ;行号乘4
rl a
mov r7,a
pop a
anl a,#0fh
dec a
add a,r7
ret
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<延时10Ms
delay10ms:
anl tmod,#0f0h
orl tmod,#01h
mov th0,#0d8h
mov tl0,#0f0h
setb tr0
wait:jbc tf0,over
ajmp wait
clr tr0
over:ret