📄 hexp10.asm
字号:
;键盘扫描显示实验
ledout_port equ 0F600h
KEY4x4_ADR equ 0F700h
led8seg_port equ 0F300h
led8bit_port equ 0F400h
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV SP,#80H
START: NOP
LCALL SCANKEY
MOV A,R3
MOV DPTR,#ledout_port
MOVX @DPTR,A
lcall keyno
LCALL DISP_data
MOV R1,#00H
LCALL DISP_bit
LJMP START
;返回键位值R3
SCANKEY: NOP
MOV DPTR,#KEY4x4_ADR
MOV A,#0F0H
MOVX @DPTR,A
MOVX A,@DPTR
ANL A,#0F0H
XRL A,#0F0H
JZ RET11
ACALL DELAY_1MS;消抖
;MOVx A,@DPTR
;ANL A,#0F0H
;XRL A,#0F0H
;JZ RET11
MOV R6,#4
SETB C
MOV R2,#0FEH
NEXT: nop
MOV A,R2
MOVX @DPTR,A
ANL A,#0FH
MOV R3,A;列值
MOV A,R2
RLC A
MOV R2,A
MOVX A,@DPTR
ANL A,#0F0H;行值
ORL A,R3;行列值
MOV R3,A
ANL A,#0F0H
XRL A,#0F0H
JNZ ret12
DJNZ R6,NEXT
AJMP ret11
WAIT: nop
MOV A,#0F0H ;等待键释放
MOVX @DPTR,A
MOVX A,@DPTR
ANL A,#0F0H
CJNE A,#0F0H,WAIT
ajmp ret12
ret11: mov R3,#0FFh
ret12: ret
;返回键值R3
keyno: mov A,R3
CJNE A,#0EEH,NEXT1
MOV R3,#0CH
ret
NEXT1: CJNE A,#0EDH,NEXT2
MOV R3,#0DH
ret
NEXT2: CJNE A,#0EBH,NEXT3
MOV R3,#0EH
ret
NEXT3: CJNE A,#0E7H,NEXT4
MOV R3,#0FH
ret
NEXT4: CJNE A,#0DEH,NEXT5
MOV R3,#08H
ret
NEXT5: CJNE A,#0DDH,NEXT6
MOV R3,#09H
ret
NEXT6: CJNE A,#0DBH,NEXT7
MOV R3,#0AH
ret
NEXT7: CJNE A,#0D7H,NEXT8
MOV R3,#0BH
ret
NEXT8: CJNE A,#0BEH,NEXT9
MOV R3,#04H
ret
NEXT9: CJNE A,#0BDH,NEXT10
MOV R3,#05H
ret
NEXT10: CJNE A,#0BBH,NEXT11
MOV R3,#06H
ret
NEXT11: CJNE A,#0B7H,NEXT12
MOV R3,#07H
ret
NEXT12: CJNE A,#07EH,NEXT13
MOV R3,#00H
ret
NEXT13: CJNE A,#07DH,NEXT14
MOV R3,#01H
ret
NEXT14: CJNE A,#07BH,NEXT15
MOV R3,#02H
ret
NEXT15: CJNE A,#077H,ret1
MOV R3,#03H
ret
ret1: NOP
MOV R3,#0FFH;无键值
ret
;入口:R3显示数据
DISP_data:
NOP
MOV A,R3
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#led8seg_port
MOVX @DPTR,A
ret
;入口:R1显示位置
disp_bit:
NOP
MOV A,R1
MOV DPTR,#led8bit_port
MOVX @DPTR,A
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
DELAY_1MS:
MOV R7,#100
DELAY_1MS1:
NOP
NOP
DJNZ R7,DELAY_1MS1
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -