📄 ex9-7.asm
字号:
KD EQU 40H ;键值单元
ST EQU 41H ;状态单元
ORG 0000H ;复位入口
LJMP MAIN
ORG 0030H
MAIN: MOV SP, #50H
MOV 7AH,#11H
MOV 7BH,#10H
MOV 7CH,#10H
MOV 7DH,#12H
MOV 7EH,#10H
MOV 7FH,#10H
MOV ST, #00H
MOV KD, #00H
MOV DPTR,#7F00H ;8155命令口地址
MOV A,#03H ;置8155PA、PB口为输出,PC口为输入
MOVX @DPTR,A
ML0: NOP
LCALL DISP
LCALL READKEY ;调读键值程序
SJMP ML0 ;无键按下,循环等待
READKEY:LCALL KEY ;调按键识别程序
MOV A, R4 ;得到键值在A中
CJNE A,#88H,KLD ;有键按下,转到键值分析
RET
KLD: MOV KD, A ;将键值存于KD单元
KDD0: MOV A, ST ;读状态子表入口地址→DPTR
RL A
PUSH ACC
MOV DPTR, #TBB1
MOVC A, @A+DPTR
MOV B, A
POP ACC
INC A
MOVC A, @A+DPTR
MOV DPL, A
MOV DPH, B
CTT: CLR A
MOVC A, @A+DPTR ;读判定码
CJNE A, KD, NEE ;功能键判定
SJMP QEE ;是功能键
NEE: CJNE A, #0FFH, NCC ;未用键判定
SJMP QEE ;是未用键
NCC: CJNE A, #09H, NNN ;数字键判定
CJNE A, KD, NPP
NPP: JNC QEE ;是数字键
NNN: INC DPTR ;条目不符
INC DPTR
INC DPTR
SJMP CTT ;返回,继续读键值并判定
QEE: CLR A ;判定符合
INC DPTR
MOVC A, @A+DPTR ;读次态码→ST
MOV ST, A
JZ KDD0 ;若为0态,返回KDD0重新进行
CLR A
INC DPTR
MOVC A, @A+DPTR ;读子程序号
MOV DPTR, #SUBJ
MOV R0,A
RL A
ADD A,R0
JMP @A+DPTR ;散转到子程序入口
SUBJ: LJMP SUB0 ;转移到不同的子程序
LJMP SUB1
LJMP SUB2
LJMP SUB3
LJMP SUB4
LJMP SUB5
LJMP SUB6
LJMP SUB7
LJMP SUB8
LJMP SUB9
LJMP SUB10
LJMP SUB11
TBB1: DW TB20 ;状态子表入口地址索引表
DW TB21
DW TB22
DW TB23
DW TB24
DW TB25
TB20: DB 0BH,5,1 ;0状态子表
DB 0CH,5,2
DB 0DH,5,3
DB 0EH,5,4
DB 0FH,1,0
DB 10H,2,0
DB 11H,5,5
DB 0FFH,5,0
TB21: DB 09,1,7 ;1状态子表
DB 12H,1,8
DB 0FH,3,0
DB 13H,5,6
DB 0FFH,0,0
TB22: DB 09,5,9 ;2状态子表
DB 13H,5,6
DB 0FFH,0,0
TB23: DB 09,3,10 ;3状态子表
DB 13H,4,0
DB 0FFH,0,0
TB24: DB 13H,5,6 ;4状态子表
DB 0FFH,4,11
TB25: DB 0FFH,0,0 ;5状态子表
SUB0: MOV 7EH,#0
MOV 7BH,ST
RET ;功能子程序,略
SUB1: MOV 7EH,#1
MOV 7BH,ST
RET
SUB2: MOV 7EH,#2
MOV 7BH,ST
RET
SUB3: MOV 7EH,#3
MOV 7BH,ST
RET
SUB4: MOV 7EH,#4
MOV 7BH,ST
RET
SUB5: MOV 7EH,#5
MOV 7BH,ST
RET
SUB6: MOV 7EH,#6
MOV 7BH,ST
RET
SUB7: MOV 7EH,#7
MOV 7BH,ST
RET
SUB8: MOV 7EH,#8
MOV 7BH,ST
RET
SUB9: MOV 7EH,#9
MOV 7BH,ST
RET
SUB10: MOV 7EH,#10
MOV 7BH,ST
RET
SUB11: MOV 7EH,#11
MOV 7BH,ST
RET
;按键识别子程序
KEY: MOV R4,#00H ;0→键号寄存器R4
MOV R2,#01H ;扫描模式01H→R2
KEY1: MOV DPTR,#7F02H
MOV A,R2
MOVX @DPTR,A ;扫描模式→8155PB口
INC DPTR
MOVX A,@DPTR ;读8155 PC口
JB ACC.0,KEY2 ;0列无键闭合,转判1列
LCALL DELAY1 ;延时,反弹跳
MOVX A,@DPTR
JB ACC.0,KEY2 ;0列无键闭合,转判1列
MOV A,#00H ;0列有键闭合,0→A
AJMP KEY55
KEY2: JB ACC.1,KEY3 ;1列无键闭合,转判2列
LCALL DELAY1 ;延时,反弹跳
MOVX A,@DPTR
JB ACC.1,KEY3 ;0列无键闭合,转判1列
MOV A,#01H ;1列有键闭合,列线号01H→A
AJMP KEY55
KEY3: JB ACC.2,KEY4 ;2列无键闭合,转判3列
LCALL DELAY1 ;延时,反弹跳
MOVX A,@DPTR
JB ACC.2,KEY4 ;0列无键闭合,转判1列
MOV A,#02H ;2列有键闭合,02H→A
AJMP KEY55
KEY4: JB ACC.3,KEY5 ;3列无键闭合,转判下一行
LCALL DELAY1 ;延时,反弹跳
MOVX A,@DPTR
JB ACC.3,KEY5 ;0列无键闭合,转判1列
MOV A,#03H ;3列有键闭合,03H→A
AJMP KEY55
KEY5: JB ACC.4,NEXT ;4列无键闭合,转判下一行
LCALL DELAY1 ;延时,反弹跳
MOVX A,@DPTR
JB ACC.4,NEXT ;0列无键闭合,转判1列
MOV A,#04H ;4列有键闭合,04H→A
KEY55: ADD A,R4 ;列线号+(R4)作为键值→A
MOV R4,A ;键值→R4
RET ;返回
NEXT: MOV A,R4;
ADD A,#05 ;键号寄存器加4
MOV R4,A
MOV A,R2
JB ACC.3,NEXT1 ;判别是否已扫描到最后一行
RL A ;扫描模式左移一位
MOV R2,A
AJMP KEY1 ;重新开始扫描下一行
NEXT1: MOV R4,#88H ;扫描到最后一行仍无按键置无键闭合标志
RET
;数码管显示子程序
DISP: MOV R0,#7AH ;置显示缓冲器指针初值
MOV R3,#01H ;置扫描模式初值
DISPB1: MOV DPTR,#7F02H ;8155 PB口地址
MOV A,#0h ;熄灭所有LED
MOVX @DPTR,A
MOV DPTR,#7F01H ;8155 PA口地址
MOV A, @R0 ;取显示数据
ADD A,#014H ;加偏移量
MOVC A, @A+PC ;查表取段码
MOVX @DPTR,A ;段码→8155 PA口
MOV A,R3
MOV DPTR,#7F02H ;8155 PB口地址
MOVX @DPTR,A ;扫描模式→8155 PB口
ACALL DELAY ;延时
INC R0
MOV A,R3
JB ACC.6,DISPB2 ;判6位LED显示完否
RL A ;扫描模式左移1位
MOV R3,A
AJMP DISPB1
DISPB2: MOV R3,#01H
RET
SEGPT2: Db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h ;段码表
db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
db 00h,0D0h,09Ch
;延时子程序
DELAY: MOV R4,#0FFH
LOOP: DJNZ R4,LOOP
RET
DELAY1: MOV R5,#0B0H
LOOP2: MOV R6,#0FFH
LOOP1: DJNZ R6,LOOP1
DJNZ R5,LOOP2
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -