请大神相助,实在不知如何做到,凭空我也想不出来啊,我只能明白如何用用C语言实现,但老师要求是汇编,网上找了一圈没有,我这水平实在有限,坐着想上几天也出不来的啊,上几周已饱受实验课的折磨,实在是有心无力了,希望有懂的人能指点指点
实验六、键盘扫描及其应用
要求
2、掌握本实验中键值编码与显示结果的关系。
3、当多键同时按下时,其优先级如何确定。
4、实现键盘功能0----F排列的行列颠倒。
5、实现按特定功能键分别显示PASS及Err
按照前几周实验看,只需在参考程序上改动就好了
三、参考程序
OUTBIT equ 0e101h ; 位控制口
CLK164 equ 0e102h ; 段控制口(接164时钟位)
DAT164 equ 0e102h ; 段控制口(接164数据位)
IN equ 0e103h ; 键盘读入口
ORG 0000H
LJMP STAR
ORG 0030H
STAR: mov sp,#80h
MOV R0,#7FH ;清零00H--7FH
CLR A
STAR1: MOV @R0,A
DJNZ R0,STAR1
WAIT: MOV DPTR,#0E100H ;8155初始化
MOV A,#03H
MOVX @DPTR,A
MOV 38H,#3fH
MOV 39H,#06H
MOV 3AH,#5bH
MOV 3BH,#4fH
MOV 3CH,#66H
MOV 3DH,#6dH
WAIT1: LCALL GETKEY ;调键值显示
LCALL MLOOP4
;通过8155C口得到被按下键行信号
Jnb 01h, WAIT1 ;无键按下则跳转
LCALL KEY1
MOV 38H,39H
MOV 39H,3AH
MOV 3AH,3BH
MOV 3BH,3CH
MOV 3CH,3DH
MOV A,R7
ANL A,#0FH
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV 3DH,A
SJMP WAIT1
;==========================================================================
TAB1:
Q0124: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ;?.[Ofm}.
Q012C: DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H ;ow|9^yq
TAB2:
DB 0CH, 08H, 04H, 00H, 0DH, 09H, 05H, 01H ;........
Q013C: DB 0EH, 0AH, 06H, 02H, 0FH, 0BH, 07H, 03H ;........
Q0144: DB 10H, 11H, 12H, 13H, 14H, 15H, 16H ;.......
;==========================================================================
; ;键值显示 ;
GETKEY: MOV 30H,#20H ;初始显示数据定位
MOV 3EH,#00H ;初始偏移量定位
GETKEY1: MOV A,3EH
SUBB A,#06H
JNC GOON2 ;显示已满六位
MOV DPTR,#0E101H ; 关LED显示
CLR A
MOVX @DPTR,A
MOV A,#38H ;38H为显示缓冲首地址
ADD A,3EH ;3EH为地址偏移量
MOV R0,A
MOV A,@R0
MOV 31H,A
MOV 3FH,#00H
GETKEY2: MOV A,3FH
clr c
SUBB A,#08H
JNC GOON1 ;移位已达到八次
MOV A,31H
MOV DPTR,#0E102H
JNB ACC.7,KLOOP
movx a,@dptr
orl a,#01h
anl a,#0fdh
SJMP KLOOP1
;;==========================================
KLOOP: movx a,@dptr
anl a,#0fch
KLOOP1:
MOVX @DPTR,A
NOP
MOVX A,@DPTR
ORL A,#02H
MOVX @DPTR,A
NOP
movx a,@dptr
ANL A,#0FDH
MOVX @DPTR,A
MOV A,31H
rl a
MOV 31H,A
INC 3FH
SJMP GETKEY2
;;==========================================
GOON1: MOV DPTR,#0E101H
MOV A,30H
MOVX @DPTR,A
RR A
MOV 30H,A
MOV R7,#01H
LCALL MLOOP
INC 3EH
SJMP GETKEY1
GOON2: RET
;;==========================================
MLOOP: MOV 35H,R7 ;延时
MLOOP1: MOV 36H ,#64H ;
MLOOP2: DJNZ 36H,MLOOP2
DJNZ 35H,MLOOP1
MLOOP3: RET
;==========================================================================
MLOOP4: ;查询是否有键按下
MOV DPTR,#0E101H ;关显示 ,同时将键盘列置零
CLR A
CLR 01H
MOVX @DPTR,A
MOV DPTR,#0E103H
MOVX A,@DPTR
CPL A
ANL A,#0FH
jz s1
setb 01h
s1: RET
;==========================================================================
;键盘扫描
KEY1: MOV 33H,#05H ;键盘列数 0--5
MOV 32H,#20H ;键盘列扫描初值
KEY2: MOV A,32H
CPL A
MOV DPTR,#0E101H
MOVX @DPTR,A
MOV A,32H
RR A
MOV 32H,A ;为下次列扫描做准备
MOV DPTR,#0E103H
MOVX A,@DPTR ;读行信号
CPL A
ANL A,#0FH
jnz KEYDIS
mov A,33H
JZ S3
dec 33h
sjmp key2
KEYDIS: MOV 34H,A
MOV A,33H
RL A ;键值=(列数*4+行数)--查表
RL A
MOV 33H,A
MOV A,34H
JNB ACC.1,TESTKEY
INC 33H
SJMP TESTKEY2
TESTKEY: JNB ACC.2,TESTKEY1
INC 33H
INC 33H
SJMP TESTKEY2
TESTKEY1: JNB ACC.3,TESTKEY2
MOV A,#03H
ADD A,33H
MOV 33H,A
TESTKEY2: MOV DPTR,#0E101H ;按键释放查询
CLR A
MOVX @DPTR,A
TESTKEY3: MOV R7,#9AH
LCALL MLOOP
LCALL MLOOP4
JB 01H, TESTKEY3
MOV A,33H
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV R7,A
CLR 01H
S3: RET
;==========================================================================
TESTKEY4: DB 22H ;"
;==========================================================================
TESTKEY5: MOV R7,#0FFH
RET
;==========================================================================
END
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |