📄 exp2.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 ;0
INC R0
MOV @R0,#06H ;1
INC R0
MOV @R0,#5BH ;2
INC R0
MOV @R0,#4FH ;3
INC R0
MOV @R0,#66H ;4
INC R0
MOV @R0,#6DH ;5
INC R0
MOV @R0,#7DH ;6
INC R0
MOV @R0,#07H ;7
INC R0
MOV @R0,#7FH ;8
INC R0
MOV @R0,#6FH ;9
INC R0
MOV @R0,#00H ;无
INC R0
MOV @R0,#40H ;-
INC R0
MOV @R0,#08H ;_
;
CLR A
;变量初始化:
MOV 20H,#28H ;时钟频率
MOV 21H,#1DH ;日期错位次数
MOV 30H,#15H ;分别存放:时,分,秒
MOV 31H,#29H
MOV 32H,#00H
MOV 36H,#14H ;分别存放:年,月,日
MOV 35H,#02H
MOV 34H,#08H
MOV 33H,#20H
MOV 38H,#01H ;分别存放显示内容,在38位显示39的内容
MOV 39H,#4AH
MOV 3AH,#00H ;记录按键号码
MOV 3BH,#00H ;记录时间是否到达5分钟
MOV 3CH,#00H ;记录时间是否到达250毫秒
;
ACALL DATPUT
;开启计时器:
MOV TMOD,#11H
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,#0FFH ;延时
WTEMP: MOV R1,#0FFH
TEMP: DJNZ R1,TEMP
DJNZ R2,WTEMP
;是否为5分钟
MOV A,3BH ;检查是否到达5分钟整
JZ NFIVMN
AJMP FIVMN
NFIVMN: ACALL KEY ;调用按键检测程序
ACALL KPRO ;调用按键处理程序
AJMP ENDJM
FIVMN: ACALL XCHDAT ;调用日期交换显示程序
ENDJM: AJMP JMAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;计时器1中断服务程序,提供基准时间
TIME: PUSH PSW
PUSH ACC
MOV TH1,#0A6H
MOV TL1,#00H
MOV A,20H
SUBB A,#14H
JZ FOMINI
TMAIN: 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
ACALL FIV ;分改变时,检查一次是否到了整5分钟
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
FOMINI: MOV A,#01H
MOV 3CH,A
AJMP TMAIN
;计时器2,扫描显示控制
TIMER2: PUSH PSW
PUSH ACC
MOV TH0,#0F4H
MOV TL0,#00H
MOV A,3BH
JNZ DSP
ACALL TDSP
AJMP T2RE
DSP: MOV A,21H
JNZ DSPOK
AJMP T2RE
DSPOK: ACALL DDSP
T2RE: POP ACC
POP PSW
RETI
;显示时间函数,在计时器0中调用
TDSP: PUSH ACC
MOV A,38H
INC A
CJNE A,#09H,TREL
MOV A,#01H
TREL: MOV 38H,A
DEC A
JZ T01
DEC A
JZ T02
DEC A
JZ T03
DEC A
JZ T04
DEC A
JZ T05
DEC A
JZ T06
DEC A
JZ T07
DEC A
JZ T08
T01: MOV A,#0FH
ANL A,32H
AJMP RTT2
T02: MOV A,#0F0H
ANL A,32H
SWAP A
AJMP RTT2
T03: MOV A,#0BH
AJMP RTT2
T04: MOV A,#0FH
ANL A,31H
AJMP RTT2
T05: MOV A,#0F0H
ANL A,31H
SWAP A
AJMP RTT2
T06: MOV A,#0BH
AJMP RTT2
T07: MOV A,#0FH
ANL A,30H
AJMP RTT2
T08: MOV A,#0F0H
ANL A,30H
SWAP A
AJMP RTT2
RTT2: MOV 39H,A
ACALL DPLAY
POP ACC
RET
;显示日期函数,在计时器0中调用
DDSP: PUSH ACC
MOV A,38H
INC A
CJNE A,#09H,DREL
MOV A,#01H
DREL: MOV 38H,A
DEC A
JZ D01
DEC A
JZ D02
DEC A
JZ D03
DEC A
JZ D04
DEC A
JZ D05
DEC A
JZ D06
DEC A
JZ D07
DEC A
JZ D08
D01: MOV A,#0FH
ANL A,53H
AJMP RTT2
D02: MOV A,#0F0H
ANL A,53H
SWAP A
AJMP RTT2
D03: MOV A,#0FH
ANL A,52H
AJMP RTT2
D04: MOV A,#0F0H
ANL A,52H
SWAP A
AJMP RTT2
D05: MOV A,#0FH
ANL A,51H
AJMP RTT2
D06: MOV A,#0F0H
ANL A,51H
SWAP A
AJMP RTT2
D07: MOV A,#0FH
ANL A,50H
AJMP RTT2
D08: MOV A,#0F0H
ANL A,50H
SWAP A
AJMP RDD2
RDD2: MOV 39H,A
ACALL DPLAY
POP ACC
RET
;显示函数,将39里的内容显示到数码管第38位
DPLAY: MOV R0,38H
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
;检查是否为5分钟:
FIV: PUSH ACC
MOV A,31H
ANL A,#0FH
JNZ NZERO
AJMP FIVM
NZERO: CJNE A,#05H,NFIVM
FIVM: MOV A,#01H
MOV 3BH,A
ACALL DATPUT ;每五分钟重新装载日期一次
MOV A,#1DH
MOV 21H,A
AJMP ENDFIV
NFIVM: MOV A,#00H
MOV 3BH,#00H
ENDFIV: POP ACC
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,#0FH
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 ;时增1
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 ;分增1
INC A
DA A
MOV 31H,A
SUBB A,#60H
JNZ MOK
MOV A,#00H
MOV 31H,A
MOK: AJMP KPEND
;装载日期函数,每五分钟重新装载一次
DATPUT: MOV 50H,#0AAH
MOV A,33H
MOV 51H,A
MOV A,34H
MOV 52H,A
MOV A,35H
ANL A,#0F0H
ORL A,#00CH
SWAP A
MOV 53H,A
MOV A,35H
ANL A,#0FH
ORL A,#0C0H
SWAP A
MOV 54H,A
MOV A,36H
MOV 55H,A
RET
;日期交换显示函数:
XCHDAT: MOV A,3CH
JZ ENDXD ;每3CH错位一次
MOV A,50H
SWAP A
MOV 50H,A
MOV A,51H
SWAP A
MOV 51H,A
MOV A,52H
SWAP A
MOV 52H,A
MOV A,53H
SWAP A
MOV 53H,A
MOV A,54H
SWAP A
MOV 54H,A
MOV A,55H
SWAP A
MOV 55H,A
MOV A,50H
MOV R1,#51H
XCHD A,@R1
MOV 50H,A
MOV A,51H
MOV R1,#52H
XCHD A,@R1
MOV 51H,A
MOV A,52H
MOV R1,#53H
XCHD A,@R1
MOV 52H,A
MOV A,53H
MOV R1,#54H
XCHD A,@R1
MOV 53H,A
MOV A,54H
MOV R1,#55H
XCHD A,@R1
MOV 54H,A
MOV A,21H
DEC A
MOV 21H,A
JNZ ENDXD
MOV A,#00H
MOV 3BH,A
ENDXD: CLR A
MOV 3CH,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -