📄 exp1.asm
字号:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP TIME
ORG 000BH
LJMP TIMER2
ORG 0030H
MAIN: MOV SP,#6AH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV R0,#40H ;建立译码器对应查找表
MOV @R0,#3FH
INC R0
MOV @R0,#06H
INC R0
MOV @R0,#5BH
INC R0
MOV @R0,#4FH
INC R0
MOV @R0,#66H
INC R0
MOV @R0,#6DH
INC R0
MOV @R0,#7DH
INC R0
MOV @R0,#07H
INC R0
MOV @R0,#7FH
INC R0
MOV @R0,#6FH
;
MOV TMOD,#11H
MOV 20H,#28H
CLR A
MOV 30H,A ;分别存放时分秒
MOV 31H,A
MOV 32H,A
SETB ET1
SETB EA
MOV IP,#08H ;中断优先级控制,计时器1为高优先级
MOV TH1,#0A6H
MOV TL1,#00H
SETB TR1
SETB ET0
MOV TH0,#0F4H
MOV TL0,#00H
SETB TR0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SJMP $
JMAIN:
MOV R2,#07FH
WTEMP: MOV R1,#0FFH
TEMP: DJNZ R1,TEMP
DJNZ R2,WTEMP
ACALL KEY ;调用按键检测程序
ACALL KPRO ;调用按键处理程序
AJMP JMAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIME: PUSH PSW ;计时器1中断服务程序,提供基准时间
PUSH ACC
MOV TH1,#0A6H
MOV TL1,#00H
DJNZ 20H,RETUNT
MOV 20H,#28H
MOV A,#01H
ADD A,32H
DA A
MOV 32H,A
CJNE A,#60H,RETUNT
MOV 32H,#00H
MOV A,#01H
ADD A,31H
DA A
MOV 31H,A
CJNE A,#60H,RETUNT
MOV 31H,#00H
MOV A,#01H
ADD A,30H
DA A
MOV 30H,A
CJNE A,#24H,RETUNT
MOV 30H,#00H
RETUNT: POP ACC
POP PSW
RETI
TIMER2: PUSH PSW
PUSH ACC
MOV TH0,#0F4H ;计时器2,扫描显示控制
MOV TL0,#00H
MOV A,38H
INC A
CJNE A,#07H,CREL
MOV A,#01H
CREL: MOV 38H,A
DEC A
JZ A01
DEC A
JZ A02
DEC A
JZ A03
DEC A
JZ A04
DEC A
JZ A05
DEC A
JZ A06
A01: MOV A,#0FH
ANL A,32H
AJMP RTT2
A02: MOV A,#0F0H
ANL A,32H
SWAP A
AJMP RTT2
A03: MOV A,#0FH
ANL A,31H
AJMP RTT2
A04: MOV A,#0F0H
ANL A,31H
SWAP A
AJMP RTT2
A05: MOV A,#0FH
ANL A,30H
AJMP RTT2
A06: MOV A,#0F0H
ANL A,30H
SWAP A
AJMP RTT2
RTT2: MOV 39H,A
ACALL DPLAY
POP ACC
POP PSW
RETI
DPLAY: MOV R0,38H ;显示函数,将39里的内容显示到数码管第38位
CLR A
SETB CY
LOOPC: RLC A
DJNZ R0,LOOPC
MOV DPTR,#8000H
MOVX @DPTR,A
MOV A,39H
ADD A,#40H
MOV R0,A
MOV A,@R0
MOV DPTR,#9000H
MOVX @DPTR,A
CLR CY
RET
KEY: ACALL KEYCH ;调用查键子程序
JNZ DSHAKE
AJMP KEND
DSHAKE: ACALL DELAY ;消抖子程序调用延时子程序
ACALL KEYCH
JNZ SCAN
AJMP KEND
;扫描查键
SCAN: MOV R6,#01H ;将第0行置一
MOV R7,#00H ;从第0号开始检查
SCAN1: MOV DPTR,#8000H
MOV A,R6
MOVX @DPTR,A
MOVX A,@DPTR
JNB ACC.0,LONE
MOV A,#00H
AJMP LKP
LONE: JNB ACC.1,LTWO
MOV A,#01H
AJMP LKP
LTWO: JNB ACC.2,LTHR
MOV A,#02H
AJMP LKP
LTHR: JNB ACC.3,NEXT
MOV A,#03H
LKP: ADD A,R7
PUSH ACC
SCAN2: ACALL KEYCH
JNZ SCAN2
POP ACC
AJMP SCANED
NEXT: INC R7
INC R7
INC R7
INC R7
MOV A,R6
JB ACC.3,KEND
RL A
MOV R6,A
AJMP SCAN1
SCANED: INC A
MOV 3AH,A
RET
KEND: MOV 3AH,#0H
RET
KEYCH: MOV DPTR,#8000H ;查询按键是否改变子程序,将改变的列置1
MOV A,#0FFH
MOVX @DPTR,A
MOVX A,@DPTR
ANL A,#0FH
RET
DELAY: MOV R2,#20H ;延时程序,按键消抖用
DELAY2: MOV R1,#0FFH
DELAY3: DJNZ R1,DELAY3
DJNZ R2,DELAY2
RET
;按键处理程序
KPRO: MOV A,3AH
JZ KPEND
DEC A
JZ K1
DEC A
JZ K2
KPEND: RET
K1: MOV A,30H
INC A
DA A
MOV 30H,A
SUBB A,#24H
JNZ HOK
MOV A,#00H
MOV 30H,A
HOK: AJMP KPEND
K2: MOV A,31H
INC A
DA A
MOV 31H,A
SUBB A,#60H
JNZ MOK
MOV A,#00H
MOV 31H,A
MOK: AJMP KPEND
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -