📄 as.asm
字号:
;已完成
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP JIAOZHENG ;外部中断0用于校正
ORG 000BH
LJMP BAOSHI ;整点报时
ORG 0013H
LJMP NAOZHONG
ORG 001BH
AJMP MIAOBIAO
ORG 0030H
MAIN:
MOV R0,#0H ;存秒表
MOV R1,#0H ;秒
MOV R2,#0H ;分
MOV R3,#0H ;时
MOV R4,#01H ;存日
MOV R5,#01H ;存月
MOV R6,#0H ;存年低位
MOV R7,#0H ;存年高位
MOV 20H,#06FH
MOV 21H,#06FH
MOV 25H,#0H
MOV 24H,#0H
MOV 26H,#06FH
MOV 27H,#06FH
MOV 30H,#20H
CLR 2FH ;0不是闰年
MOV TMOD,#11H
MOV TH1, #0ECH
MOV TL1,#78H
;SETB EA
;SETB EX0 ;开外部中断0
;SETB ET1
;SETB IT0
;SETB TR1 ;外部中断0下降沿触发
MOV DPTR,#TAB0
MOV IE,#8FH
MOV TCON,#45H
NEX:CJNE R0,#64H,WAIT ;从0000年00月00日00时00分00秒到9999年12月31日23时59分59秒99
MOV R0,#0H ;循环以上计法
INC R1
CJNE R1,#3CH,NEX
MOV R1,#0H
INC R2
CLR TR0
MOV A,R2
CJNE A,20H,LOOP ;设定时间到 蜂鸣器响一分钟
MOV A,R3
CJNE A,21H,LOOP ;以上两次检测不可颠倒 以免误差
MOV TH0,#0F9H
MOV TL0,#5CH
SETB TR0
LOOP:CJNE R2,#3CH,NEX
MOV R2,#0H ;整点到报时1分钟
MOV TH0,#0F8H
MOV TL0,#8CH
SETB TR0
INC R3
CJNE R3,#18H,NEX ;24进制
MOV R3,#0H
INC R4
MOV A,R4
CJNE A,26H,LOOP1 ;设定时间到 蜂鸣器响一分钟 生日提醒
MOV A,R5
CJNE A,27H,LOOP1 ;以上两次检测不可颠倒 以免误差
MOV TH0,#0FAH
MOV TL0,#15H
SETB TR0
LOOP1: MOV A,R4
CJNE A,28H,NEX ;到日为止
MOV R4,#01H
INC R5
MOV A,R5
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV 28H,A
JNB 2FH,LOOP5
INC 28H
LOOP5: MOV DPTR,#TAB0
CJNE R5,#0DH,NEX ;到接近12月底为止
MOV R5,#01H ;即到13
INC R6
CJNE R6,#64H,NEX ;到99
MOV R6,#01H
INC R7
CJNE R7,#64H,NEX ;到99
LJMP MAIN
WAIT: MOV P0,#0FFH
JB P0.0,JIAOTI ;交替显示年月日,由P0.0控制 高电平有效
MOV A,R0 ;等待中断时不停显示
ACALL BTOD1
MOV P1,#40H
MOV P2,A
ACALL BTOD2
MOV P1,#80H
MOV P2,A
MOV A,R1
ACALL BTOD1
MOV P1,#10H
MOV P2,A
ACALL BTOD2
MOV P1,#20H
MOV P2,A
MOV A,R2
ACALL BTOD1
MOV P1,#4H
MOV P2,A
ACALL BTOD2
MOV P1,#8H
MOV P2,A
MOV A,R3
ACALL BTOD1
MOV P1,#1H
MOV P2,A
ACALL BTOD2
MOV P1,#2H
MOV P2,A
LJMP NEX
JIAOTI:MOV A,R4 ;等待中断时不停显示
ACALL BTOD1
MOV P1,#40H
MOV P2,A
ACALL BTOD2
MOV P1,#80H
MOV P2,A
MOV A,R5
ACALL BTOD1
MOV P1,#10H
MOV P2,A
ACALL BTOD2
MOV P1,#20H
MOV P2,A
CLR 2FH
CJNE R6,#0H,LOOP2
MOV A,R7
MOV B,#4H
DIV AB
MOV A,B
CJNE A,#0H,LOOP3
SETB 2FH
SJMP LOOP3
LOOP2: MOV A,R7
MOV B,#4H
DIV AB
MOV 2AH,B
MOV A,R6
MOV B,#0AH
DIV AB
MOV 2BH,A
MOV 29H,B
MOV A,2AH
MOV B,#0AH
MUL AB
ADD A,2BH
MOV B,#4H
DIV AB
MOV A,B
MOV B,#0AH
MUL AB
ADD A, 29H
MOV B,#4H
DIV AB
MOV A,B
CJNE A,#0H,LOOP3
SETB 2FH
LJMP LOOP3
;A为0则是润年
LOOP3: MOV A,R6
ACALL BTOD1
MOV P1,#4H
MOV P2,A
ACALL BTOD2
MOV P1,#8H
JNB 2FH,LOOP4
CLR P2.7
LOOP4: MOV P2,A
MOV A,R7
ACALL BTOD1
MOV P1,#1H
MOV P2,A
ACALL BTOD2
MOV P1,#2H
MOV P2,A
LJMP NEX
NAOZHONG:
JB P3.1,NEXT
MOV 25H,#0H
MOV 24H,#0H
MOV 26H,#0H
MOV 27H,#0H
RETI
NEXT:
MOV A,R2 ;减去设定时增加的值 重新显示当前值
CLR C
SUBB A,25H
MOV R2,A
MOV A,R3
CLR C
SUBB A,24H
MOV R3,A
MOV A,R4
CLR C
SUBB A,26H
MOV R4,A
MOV A,R5
CLR C
SUBB A,27H
MOV R5,A
RETI
BTOD1:MOV B,#0AH ;二进制到十进制转换子程序
DIV AB ;只处理高位转换结果的输出
MOVC A,@A+DPTR ;入口参数 A中已存二进制数
RET ;出口参数 A中存对应字型码
BTOD2:MOV A,B ;处理低位转换结果的输出
MOVC A,@A+DPTR ;入口参数 B中已存十进制低位
RET ;出口参数 A中存对应字型码
JIAOZHENG:
MOV P0,#0FFH
JB P0.1,JIAOMIAO
JB P0.2,JIAOFEN
JB P0.3,JIAOSHI
JB P0.4,JIAOTIAN
JB P0.5,JIAOYUE
JB P0.6,JIAONIAN1
JB P0.7,JIAONIAN2
JIAOMIAO: INC R1
CJNE R1,#3CH,NEX1
MOV R1,#0H
NEX1:RETI
JIAOFEN: INC R2
INC 25H ;设定闹钟时用于保存设定增值 分
MOV 20H,R2 ;设定闹钟时用于保存设定值 分
CJNE R2,#3CH,NEX2
MOV R2,#0H
NEX2:RETI
JIAOSHI: INC R3
INC 24H ;设定闹钟时用于保存设定值 时
MOV 21H,R3 ;设定闹钟时用于保存设定值 时
CJNE R3,#18H,NEX3
MOV R3,#0H
NEX3:RETI
JIAOTIAN: INC R4
INC 26H ;生日提醒功能 用于保存设定的生日值 日期
MOV 22H,R4
MOV A,R4
CJNE A,28H,NEX4
MOV R4,#0H
NEX4:RETI
JIAOYUE: INC R5
INC 27H ;生日提醒功能 用于保存设定的生日值 月份
MOV 23H,R5
MOV A,R5
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV 28H,A
JNB 2FH,LOOP6
INC 28H
LOOP6: MOV DPTR,#TAB0
CJNE R5,#0DH,NEX5
MOV R5,#0H
NEX5:RETI
JIAONIAN1: INC R6
CJNE R6,#64H,NEX6
MOV R6,#0H
NEX6:RETI
JIAONIAN2:INC R7
CJNE R7,#64H,NEX7
MOV R7,#0H
NEX7:RETI
BAOSHI:CPL P3.0
RETI
MIAOBIAO: INC R0 ;基本定时模块 产生百分之一秒
MOV TH1, #0ECH ;重装定时初值
MOV TL1,#78H
RETI
TAB0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
TAB1:DB 0H,20H,01DH,20H,1FH,20H,1FH,20H,20H,1FH,20H,1FH,20H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -