📄 万年历.asm
字号:
SCLK BIT P2.3
IO BIT P2.4
RST BIT P2.5
FLAG1 BIT F0
DQ BIT P2.1
TEMPER_L EQU 29H
TEMPER_H EQU 28H
NUM EQU 67H
YEAR DATA 66H
MONTH DATA 65H
WEEK DATA 64H
DAY DATA 63H
HOUR DATA 62H
MINTUE DATA 61H
SECOND DATA 60H
DS1302_ADDR DATA 32H
DS1302_DATA DATA 31H
ORG 0000H
LJMP START
ORG 0040H
START:
MOV SECOND,#55H
MOV MINTUE,#21H
MOV HOUR,#17H
MOV DAY,#09H
MOV MONTH,#09H
MOV WEEK,#05H
MOV YEAR,#08H
MOV NUM,#01H
SETB P2.0
CLR P2.6
CLR P2.7
CLR P2.2
BEGIN:
LCALL SET1302
LCALL INIT_18B20
LCALL RE_CONFIG
LCALL GET_TEMPER
LCALL CHANGE ;将温度值存到29H
READOUT:
MOV A,NUM
READMODE1:
CJNE A,#01H,READMODE2
MOV R5,#81H
MOV R6,#83H
MOV R7,#85H
CLR P3.6
SETB P3.5
SETB P3.4
SETB P3.7
AJMP WHOLEREAD
READMODE2: CJNE A,#02H,READMODE3
MOV R5,#8BH
MOV R6,#87H
MOV R7,#89H
AJMP WHOLEREAD
READMODE3: CJNE A,#03H,READMODE4
MOV R5,#8BH
MOV R6,#87H
MOV R7,#89H
AJMP WHOLEREAD
READMODE4:
MOV R5,29H
MOV R0,29H
MOV R6,#83H
MOV R7,#85H
AJMP MODEREAD4
WHOLEREAD:
MOV DS1302_ADDR,R5
LCALL READ
MOV R0,DS1302_DATA
MODEREAD4:
LCALL DIVIDE
MOV 50H,R1
MOV 51H,R2
MOV DS1302_ADDR,R6
LCALL READ
MOV R0,DS1302_DATA
LCALL DIVIDE
MOV 52H,R1
MOV 53H,R2
MOV DS1302_ADDR,R7
LCALL READ
MOV R0,DS1302_DATA
LCALL DIVIDE
MOV 54H,R1
MOV 55H,R2
LCALL INIT_18B20
LCALL RE_CONFIG
LCALL GET_TEMPER
LCALL CHANGE
LCALL DISPLAY
LCALL SCANF
LJMP READOUT
SCANF:
LCALL SHIMO
LCALL ZHISHE
RET
SHIMO:
JNB P1.4,MOSHI
RET
MOSHI:
INC NUM
MOV A,NUM
CJNE A,#05H,MOSHI1
MOV A,#01H
MOV NUM,A
MOSHI1: CJNE A,#01H,MOSHI2
LCALL DELAY2
MOV R5,#81H
MOV R6,#83H
MOV R7,#85H
CLR P3.6
SETB P3.7
SETB P3.4
SETB P3.5
LJMP READOUT
MOSHI2: CJNE A,#02H,MOSHI3
LCALL DELAY2
MOV R5,#8BH
MOV R6,#87H
MOV R7,#89H
CLR P3.7
SETB P3.5
SETB P3.4
SETB P3.6
LJMP READOUT
MOSHI3: CJNE A,#03H,MOSHI4
LCALL DELAY2
MOV R5,#8BH
MOV R6,#87H
MOV R7,#89H
CLR P3.5
SETB P3.6
SETB P3.7
SETB P3.4
LJMP READOUT
MOSHI4:
LCALL DELAY2
MOV R5,29H
MOV R0,29H
MOV R6,#83H
MOV R7,#85H
CLR P3.4
SETB P3.5
SETB P3.6
SETB P3.7
LJMP READOUT
DELAY2:
MOV R0,#3
D1:MOV R1,#200
D2:MOV R2,#248
D3:DJNZ R2,D3
DJNZ R1,D2
DJNZ R0,D1
RET
ZHISHE:
JNB P1.0,SHEZHI
RET
SHEZHI:
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#80H
LCALL WRITE
LCALL DELAY2
SETGZ:
MOV A,NUM
MODE1: CJNE A,#01H,MODE2
LCALL ADD_DATA
MOV R5,#59H
LJMP JN1
MODE2: CJNE A,#02H,MODE3
LCALL ADD_DATA
LJMP JN2
MODE3: CJNE A,#03H,MODE4
LCALL ADD_DATA
LJMP JN2
MODE4:
LCALL ADD_DATA
LJMP JN4
CALLJN1:
JNB P1.0,JN1
RET
JN1:
LCALL DELAY2
JN01:
LCALL FENLI
LCALL DISPLAY
JNB P1.0,JN11
JNB P1.3,SURE3
JNB P1.1,GADDSECOND
JNB P1.2,GSUBSECOND
AJMP JN01
GADDSECOND:
MOV A,R5
MOV R4,A
LCALL ADD1
MOV R5,A
CJNE A,#60H,GADDSECOND1
MOV R5,#00H
AJMP GADDSECOND1
GSUBSECOND:
MOV A,R5
MOV R4,A
LCALL SUB1
MOV R5,A
CJNE A,#00H,GADDSECOND1
MOV R5,#59H
AJMP GADDSECOND1
GADDSECOND1:
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,R5
LCALL WRITE
WAT1:
LCALL FENLI
LCALL DISPLAY
JNB P1.1,JN1
JNB P1.0,JN11
JNB P1.2,JN1
JNB P1.3,SURE3
AJMP WAT1
SURE3:
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H
LCALL WRITE
LJMP READOUT
JN11:
LCALL DELAY2
JN011:
LCALL FENLI
LCALL DISPLAY
JNB P1.0,JN111
JNB P1.3,SURE3
JNB P1.1,GADDMINTUE
JNB P1.2,GSUBMINTUE
AJMP JN011
GADDMINTUE:
MOV A,R6
MOV R4,A
LCALL ADD1
MOV R6,A
CJNE A,#60H,GADDMINTUE1
MOV R6,#00H
AJMP GADDMINTUE1
GSUBMINTUE:
MOV A,R6
MOV R4,A
LCALL SUB1
MOV R6,A
CJNE A,#00H,GADDMINTUE1
MOV R6,#59H
AJMP GADDMINTUE1
GADDMINTUE1:
MOV DS1302_ADDR,#82H
MOV DS1302_DATA,R6
LCALL WRITE
WAT11:
LCALL FENLI
LCALL DISPLAY
JNB P1.1,JN11
JNB P1.0,JN111
JNB P1.2,JN11
JNB P1.3,SURE3
AJMP WAT11
JN111:
LCALL DELAY2
JN0111:
LCALL FENLI
LCALL DISPLAY
LCALL CALLJN1
JNB P1.3,SURE3
JNB P1.1,GADDHOUR
JNB P1.2,GSUBHOUR
AJMP JN0111
GADDHOUR:
MOV A,R7
MOV R4,A
LCALL ADD1
MOV R7,A
CJNE A,#24H,GADDHOUR1
MOV R7,#00H
AJMP GADDHOUR1
GSUBHOUR:
MOV A,R7
MOV R4,A
LCALL SUB1
MOV R7,A
CJNE A,#00H,GADDHOUR1
MOV R7,#23H
AJMP GADDHOUR1
GADDHOUR1:
MOV DS1302_ADDR,#84H
MOV DS1302_DATA,R7
LCALL WRITE
WAT111:
LCALL FENLI
LCALL DISPLAY
JNB P1.1,JN111
LCALL CALLJN1
JNB P1.2,JN111
JNB P1.3,SURE1
AJMP WAT111
SURE1:
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H
LCALL WRITE
LJMP READOUT
CALLJN2:
JNB P1.0,JN2
RET
JN2:
LCALL DELAY2
JN02:
LCALL FENLI
LCALL DISPLAY
JNB P1.0,JN22
LCALL LIANSURE1
JNB P1.1,GADDWEEK
JNB P1.2,GSUBWEEK
AJMP JN02
GADDWEEK:
MOV A,R5
MOV R4,A
LCALL ADD1
MOV R5,A
CJNE A,#08H,GADDWEEK1
MOV R5,#01H
AJMP GADDWEEK1
GSUBWEEK:
MOV A,R5
MOV R4,A
LCALL SUB1
MOV R5,A
CJNE A,#00H,GADDWEEK1
MOV R5,#07H
AJMP GADDWEEK1
GADDWEEK1:
MOV DS1302_ADDR,#8AH
MOV DS1302_DATA,R5
LCALL WRITE
WAT2:
LCALL FENLI
LCALL DISPLAY
JNB P1.1,JN2
JNB P1.0,JN22
JNB P1.2,JN2
JNB P1.3,SURE1
AJMP WAT2
LIANSURE1:
JNB P1.3,SURE1
RET
JN22:
LCALL DELAY2
JN022:
LCALL FENLI
LCALL DISPLAY
JNB P1.0,JN222
LCALL LIANSURE1
JNB P1.1,GADDDAY
JNB P1.2,GSUBDAY
AJMP JN022
GADDDAY:
MOV A,R6
MOV R4,A
LCALL ADD1
MOV R6,A
CJNE A,#32H,GADDDAY1
MOV R6,#01H
AJMP GADDDAY1
GSUBDAY:
MOV A,R6
MOV R4,A
LCALL SUB1
MOV R6,A
CJNE A,#00H,GADDDAY1
MOV R6,#31H
AJMP GADDDAY1
GADDDAY1:
MOV DS1302_ADDR,#86H
MOV DS1302_DATA,R6
LCALL WRITE
WAT22:
LCALL FENLI
LCALL DISPLAY
JNB P1.1,JN22
JNB P1.0,JN222
JNB P1.2,JN22
JNB P1.3,SURE2
AJMP WAT22
JN222:
LCALL DELAY2
JN0222:
LCALL FENLI
LCALL DISPLAY
LCALL CALLJN2
JNB P1.3,SURE2
JNB P1.1,GADDMONTH
JNB P1.2,GSUBMONTH
AJMP JN0222
GADDMONTH:
MOV A,R7
MOV R4,A
LCALL ADD1
MOV R7,A
CJNE A,#13H,GADDMONTH1
MOV R7,#01H
AJMP GADDMONTH1
GSUBMONTH:
MOV A,R7
MOV R4,A
LCALL SUB1
MOV R7,A
CJNE A,#00H,GADDMONTH1
MOV R7,#12H
AJMP GADDMONTH1
GADDMONTH1:
MOV DS1302_ADDR,#88H
MOV DS1302_DATA,R7
LCALL WRITE
WAT222:
LCALL FENLI
LCALL DISPLAY
JNB P1.1,JN222
LCALL CALLJN2
JNB P1.2,JN222
JNB P1.3,SURE2
AJMP WAT222
SURE2:
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H
LCALL WRITE
LJMP READOUT
CALLJN44:
JNB P1.0,JN44
RET
JN44:
LCALL DELAY2
JN044:
LCALL FENLI
LCALL DISPLAY
JNB P1.0,JN4
JNB P1.3,SURE2
JNB P1.1,GADDHOU
JNB P1.2,GSUBHOU
AJMP JN044
GADDHOU:
MOV A,R7
MOV R4,A
LCALL ADD1
MOV R7,A
CJNE A,#24H,GADDHOU1
MOV R7,#00H
AJMP GADDHOU1
GSUBHOU:
MOV A,R7
MOV R4,A
LCALL SUB1
MOV R7,A
CJNE A,#00H,GADDHOU1
MOV R7,#23H
AJMP GADDHOU1
GADDHOU1:
MOV DS1302_ADDR,#84H
MOV DS1302_DATA,R6
LCALL WRITE
WAT44:
LCALL FENLI
LCALL DISPLAY
JNB P1.1,JN44
JNB P1.0,JN4
JNB P1.2,JN44
JNB P1.3,SURE
AJMP WAT44
JN4:
LCALL DELAY2
JN04:
LCALL FENLI
LCALL DISPLAY
JNB P1.0,JN44
JNB P1.3,SURE
JNB P1.1,GADDMIN
JNB P1.2,GSUBMIN
AJMP JN04
GADDMIN:
MOV A,R6
MOV R4,A
LCALL ADD1
MOV R6,A
CJNE A,#60H,GADDMIN1
MOV R6,#00H
AJMP GADDMIN1
GSUBMIN:
MOV A,R6
MOV R4,A
LCALL SUB1
MOV R6,A
CJNE A,#00H,GADDMIN1
MOV R6,#59H
AJMP GADDMIN1
GADDMIN1:
MOV DS1302_ADDR,#82H
MOV DS1302_DATA,R6
LCALL WRITE
WAT4:
LCALL FENLI
LCALL DISPLAY
JNB P1.1,JN4
LCALL CALLJN44
JNB P1.2,JN4
JNB P1.3,SURE
AJMP WAT4
SURE:
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H
LCALL WRITE
LJMP READOUT
INIT_18B20:
SETB DQ
NOP
CLR DQ
MOV R0,#0FBH
TSR1:
DJNZ R0,TSR1
SETB DQ
MOV R0,#25H
TSR2:JNB DQ,TSR3
DJNZ R0,TSR2
TSR3:
SETB FLAG1
AJMP TSR5
TSR4:
CLR FLAG1
LJMP TSR7
TSR5:
MOV R0,#06BH
TSR6:
DJNZ R0,TSR6
TSR7:SETB DQ
RET
RE_CONFIG:
JB FLAG1,RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH
LCALL WRITE_18B20
MOV A,#4EH
LCALL WRITE_18B20
MOV A,#23H
LCALL WRITE_18B20
MOV A,#00H
LCALL WRITE_18B20
MOV A,#1FH
LCALL WRITE_18B20
RET
GET_TEMPER:
SETB DQ
LCALL INIT_18B20
JB FLAG1,TSS2
RET
TSS2:
MOV A,#0CCH
LCALL WRITE_18B20
MOV A,#44H
LCALL WRITE_18B20
LCALL DELAY
LCALL INIT_18B20
MOV A,#0CCH
LCALL WRITE_18B20
MOV A,#0BEH
LCALL WRITE_18B20
LCALL READ2_18B20
RET
WRITE_18B20:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23H
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
READ2_18B20:
MOV R4,#2
MOV R1,#29H
RE00: MOV R2,#8
RE01:CLR C
SETB C
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23H
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
CHANGE:
MOV A,29H
MOV C,28H.0
RRC A
MOV C,28H.1
RRC A
MOV C,28H.2
RRC A
MOV C,28H.3
RRC A
MOV 29H,A
MOV A,29H
MOV B,#100
DIV AB
MOV A,#10
XCH A,B
DIV AB
SWAP A
ORL A,B
MOV 29H,A
RET
SET1302:
CLR RST
CLR SCLK
SETB RST
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H
LCALL WRITE
SETB SCLK
CLR RST
MOV R0,#SECOND
MOV R7,#7
MOV R1,#80H
S13021:
CLR RST
CLR SCLK
SETB RST
MOV B,R1
LCALL RTINPUTBYTE
MOV A,@R0
MOV B,A
LCALL RTINPUTBYTE
INC R0
INC R1
INC R1
SETB SCLK
CLR RST
DJNZ R7,S13021
CLR RST
CLR SCLK
SETB RST
MOV B,#8EH
LCALL RTINPUTBYTE
MOV B,#80H
LCALL RTINPUTBYTE
SETB SCLK
CLR RST
RET
RTINPUTBYTE:
MOV R4,#8
INBIT1:
MOV A,B
RRC A
MOV B,A
MOV IO,C
SETB SCLK
CLR SCLK
DJNZ R4,INBIT1
RET
WRITE:
CLR SCLK
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
WRITE1:
RRC A
NOP
NOP
CLR SCLK
NOP
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE1
CLR SCLK
NOP
MOV A,DS1302_DATA
MOV R4,#8
WRITE2:
RRC A
NOP
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE2
CLR RST
RET
RTOUTPUTBYTE:
MOV R4,#8
OUTBIT1: MOV C,IO
RRC A
SETB SCLK
CLR SCLK
DJNZ R4,OUTBIT1
RET
READ:
CLR SCLK
NOP
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
READ1:
RRC A
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R4,READ1
MOV R4,#8
READ2:
CLR SCLK
NOP
NOP
NOP
MOV C,IO
NOP
NOP
NOP
NOP
RRC A
NOP
NOP
NOP
NOP
SETB SCLK
NOP
DJNZ R4,READ2
MOV DS1302_DATA,A
CLR RST
RET
DIVIDE:
MOV A,R0
ANL A,#0FH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV R2,A
RET
ADD1:
MOV A,R4
ADD A,#01H
DA A
RET
SUB1:
MOV A,R4
MOV B,#10H
DIV AB
MOV R4,B
MOV B,#10
MUL AB
ADD A,R4
CLR C
SUBB A,#01H
MOV B,#100
DIV AB
MOV A,#10
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
DELAY:
MOV R3,#80
DJNZ R3,$
RET
ADD_DATA:
MOV DS1302_ADDR,R5
LCALL READ
MOV R5,DS1302_DATA
MOV DS1302_ADDR,R6
LCALL READ
MOV R6,DS1302_DATA
MOV DS1302_ADDR,R7
LCALL READ
MOV R7,DS1302_DATA
RET
FENLI:
MOV A,R5
MOV R0,A
LCALL DIVIDE
MOV 50H,R1
MOV 51H,R2
MOV A,R6
MOV R0,A
LCALL DIVIDE
MOV 52H,R1
MOV 53H,R2
MOV A,R7
MOV R0,A
LCALL DIVIDE
MOV 54H,R1
MOV 55H,R2
RET
DISPLAY:
LCALL BCD
MOV R0,#50H
MOV R2,#06H
LOOP:
MOV SBUF,@R0
JNB TI,$
CLR TI
INC R0
DJNZ R2,LOOP
RET
BCD:
MOV R0,#50H
MOV R2,#06H
MOV DPTR,#TABL
TAB:
MOV A,@R0
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R2,TAB
RET
TABL:
DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,0BH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -