📄 正式成功.asm
字号:
;*****************************
;* 温度万年历程序 *
;*****************************
;2DH(高两位年)2CH(低两位年)
;7DH~7AH(73H~70H)年位
;2BH(月)
;79H~78H(61H~60H)月
;2AH(日)
;77H~76H(51H~50H)日
;29H(星期)
;6DH(5DH)星期
;28H(小时)
;6BH~6AH(5BH~5AH)时
;27H(分)
;69H~68H(59H~58H)分
;26H(秒)
;67H~66H(57H~56H)秒
;25H~24H(温度)
;4DH~4AH(3DH~3AH)温度
;23H(农历月)
;49H~48H(39H~38H)(农历月)
;22H(农历日)
;47HH~46H(37H~36H)农历日
;显示缓冲单元,,
;闰年标志为F0,定时器T1为调整时候闪烁用
;
;
SCLK EQU P3.2
IO EQU P3.3
RST EQU P3.4
DS1302_ADDR DATA 32H
DS1302_DATA DATA 31H
YEARH DATA 2DH
YEARL DATA 2CH
MONTH DATA 2BH
DAY DATA 2AH
WEEK DATA 29H
HOUR DATA 28H
MINUTE DATA 27H
SECOND DATA 26H
TEMP_H DATA 25H
TEMP_L DATA 24H
NMONTH DATA 23H
NDAY DATA 22H
TEMPDIN BIT P3.6 ;DS18B20通信端
SPEAKERDIN BIT P3.7 ;蜂铃器端口
SET_TIME BIT P1.0 ;时间设置
SET_RING BIT P1.1 ;闹钟设置
SET_ADD BIT P1.2 ;加键设置
TIMEL EQU 0E0H
TIMEH EQU 0B1H
TEMPHEAD EQU 36H
BITST DATA 20H
TIME1SOK BIT BITST.1
TEMPONEOK BIT BITST.2
TEMPL DATA 16H
TEMPH DATA 17H
TEMPHC DATA 18H
TEMPLC DATA 19H
;************************************
;* 中断入口 *
;************************************
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 000BH
RETI
;LJMP T0IT
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
;************************************
;* 初始化 *
;************************************
ORG 100H
;************************************
;* 存储区初始化 *
;************************************
START: ;???MOV SP,#60H
CLEAR: MOV R0,#00H
MOV R1,#99H
CLEAR1: MOV @R0,#00H
INC R0
DJNZ R1,CLEAR1
;************************************
;* 延时1S *
;************************************
DELAY1S: MOV R0,#10H
DELAY1S1: LCALL YS100
DJNZ R0,DELAY1S1
; MOV TMOD, #00100001B
; MOV TH0, #TIMEL
; MOV TL0, #TIMEH
; SJMP INIT
;ERROR: NOP
; LJMP START
; NOP
;INIT: ; NOP
; SETB ET0
; SETB TR0
; SETB EA
; MOV PSW, #00H
; CLR TEMPONEOK
; LJMP MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 定时器0中断服务程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0IT: PUSH PSW
; MOV PSW, #10H
; MOV TH0, #TIMEH
; MOV TL0, #TIMEL
; INC R7
; CJNE R7, #32H, T0IT1
; MOV R7, #00H
; SETB TIME1SOK
;
;T0IT1: POP PSW
; RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN: ;LCALL DISPLAY
LCALL READTEMP
; SETB TEMPONEOK
LCALL DISPLAY
; JNB TIME1SOK, MAIN
; CLR TIME1SOK
; JNB TEMPONEOK, MAIN2
LCALL READTEMP1
LCALL DISPLAY
LCALL CONVTEMP
LCALL DISPLAY
LCALL DISPBCD
LCALL DISPLAY
;MAIN2: LCALL READTEMP
;SETB TEMPONEOK
;************************************
;* 1302初始化 *
;************************************
SETB EA
MOV SCON,#00H ;串行输出,方式0
MOV TMOD,#10H ;计数器1,方式1
MOV TL1,#00H
MOV TH1,#00H
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
;MOV DS1302_ADDR,#80H
;MOV DS1302_DATA,#00H ;允许写1302
;LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A6H ;1302充电,充电电流1.1mA
LCALL WRITE
MAIN1: MOV DS1302_ADDR,#8DH ;READ OUT YEAR
LCALL READ
MOV YEARL,DS1302_DATA
MOV DS1302_ADDR,#8BH ;READ OUT WEEK
LCALL READ
MOV WEEK,DS1302_DATA
MOV DS1302_ADDR,#89H ;READ OUT MONTH
LCALL READ
MOV MONTH,DS1302_DATA
MOV DS1302_ADDR,#87H ;READ OUT DAY
LCALL READ
MOV DAY,DS1302_DATA
MOV DS1302_ADDR,#85H ;READ OUT HOUR
LCALL READ
MOV HOUR,DS1302_DATA
MOV DS1302_ADDR,#83H ;READ OUT MINTUE
LCALL READ
MOV MINUTE,DS1302_DATA
MOV DS1302_ADDR,#81H ;READ OUT SECOND
LCALL READ
MOV SECOND,DS1302_DATA
MOV R0,YEARL
LCALL DIVIDE
MOV 7AH,R1
MOV 70H,R1
MOV 7BH,R2
MOV 71H,R2
MOV 6DH,WEEK
MOV 5DH,WEEK
MOV R0,MONTH
LCALL DIVIDE
MOV 78H,R1
MOV 60H,R1
MOV 79H,R2
MOV 61H,R2
MOV R0,DAY
LCALL DIVIDE
MOV 76H,R1
MOV 50H,R1
MOV 77H,R2
MOV 51H,R2
MOV R0,HOUR
LCALL DIVIDE
MOV 6AH,R1
MOV 5AH,R1
MOV 6BH,R2
MOV 5BH,R2
MOV R0,MINUTE
LCALL DIVIDE
MOV 68H,R1
MOV 58H,R1
MOV 69H,R2
MOV 59H,R2
MOV R0,SECOND
LCALL DIVIDE
MOV 66H,R1
MOV 56H,R1
MOV 67H,R2
MOV 57H,R2
LCALL DISPLAY
JNB SET_TIME ,SETG
LJMP MAIN
;*********************************
;* 公历 *
;*********************************
SETG: SETB TR1
SETB ET1
CLR 08H
CLR 09H
CLR 0AH
CLR 0BH
CLR 0CH
CLR 0DH
CLR 0EH
CLR 0FH
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#80H
LCALL WRITE
GWAIT: LCALL DISPLAY
JNB SET_TIME ,GWAIT
SETG1: LCALL DISPLAY
JNB SET_TIME ,SETG2
JNB SET_ADD,GADDYEAR
AJMP SETG1
GADDYEAR: MOV R7,2CH
LCALL ADD1
MOV 2CH,A
CJNE A,#51H,GADDYEAR1
MOV 2CH,#01H
GADDYEAR1: MOV DS1302_ADDR,#8CH
MOV DS1302_DATA,2CH
LCALL WRITE
MOV R0,2CH
LCALL DIVIDE
MOV 70H,R1
MOV 7AH,R1
MOV 71H,R2
MOV 7BH,R2
WAITT1: LCALL DISPLAY
JNB SET_ADD,WAITT1
AJMP SETG1
SETG2: SETB 0AH
GWAITT2: LCALL DISPLAY
JNB SET_TIME ,GWAITT2
SETG3: LCALL DISPLAY
JNB SET_TIME ,SETG4
JNB SET_ADD,GADDMONTH
AJMP SETG3
GADDMONTH: MOV R7,2BH
LCALL ADD1
MOV 2BH,A
CJNE A,#13H,GADDMONTH1
MOV 2BH,#01H
GADDMONTH1: MOV DS1302_ADDR,#88H
MOV DS1302_DATA,2BH
LCALL WRITE
MOV R0,2BH
LCALL DIVIDE
MOV 60H,R1
MOV 78H,R1
MOV 61H,R2
MOV 79H,R2
WAITT2: LCALL DISPLAY
JNB SET_ADD,WAITT2
AJMP SETG3
SETG4: SETB 0BH
GWAIT4: LCALL DISPLAY
JNB SET_TIME ,GWAIT4
SETG5: LCALL DISPLAY
JNB SET_TIME ,SETG6
JNB SET_ADD,GADDDAY
AJMP SETG5
GADDDAY: MOV R7,2AH
LCALL ADD1
MOV 2AH,A
CJNE A,#32H,GADDDAY1
MOV 2AH,#01H
GADDDAY1: MOV DS1302_ADDR,#86H
MOV DS1302_DATA,2AH
LCALL WRITE
MOV R0,2AH
LCALL DIVIDE
MOV 50H,R1
MOV 76H,R1
MOV 51H,R2
MOV 77H,R2
WAITT3: LCALL DISPLAY
JNB SET_ADD,WAITT3
AJMP SETG5
SETG6: SETB 0CH
GWAIT6: LCALL DISPLAY
JNB SET_TIME ,GWAIT6
SETG7: LCALL DISPLAY
JNB SET_TIME ,SETG8
JNB SET_ADD,GADDWEEK
AJMP SETG7
GADDWEEK: MOV R7,29H
LCALL ADD1
MOV 29H,A
CJNE A,#08H,GADDWEEK1
MOV 29H,#01H
GADDWEEK1: MOV DS1302_ADDR,#8AH
MOV DS1302_DATA,29H
LCALL WRITE
MOV R0,29H
LCALL DIVIDE
MOV 5DH,R1
MOV 6DH,R1
WAITT4: LCALL DISPLAY
JNB SET_ADD,WAITT4
AJMP SETG7
SETG8: SETB 0DH
GWAIT8: LCALL DISPLAY
JNB SET_TIME ,GWAIT8
SETG9: LCALL DISPLAY
JNB SET_TIME ,SETG10
JNB SET_ADD,GADDHOUR
AJMP SETG9
GADDHOUR: MOV R7,28H
LCALL ADD1
MOV 28H,A
CJNE A,#24H,GADDHOUR1
MOV 28H,#00H
GADDHOUR1: MOV DS1302_ADDR,#84H
MOV DS1302_DATA,28H
LCALL WRITE
MOV R0,28H
LCALL DIVIDE
MOV 5AH,R1
MOV 6AH,R1
MOV 5BH,R2
MOV 6BH,R2
WAITT5: LCALL DISPLAY
JNB SET_ADD,WAITT5
AJMP SETG9
SETG10: SETB 0EH
GWAIT10: LCALL DISPLAY
JNB SET_TIME ,GWAIT10
SETG11: LCALL DISPLAY
JNB SET_TIME ,SETGOUT
JNB SET_ADD,GADDMINUTE
AJMP SETG11
GADDMINUTE: MOV R7,27H
LCALL ADD1
MOV 27H,A
CJNE A,#60H,GADDMINUTE1
MOV 27H,#00H
GADDMINUTE1:MOV DS1302_ADDR,#82H
MOV DS1302_DATA,27H
LCALL WRITE
MOV R0,27H
LCALL DIVIDE
MOV 58H,R1
MOV 68H,R1
MOV 59H,R2
MOV 69H,R2
WAITT6: LCALL DISPLAY
JNB SET_ADD,WAITT6
AJMP SETG11
SETGOUT: LCALL DISPLAY
JNB SET_TIME ,SETGOUT
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;允许写1302
LCALL WRITE
CLR 08H
CLR 09H
CLR 0AH
CLR 0BH
CLR 0CH
CLR 0DH
CLR 0EH
CLR 0FH
CLR ET1
CLR TR1
LJMP MAIN
;*********************************
;* 散动 *
;*********************************
INTT1: PUSH ACC
PUSH PSW
GFLASH: CPL 0FH
JB 0FH,GFLASH1
MOV 7BH,71H
MOV 7AH,70H
MOV 79H,61H
MOV 78H,60H
MOV 6DH,5DH
MOV 77H,51H
MOV 76H,50H
MOV 6BH,5BH
MOV 6AH,5AH
MOV 69H,59H
MOV 68H,58H
MOV 67H,57H
MOV 66H,56H
GFLASHOUT: POP PSW
POP ACC
RETI
GFLASH1: JB 0AH,GFLASH2
MOV 7BH,#0AH
MOV 7AH,#0AH
AJMP GFLASHOUT
GFLASH2: JB 0BH,GFLASH3
MOV 79H,#0AH
MOV 78H,#0AH
AJMP GFLASHOUT
GFLASH3: JB 0CH,GFLASH4
MOV 77H,#0AH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -