📄 exp3.asm
字号:
ORG 0000H
3AJMP MAIN
ORG 001BH
AJMP TIMER1
ORG 000BH
LJMP TIMER0
ORG 0030H
MAIN: MOV SP,#6AH ;栈堆设置
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;建立译码器对应查找表
MOV 40H,#3FH ;0
MOV 41H,#06H ;1
MOV 42H,#5BH ;2
MOV 43H,#4FH ;3
MOV 44H,#66H ;4
MOV 45H,#6DH ;5
MOV 46H,#7DH ;6
MOV 47H,#07H ;7
MOV 48H,#7FH ;8
MOV 49H,#6FH ;9
MOV 4AH,#00H ;无
MOV 4BH,#40H ;-
MOV 4CH,#08H ;_
;
;建立查找日子的查找表:由于程序中只用了第一组R寄存器,故存放于11H到1CH中
MOV 11H,#32H
MOV 12H,#30H
MOV 13H,#32H
MOV 14H,#31H
MOV 15H,#32H
MOV 16H,#31H
MOV 17H,#32H
MOV 18H,#32H
MOV 19H,#31H
MOV 1AH,#32H
MOV 1BH,#31H
MOV 1CH,#32H
CLR A
;变量初始化:
MOV 20H,#28H ;时钟频率
MOV 21H,#1DH ;日期错位次数
MOV 22H,#07H ;记录闹钟开始响的时间
MOV 23H,#59H
MOV 24H,#00H ;存放是否显示调整某组约会的变量
MOV 25H,#00H ;存放是否显示约会时间的变量
MOV 26H,#00H ;存放是否显示闹钟时间的变量
MOV 27H,#01H ;存放此时显示的是第几组和调整的是第几组的变量
MOV 30H,#21H ;分别存放:时,分,秒
MOV 31H,#33H
MOV 32H,#00H
MOV 33H,#20H ;分别存放:年,月,日
MOV 34H,#08H
MOV 35H,#02H
MOV 36H,#27H
MOV 38H,#01H ;分别存放显示内容,在38位显示39的内容
MOV 39H,#4AH
MOV 3AH,#00H ;记录按键号码
MOV 3BH,#00H ;记录时间是否到达5分钟,定时显示日期用
MOV 3CH,#00H ;记录时间是否到达500毫秒,显示日期滚动速度
MOV 3DH,#01H ;存放约会断续响铃变量
MOV 3EH,#00H ;记录现在是否到达约会时间
MOV 3FH,#00H ;记录现在是否到达闹钟时间
;;记录约会时间,五个时间:
MOV 56H,#07H ;月
MOV 57H,#08H
MOV 58H,#07H
MOV 59H,#04H
MOV 5AH,#04H
MOV 5BH,#01H ;日
MOV 5CH,#01H
MOV 5DH,#01H
MOV 5EH,#05H
MOV 5FH,#06H
MOV 60H,#00H ;时
MOV 61H,#00H
MOV 62H,#00H
MOV 63H,#10H
MOV 64H,#10H
MOV 65H,#00H ;分
MOV 66H,#01H
MOV 67H,#03H
MOV 68H,#28H
MOV 69H,#28H
;
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 R3,#0FFH ;延时
WTEMP: MOV R4,#0FFH
TEMP: DJNZ R4,TEMP
DJNZ R3,WTEMP
ACALL ALARM ;调用响钟函数
MOV A,3FH ;当闹钟响时,屏蔽约会响钟
JNZ DNTREM
ACALL REMIN ;调用约会函数
;是否为5分钟:
DNTREM: MOV A,3BH ;检查是否到达5分钟整
JZ NFIVMN ;显示日期时屏蔽案件
AJMP FIVMN
NFIVMN: ACALL KEY ;调用按键检测程序,定位按键号码
ACALL KPRO ;调用按键处理程序
AJMP ENDJM
FIVMN: ACALL XCHDAT ;调用日期交换显示程序
ENDJM:
; CALL TIMECT ;调用时钟系统优化子程序
AJMP JMAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;计时器1中断服务程序,提供基准时间
TIMER1: PUSH PSW
PUSH ACC
MOV TH1,#0A6H
MOV TL1,#00H
MOV A,20H
SUBB A,#14H
JZ FOMINI
TMAIN: DJNZ 20H,RETUNTM
MOV 20H,#28H
MOV A,#01H
ADD A,32H
DA A
MOV 32H,A
CJNE A,#60H,RETUNTM
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
MOV A,#01H ;日子增1,需要考虑该日是否为本月份的最后一天
ADD A,36H
DA A
MOV 36H,A
MOV A,35H
ADD A,#10H
MOV R0,A ;取出当月的最后一天的日子
MOV A,@R0
MOV R0,A
MOV A,36H
CLR CY
SUBB A,R0 ;到了每月最后一天,则向月份进位
JNZ RETUNT
MOV 36H,#01H
MOV A,#01H
ADD A,35H
DA A
MOV 35H,A
CJNE A,#13H,RETUNT
MOV 35H,#01H
AJMP RETUNT
RETUNTM:POP ACC ;做了两个不同的retunt
POP PSW
RETI
RETUNT: ACALL FIV ;月,日,时,或分改变时,检查一次是否到了整5分钟,是为了同一有歧义的时间.
ACALL ALATIM ;之所以在这里调用闹钟时间检测,是为了统一有歧异的时间。
ACALL REMTIM
POP ACC
POP PSW
RETI
FOMINI: MOV 3CH,#01H ;半秒
XRL 3DH,#01H
AJMP TMAIN
;计时器2中断服务程序,扫描显示控制
TIMER0: PUSH PSW
PUSH ACC
MOV TH0,#0F4H
MOV TL0,#00H
MOV A,3BH ;判断是否到达5分钟
JNZ DSP
MOV A,26H ;判断是否显示闹钟和约会
JNZ ASP
MOV A,24H
JNZ RGSP
ACALL TDSP
AJMP T0RE
ASP: ACALL ADSP
AJMP T0RE
RGSP: MOV A,25H
JNZ RSP
ACALL RGDSP
AJMP T0RE
RSP: ACALL RDSP
AJMP T0RE
DSP: MOV A,21H ;判断是否已经显示了三次
JNZ DSPOK
AJMP T0RE
DSPOK: ACALL DDSP ;双次判断后,调用日期显示
T0RE: 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 RDD2
D02: MOV A,#0F0H
ANL A,53H
SWAP A
AJMP RDD2
D03: MOV A,#0FH
ANL A,52H
AJMP RDD2
D04: MOV A,#0F0H
ANL A,52H
SWAP A
AJMP RDD2
D05: MOV A,#0FH
ANL A,51H
AJMP RDD2
D06: MOV A,#0F0H
ANL A,51H
SWAP A
AJMP RDD2
D07: MOV A,#0FH
ANL A,50H
AJMP RDD2
D08: MOV A,#0F0H
ANL A,50H
SWAP A
AJMP RDD2
RDD2: MOV 39H,A
ACALL DPLAY
POP ACC
RET
;显示闹钟时间的函数,在计时器0中调用
ADSP: PUSH ACC
MOV A,38H
INC A
CJNE A,#05H,AREL
MOV A,#01H
AREL: MOV 38H,A
DEC A
JZ A01
DEC A
JZ A02
DEC A
JZ A03
DEC A
JZ A04
A01: MOV A,#0FH
ANL A,23H
AJMP RAA2
A02: MOV A,#0F0H
ANL A,23H
SWAP A
AJMP RAA2
A03: MOV A,#0FH
ANL A,22H
AJMP RAA2
A04: MOV A,#0F0H
ANL A,22H
SWAP A
AJMP RAA2
RAA2: MOV 39H,A
ACALL DPLAY
POP ACC
RET
;显示约会调整组的函数,在计时器0中调用
RGDSP: PUSH ACC
MOV 38H,#01H
MOV A,27H
MOV 39H,A
ACALL DPLAY
POP ACC
RET
;显示约会函数,在计时器0中调用
RDSP: PUSH ACC
MOV A,38H
INC A
CJNE A,#09H,RREL
MOV A,#01H
RREL: MOV 38H,A
DEC A
JZ R01
DEC A
JZ R02
DEC A
JZ R03
DEC A
JZ R04
DEC A
JZ R05
DEC A
JZ R06
DEC A
JZ R07
DEC A
JZ R08
R01: MOV A,#64H
ADD A,27H
MOV R1,A
MOV A,#0FH
ANL A,@R1
AJMP RRR2
R02: MOV A,#64H
ADD A,27H
MOV R1,A
MOV A,#0F0H
ANL A,@R1
SWAP A
AJMP RRR2
R03: MOV A,#5FH
ADD A,27H
MOV R1,A
MOV A,#0FH
ANL A,@R1
AJMP RRR2
R04: MOV A,#5FH
ADD A,27H
MOV R1,A
MOV A,#0F0H
ANL A,@R1
SWAP A
AJMP RRR2
R05: MOV A,#5AH
ADD A,27H
MOV R1,A
MOV A,#0FH
ANL A,@R1
AJMP RRR2
R06: MOV A,#5AH
ADD A,27H
MOV R1,A
MOV A,#0F0H
ANL A,@R1
SWAP A
AJMP RRR2
R07: MOV A,#55H
ADD A,27H
MOV R1,A
MOV A,#0FH
ANL A,@R1
AJMP RRR2
R08: MOV A,#55H
ADD A,27H
MOV R1,A
MOV A,#0F0H
ANL A,@R1
SWAP A
AJMP RRR2
RRR2: MOV 39H,A
ACALL DPLAY
POP ACC
RET
;显示函数,将39里的内容显示到数码管第38位
DPLAY: MOV R1,38H
CLR A
SETB CY
LOOPC: RLC A
DJNZ R1,LOOPC
MOV DPTR,#8000H
MOVX @DPTR,A
MOV A,39H
ADD A,#40H
MOV R1,A
MOV A,@R1
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 3BH,#00H
ENDFIV: POP ACC
RET
;时钟优化程序
TIMECT: MOV A,31H
CLR CY
SUBB A,#60H
JNZ CTEND
MOV 31H,#00H
CTEND: RET
;判断是否到达闹钟时间
ALATIM: PUSH ACC
MOV A,30H
CJNE A,22H,NALATM
MOV A,31H
CJNE A,23H,NALATM
MOV 3FH,#01H
POP ACC
RET
NALATM: MOV 3FH,#00H
POP ACC
RET
;响钟程序
ALARM: MOV A,3FH
JZ NALARM
MOV P1,#00H
RET
NALARM: MOV P1,#0FFH
RET
;判断是否到达约会时间
REMTIM: PUSH ACC
MOV A,35H ;判断第一组
CJNE A,56H,BREMTM
MOV A,36H
CJNE A,5BH,BREMTM
MOV A,30H
CJNE A,60H,BREMTM
MOV A,31H
CJNE A,65H,BREMTM
AJMP YREMTM
BREMTM: MOV A,35H ;判断第二组
CJNE A,57H,CREMTM
MOV A,36H
CJNE A,5CH,CREMTM
MOV A,30H
CJNE A,61H,CREMTM
MOV A,31H
CJNE A,66H,CREMTM
AJMP YREMTM
MOV A,35H ;判断第三组
CREMTM: CJNE A,58H,DREMTM
MOV A,36H
CJNE A,5DH,DREMTM
MOV A,30H
CJNE A,62H,DREMTM
MOV A,31H
CJNE A,67H,DREMTM
AJMP YREMTM
DREMTM: MOV A,35H ;判断第四组
CJNE A,59H,EREMTM
MOV A,36H
CJNE A,5EH,EREMTM
MOV A,30H
CJNE A,63H,EREMTM
MOV A,31H
CJNE A,68H,EREMTM
AJMP YREMTM
EREMTM: MOV A,35H ;判断第五组
CJNE A,5AH,NREMTM
MOV A,36H
CJNE A,5FH,NREMTM
MOV A,30H
CJNE A,64H,NREMTM
MOV A,31H
CJNE A,69H,NREMTM
YREMTM: MOV 3EH,#01H
POP ACC
RET
NREMTM: MOV 3EH,#00H
POP ACC
RET
;约会提醒程序
REMIN: MOV A,3EH
JZ NREMIN
MOV A,3DH
JZ NREMIN
MOV P1,#00H
RET
NREMIN: MOV P1,#0FFH
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 R3,#0FFH
DELAY3: DJNZ R3,DELAY3
DJNZ R2,DELAY2
RET
;按键处理程序
KPRO: MOV A,3AH
JZ KPEND
DEC A
JZ KEY1
DEC A
JZ KEY2
DEC A
JZ KEY3
DEC A
JZ KEY4
DEC A
JZ KEY5
DEC A
JZ KEY6
DEC A
JZ KEY7
DEC A
JZ KEY8
DEC A
JZ KEY9
DEC A
JZ KEY10
DEC A
JZ KEY11
DEC A
JZ KEY12
DEC A
JZ KEY13
DEC A
JZ KEY14
DEC A
JZ KEY15
DEC A
JZ KEY16
KPEND: RET
KEY1: AJMP K1 ;按键跳转,跳转到各个按键处理子程序中去
KEY2: AJMP K2
KEY3: AJMP K3
KEY4: AJMP K4
KEY5: AJMP K5
KEY6: AJMP K6
KEY7: AJMP K7
KEY8: AJMP K8
KEY9: AJMP K9
KEY10: AJMP K10
KEY11: AJMP K11
KEY12: AJMP K12
KEY13: AJMP K13
KEY14: AJMP K14
KEY15: AJMP K15
KEY16: AJMP K16
;各个按键处理子程序
K1: MOV A,35H ;系统日期月增1
INC A
DA A
MOV 35H,A
SUBB A,#13H
JNZ K1OK
MOV 35H,#00H
K1OK: AJMP KPEND
K2: MOV A,36H ;系统日期日增1
INC A
DA A
MOV 36H,A
MOV A,35H
ADD A,#10H
MOV R1,A ;取出当月的最后一天的日子
MOV A,@R1
MOV R1,A
MOV A,36H
CLR CY
SUBB A,R1 ;到了每月最后一天,则向月份进位
JNZ K2OK
MOV 36H,#01H
K2OK: AJMP KPEND
K3: MOV A,30H ;系统时间时增1
INC A
DA A
MOV 30H,A
SUBB A,#24H
JNZ K3OK
MOV 30H,#00H
K3OK: AJMP KPEND
K4: MOV A,31H ;系统时间分增1
INC A
DA A
MOV 31H,A
SUBB A,#60H
JNZ K4OK
MOV 31H,#00H
K4OK: AJMP KPEND
K5: MOV P1,#0FFH ;关闭闹钟和约会响铃
MOV 3FH,#00H
MOV 3EH,#00H
AJMP KPEND
K6: MOV A,26H ;显示闹钟时间
XRL A,#01H
MOV 26H,A
JNZ K60K
MOV 24H,#00H
K60K: AJMP KPEND
K7: MOV A,22H ;闹钟时增1
INC A
DA A
MOV 22H,A
SUBB A,#24H
JNZ K7OK
MOV 22H,#00H
K7OK: AJMP KPEND
K8: MOV A,23H ;闹钟分增1
INC A
DA A
MOV 23H,A
SUBB A,#60H
JNZ K8OK
MOV 23H,#00H
K8OK: AJMP KPEND
K9: AJMP KPEND
K10: MOV A,24H ;显示目前调整的是某组约会
XRL A,#01H
MOV 24H,A
JNZ K100K
MOV 25H,#00H
K100K: AJMP KPEND
K11: MOV A,27H ;调整第几组约会
INC A
MOV 27H,A
CJNE A,#06H,K110K
MOV 27H,#01H
K110K: AJMP KPEND
K12: MOV A,25H ;显示某组约会时间
XRL A,#01H
MOV 25H,A
K120K: AJMP KPEND
K13: MOV A,#55H ;更改选定组的约会日期的月份
ADD A,27H
MOV R1,A
MOV A,@R1 ;取出选定组的月份
INC A
DA A
MOV @R1,A
CJNE A,#13H,K130K
MOV @R1,#01H
K130K: AJMP KPEND
K14: MOV A,#5AH ;日增加,要考虑每月的最后一天
ADD A,27H
MOV R1,A
MOV A,@R1 ;取出选定组的日子
INC A
DA A
MOV @R1,A
MOV R3,A
MOV A,#55H ;取出当月月份
ADD A,27H
MOV R1,A
MOV A,@R1
ADD A,#10H
MOV R1,A ;取出当月的最后一天的日子
MOV A,@R1
CLR CY
SUBB A,R3 ;相减,检查是否到了每月最后一天,若是,则归1
JNZ K140K
MOV A,#5AH
ADD A,27H
MOV R1,A
MOV @R1,#01H
K140K: AJMP KPEND
K15: MOV A,#5FH
ADD A,27H
MOV R1,A
MOV A,@R1
ADD A,#01H
DA A
MOV @R1,A
CJNE A,#24H,K150K
MOV @R1,#00H
K150K: AJMP KPEND
K16: MOV A,#64H
ADD A,27H
MOV R1,A
MOV A,@R1
INC A
DA A
MOV @R1,A
CJNE A,#60H,K160K
MOV @R1,#00H
K160K: 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错位一次,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 3BH,#00H ;循环3遍,将5分钟标志置零
ENDXD: CLR A
MOV 3CH,A ;移位一次,将3C标志置零
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -