当前位置:文档之家› DS1302电子时钟,51单片机汇编程序编写,1602显示

DS1302电子时钟,51单片机汇编程序编写,1602显示

FLAG EQU R2
MONMAX DATA 48H
YEAR DATA 46H
WEEK DATA 45H
MONTH DATA 44H
DAY DATA 43H
HOUR DATA 42H
MINUTE DATA 41H
SECOND DATA 40H
ADR DATA 38H
DAT DATA 36H
SCLK EQU P3.3
RST EQU P3.5
IO EQU P3.4
RS BIT P2.0
RW BIT P2.1
E BIT P2.2
FIRST EQU P1.6
ORG 0000H

AJMP START
ORG 000BH
LJMP INT
ORG 0100H
START: SETB EA
MOV TMOD,#01H
MOV TH0,#0FCH
MOV TL0,#18H
SETB EA
SETB ET0
SETB TR0
MOV SCON,#00H
MOV ADR,#8EH
MOV DAT,#00H
LCALL WRITE
MOV ADR,#90H
MOV DAT,#0A6H
LCALL WRITE
MOV ADR,#84H

JB P2.1,MAIN
MOV ADR,#80H
MOV DAT,#00H
LCALL WRITE
MOV ADR,#82H ;将调节后的新值写入各对应寄存器
MOV DAT,#11H
LCALL WRITE
MOV ADR,#84H
MOV DAT,#22H
LCALL WRITE
MOV ADR,#86H
MOV DAT,DAY
LCALL WRITE
MOV ADR,#8AH
MOV DAT,WEEK
LCALL WRITE
MOV ADR,#88H
MOV DAT,MONTH
LCALL WRITE
MOV ADR,#8CH
MOV DAT,YEAR
LCALL WRITE

MAIN: JB P2.2,KEYEND ;判断设置键是否按下
JNB P2.2,$


KEYEND:
MOV ADR,#81H ;从DS1302读秒
LCALL READ
MOV SECOND,DAT

MOV ADR,#83H ;从DS1302读分
LCALL READ
MOV MINUTE,DAT

MOV ADR,#85H ;从DS1302读时
LCALL READ
MOV HOUR,DAT

MOV ADR,#87H ;从DS1302读天
LCALL READ
DISPLAY3:MOV DAY,DAT

MOV ADR,#8BH ;从DS1302读周
LCALL READ
DISPLAY4:MOV WEEK,DAT

MOV ADR,#89H ;从DS1302读月
LCALL READ
DISPLAY5:MOV MONTH,DAT

MOV ADR,#8DH ;从DS1302读年
LCALL READ
DISPLAY6:MOV YEAR,DAT
LCALL DELAY
;LCALL DELAY
;LCALL DELAY
;LCALL DELAY
LCALL DELAY
AJMP MAIN



INT: PUSH ACC
MOV TH0,#0FFCH
MOV TL0,#1FH
CJNE FLAG,#0,NEXTT
MOV FLAG,#1
MOV A,MINUTE
SWAP A
ANL A,#0FH
CLR P2.5
SETB P2.6
AJMP DISPLAY
NEXTT: CJNE FLAG,#1,NEXTT1
MOV FLAG,#2
MOV A,SECOND
ANL A,#0FH
CLR P2.6
SETB P2.7
AJMP DISPLAY
NEXTT1: CJNE FLAG,#2,NEXTT2
MOV FLAG,#3
MOV A,HOUR
SWAP A
ANL A,#0FH
CLR P2.7
SETB P2.4
AJMP DISPLAY
NEXTT2: MOV FLAG,#0
MOV A,HOUR
ANL A,#0FH
CLR P2.4
SETB P2.5
DISPLAY:
ME: MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
NOTOVER:POP ACC
RETI

WRITE:CLR SCLK
SETB RST
MOV A,ADR
MOV R4,#8
WRITE1:RRC A
CLR SCLK
MOV IO,C
SETB SCLK
DJNZ R4,WRITE1
CLR SCLK
MOV A,DAT
MOV R4,#8
WRITE11:RRC A
CLR SCLK
MOV IO,C
SETB SCLK
DJNZ R4,WRITE11
CLR RST
RET
READ: CLR SCLK ;从DS1302读数据子程序
SETB RST
MOV A,ADR
MOV R4,#8
READ1: RRC A
MOV IO,C
SETB SCLK
CLR SCLK
DJNZ R4,READ1
MOV R4,#8
READ2: CLR SCLK
MOV C,IO
RRC A
SETB SCLK
DJNZ R4,READ2
MOV DAT,A
CLR RST
RET
ENABLE:CLR RS ;LCD写命令子程序
CLR RW
CLR E
ACALL DELAY
SETB E
RET
DELAY: MOV R4,#0H
D1: MOV R5,#0H
DJNZ R5,$
DJNZ R4,D1
RET
KEY: JB P1.2,NEXT1 ;调时间/日期子程序
JNB P1.2,$
INC A
NEXT1: JB P1.3,NEXT2
JNB P1.3,$
DEC A
NEXT2: CJNE R1,#1,J
LCALL MINTURN

;调分标志打开,调用调分子程序
J: CJNE R1,#2,J1
LCALL HOUTURN ;调时标志打开,调用调时子程序
J1: CJNE R1,#3,J2
LCALL WEETURN ;调周标志打开,调用调周子程序
J2: CJNE R1,#4,J3
LCALL DAYTURN ;调日标志打开,调用调日子程序
J3: CJNE R1,#5,J4
LCALL MONTURN ;调月标志打开,调用调月子程序
J4: CJNE R1,#6,J5
LCALL YEATURN ;调年标志打开,调用调年子程序
J5: RET
MINTURN:MOV R0,A
ANL A,#0FH ;调分子程序
CJNE A,#0AH,MIN
MOV A,R0
ADD A,#6
MOV R0,A
MIN: MOV A,R0
ANL A,#0F0H ;超过六十分,分变为一
CJNE A,#60H,MIN1
MOV R0,#00H
MIN1: MOV A,R0
CJNE A,#0FFH,MIN2 ;小于一分,分变为五十九
MOV R0,#59H
MIN2: MOV A,R0
ANL A,#0FH
CJNE A,#0FH,MIN3
MOV A,R0
SUBB A,#6H
MOV R0,A
MIN3: MOV A,R0
RET
HOUTURN:MOV R0,A ;调时子程序
CJNE A,#24H,HOU ;超过二十三点,时变为零
MOV R0,#00H
HOU: MOV A,R0
CJNE A,#0FFH,HOU1 ;小于零点,时变为二十三
MOV R0,#23H
HOU1: MOV A,R0
ANL A,#0FH
CJNE A,#0AH,HOU2
MOV A,R0
ADD A,#6H
MOV R0,A
HOU2: MOV A,R0
ANL A,#0FH
CJNE A,#0FH,HOU3
MOV A,R0
SUBB A,#6H
MOV R0,A
HOU3: MOV A,R0
RET
WEETURN:MOV R0,A ;调周子程序
CJNE A,#8H,WEE ;超过周七,周变为一
MOV R0,#01H
WEE: MOV A,R0
CJNE A,#0H,WEE1 ;小于周一,周变为七
MOV R0,#7H
WEE1: MOV A,R0
RET
DAYTURN:MOV R0,A
MOV A,MONTH ;判断月大/月小
SUBB A,#2H
JNZ NOTTWO
MOV MONMAX,#28H
AJMP OK
NOTTWO:MOV A,MONTH
SUBB A,#4H
JNZ JUDGE
MOV MONMAX,#30H
AJMP OK
JUDGE: MOV A,MONTH
SUBB A,#6H
JNZ JUDGE1
MOV MONMAX,#30H
AJMP OK
JUDGE1:MOV A,MONTH
SUBB A,#9H
JNZ JUDGE2
MOV MONMAX,#30H
AJMP OK
JUDGE2:MOV A,MONTH
SUBB A,#11H
JNZ JUDGE3
MOV MONMAX,#30H
AJMP OK
JUDGE3:MOV MONMAX,#31H
OK: MOV A,R0 ;调日子程序
ANL A,#0FH
CJNE A,#0AH,DAYDAY
MOV A,R0
ADD A,#6
MOV R0,A
DAYDAY:MOV A,R0 ;超过最大天,天变为一
SUBB A,MONMAX
MOV A,PSW
ANL A,#80H
JNZ DAYDAY1
MOV R0,#1H
DAYDAY1:MOV A,R0 ;小于一天,天变为最大天
CJNE A,#0H,DAYDAY2
MOV R0,MONMAX
DAYDAY2:MOV A,R0
ANL A,#0FH
CJNE A,#0FH,DAYDAY3
MOV A,R0
SUBB A,#6H
MOV R0,A
DAYDAY3:MOV A,R0
RET
MONTURN:MOV R0,A ;调月字子程序
CJNE A,#13H,MON ;超过十二月,变为一月
MOV R0,#1H
MON: MOV A,R0
CJNE A,#0H,MON1 ;小于一月,变为十二月
MOV R0,#12H
MON1: MOV A,R0
ANL A,#0FH
CJNE A,#0AH,MON2
MOV A,R0
ADD A,#6H
MOV R0,A
MON2: MOV A,R0
ANL A,#0FH
CJNE A,#0FH,MON3
MOV A,R0
SUBB A,#6H
MOV R0,A
MON3: MOV A,R0
RET
YEATURN:MOV R0,A ;调年子程序
CJNE A,#9AH,YEA ;超过九九年,年变为零零年
MOV R0,#0H
YEA: MOV A,R0
CJNE A,#0FFH,YEA1 ;小于零零年,年变为九九年
MOV R0,#99H
YEA1: MOV A,R0
ANL A,#0FH
CJNE A,#0AH,YEA2
MOV A,R0
ADD A,#6H
MOV R0,A
YEA2: MOV A,R0
ANL A,#0FH
CJNE

A,#0FH,YEA3
MOV A,R0
SUBB A,#6H
MOV R0,A
YEA3: MOV A,R0
RET
;调节状态下的显示字程序
AGAIN: MOV P0,#83H ;光标置年位
LCALL ENABLE
MOV R1,#6
MOV A,YEAR
LCALL KEY
MOV R3,A
MOV R2,YEAR
XRL A,R2
JZ SAME
MOV A,R3
MOV YEAR,A
LCALL YEADIS
SAME: JB P1.1,AGAIN
JNB P1.1,$
AGAIN1: MOV P0,#87H ;光标置月位
LCALL ENABLE
MOV R1,#5
MOV A,MONTH
LCALL KEY
MOV R3,A
MOV R2,MONTH
XRL A,R2
JZ SAME1
MOV A,R3
MOV MONTH,A
LCALL MONDIS
SAME1: JB P1.1,AGAIN1
JNB P1.1,$
AGAIN2:MOV P0,#8BH ;光标置天位
LCALL ENABLE
MOV R1,#4
MOV A,DAY
LCALL KEY
MOV R3,A
MOV R2,DAY
XRL A,R2
JZ SAME2
MOV A,R3
MOV DAY,A
LCALL DAYDIS
SAME2: JB P1.1,AGAIN2
JNB P1.1,$
AGAIN3:MOV P0,#8FH ;光标置周位
LCALL ENABLE
MOV R1,#3
MOV A,WEEK
LCALL KEY
MOV R3,A
MOV R2,WEEK
XRL A,R2
JZ SAME3
MOV A,R3
MOV WEEK,A
LCALL WEEDIS
SAME3: JB P1.1,AGAIN3
JNB P1.1,$
AGAIN4:MOV P0,#0C5H ;光标置小时位
LCALL ENABLE
MOV R1,#2
MOV A,HOUR
LCALL KEY
MOV R3,A
MOV R2,HOUR
XRL A,R2
JZ SAME4
MOV A,R3
MOV HOUR,A
LCALL HOUDIS
SAME4: JB P1.1,AGAIN4
JNB P1.1,$
AGAIN5:MOV P0,#0C8H ;光标置分位
LCALL ENABLE
MOV R1,#1
MOV A,MINUTE
LCALL KEY
MOV R3,A
MOV R2,MINUTE
XRL A,R2
JZ SAME5
MOV A,R3
MOV MINUTE,A
LCALL MINDIS
SAME5: JB P1.1,AGAIN5
JNB P1.1,$
MOV ADR,#82H ;将调节后的新值写入各对应寄存器
MOV DAT,MINUTE
LCALL WRITE
MOV ADR,#84H
MOV DAT,HOUR
LCALL WRITE
MOV ADR,#86H
MOV DAT,DAY
LCALL WRITE
MOV ADR,#8AH
MOV DAT,WEEK
LCALL WRITE
MOV ADR,#88H
MOV DAT,MONTH
LCALL WRITE
MOV ADR,#8CH
MOV DAT,YEAR
LCALL WRITE
RET
YEADIS:ANL A,#0FH ;将读的年送LCD显示
ADD A,#30H
MOV P0,#83H
LCALL ENABLE

MOV A,YEAR
SWAP A
ANL A,#0FH
ADD A,#30H

RET
MONDIS:ANL A,#0FH ;将读的月送LCD显示
ADD A,#30H
MOV P0,#87H
LCALL ENABLE
;LCALL WRITE2
MOV A,MONTH
SWAP A
ANL A,#1
ADD A,#30H
;LCALL WRITE2
RET
WEEDIS:MOV B,#3 ;将读的周送LCD显示
MOV A,WEEK
DEC A
MUL AB
MOV R1,A
MOV R2,#3
MOV DPTR,#TABLE
NEXT3: MOV A,R1
MOVC A,@A+DPTR
MOV P0,A
;LCALL WRITE2
INC DPTR
DJNZ R2,NEXT3
RET
HOUDIS:ANL A,#0FH ;将读的时送LCD显示
ADD A,#30H
MOV P0,#0C5H
LCALL ENABLE
;LCALL WRITE2
MOV A,HOUR
SWAP A
ANL A,#3
ADD A,#30H
;LCALL WRITE2
RET
DAYDIS:ANL A,#0FH
ADD A,#30H
MOV P0,#8BH
LCALL ENABLE
;LCALL WRITE2
MOV A,DAY
SWAP A
ANL A,#3
ADD A,#30H
;LCALL WRITE2
RET
MINDIS:ANL A,#0FH ;将读的分送LCD显示
ADD A,#30H
MOV P0,#0C8H
LCALL ENABLE
;LCALL WRITE2
MOV A,MINUTE
SWAP A
ANL A,#7
ADD A,#30H
;LCALL WRITE2
RET
TAB:DB 0A0H,0BBH,62H,2AH,39H,2CH,24H,0BAH,20H,28H

TABLE: DB 'NUSNOMEUTNEWUHTIRFTAS',00H
END

相关主题
文本预览
相关文档 最新文档