电平,然后从行码地址(OX001H)读回。如果有键按下,则相应行的值应为低,如果无键按下,由于上拉电阻的作用,行码为高。这样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后要有一定的延时,防止键抖动。直至中的X是由KEY/LED CS决定,参见地址码。做键盘和LED实验时,需将KEY/LED CS接到相应的地址译码上。以便用相应的地址来访问。
六、实验框图
数码管显示流程图
9
图5 人机接口实验程序流程图
七、参考程序(省略部分程序自行补充) OUTBIT equ 08002h ; 位控制口 OUTSEG equ 08004h ; 段控制口 IN equ 08001h ; 键盘读入口 LEDBuf equ 60h ; 显示缓冲 ?? ;跳转主程序 LEDMAP: ; 八段管显示码 db ?? db ??
10
Delay: ; 延时子程序 ?? DelayLoop: ?? ?? ?? DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管 mov r2, #00100000b ; Loop:
mov dptr, #OUTBIT mov a, #0
movx @dptr, a ; mov a, @r0
mov dptr, #OUTSEG movx @dptr, a
mov dptr, #OUTBIT mov a, r2
movx @dptr, a ; mov r6, #1 call Delay
mov a, r2 ; rr a
mov r2, a inc r0
djnz r1, Loop ret TestKey:
mov dptr, #OUTBIT mov a, #0
movx @dptr, a ; mov dptr, #IN
movx a, @dptr ; cpl a
?? ; ret
KeyTable: ; db db db db db db
?? ?? ?? ?? ?? ??
从左边开始显示关所有八段管 显示一位八段管显示下一位 输出线置为0 读入键状态 高四位不用 键码定义 11
GetKey:
mov dptr, #OUTBIT mov P2, dph
mov r0, #Low(IN) mov r1, #00100000b mov r2, #6 KLoop:
mov a, r1 ; 找出键所在列 cpl a
movx @dptr, a cpl a rr a
mov r1, a ; 下一列 movx a, @r0 cpl a
anl a, #0fh
jnz Goon1 ; 该列有键入 djnz r2, KLoop
mov r2, #0ffh ; 没有键按下, 返回 0ffh sjmp Exit Goon1:
mov r1, a ; 键值 = 列 X 4 + 行 mov a, r2 dec a rl a rl a
mov r2, a ; r2 = (r2-1)*4 mov a, r1 ; r1中为读入的行值 mov r1, #4 LoopC:
rrc a ; 移位找出所在行 jc Exit
inc r2 ; r2 = r2+ 行值 djnz r1, LoopC Exit:
mov a, r2 ; 取出键码 mov dptr, #KeyTable movc a, @a+dptr mov r2, a WaitRelease:
mov dptr, #OUTBIT ; 等键释放 clr a
movx @dptr, a
12
mov r6, #10 call Delay call TestKey jnz WaitRelease mov a, r2 ret Start:
mov sp, #40h
mov LEDBuf+0, #0ffh ; 显示 8.8.8.8. mov LEDBuf+1, #0ffh mov LEDBuf+2, #0ffh mov LEDBuf+3, #0ffh mov LEDBuf+4, #0 mov LEDBuf+5, #0 MLoop:
call ?? ; 显示
call ?? ; 有键入?
jz ?? ; 无键入, 继续显示 call ?? ; 读入键码 anl a, #0fh ; 显示键码 mov dptr, #LEDMap movc a, @a+dptr mov LEDBuf+5, a
?? ;循环 end
八、思考题
1、对照流程图详细描述八段数码管动态显示和静态显示的基本原理; 2、简述键盘扫描和识别的基本原理和方法;
13