IO BIT P3.4
SCLK BIT P3.6
RST BIT P3.5
LSA BIT P2.2
LSB BIT P2.3
LSC BIT P2.4
DIG EQU P0
ORG 0000H
JMP MAIN
ORG 000BH
JMP DISPLAY
ORG 0040H
;*********************************
; 主程序 *
;*********************************
MAIN:
SEC EQU 30H
MIN EQU 31H
HOU EQU 32H
MOV SEC,#00H
MOV MIN,#00H
MOV HOU,#09H
MOV 33H,#80H
MOV TMOD,#02H
MOV TH0,#9CH
MOV TL0,#9CH
SETB ET0
SETB TR0
SETB EA
MOV DPTR,#DIGDATA
CALL DINIT
LOOP:
CALL READTIME
SJMP LOOP
;*********************************
; DS1302初始化程序 *
;*********************************
DINIT:
MOV R0, #8EH;写保护寄存器
MOV R1, #30H;禁写保护寄存器
CALL WRITEC
MOV R0, #80H;写秒
MOV R1, #SEC
MOV 0,#3
LOOP1: CALL WRITEC
INC R0
INC R0
INC R1
DJNZ 0,LOOP
MOV R0, #8EH ;开启写保护
MOV R1, #33H
CALL WRITEC
; MOV SEC,#00H
; MOV MIN,#00H
; MOV HOU,#00H
RET
;*********************************
; DS1302读时间程序 *
;*********************************
READTIME:
MOV R0, #81H
MOV R1, #40H;读秒
MOV 0,#3
LOOP2: CALL READC
INC R0
INC R0
INC R1
DJNZ 0,LOOP2
RET
;*********************************
; 中断显示程序 *
;*********************************
DISPLAY:
;-------------第一个
CLR LSA
CLR LSB
CLR LSC
MOV A,40H
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第二个
SETB LSA
CLR LSB
CLR LSC
MOV A,40
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第三个
CLR LSA ;测试数码管
SETB LSB
CLR LSC
MOV DIG,#40H
CALL DELAY2MS
MOV DIG,#000H
;-------------第四个
SETB LSA
SETB LSB
CLR LSC
MOV A,41H
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第五个
CLR LSA
CLR LSB
SETB LSC
MOV A,41H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第六个
SETB LSA
CLR LSB
SETB LSC
MOV DIG,#40H
CALL DELAY2MS
MOV DIG,#000H
;------------ 第七个
CLR LSA
SETB LSB
SETB LSC
MOV A,42H
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第八个
SETB LSA
SETB LSB
SETB LSC
MOV A,42H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
RETI
;*********************************
; 读DS1302 *
;参数:读地址、数据 *
;*********************************
READC:
CLR SCLK
CLR RST
SETB RST
MOV B,R0
CALL WRITEB
CALL READB
MOV @R1,A
CLR RST
SETB SCLK
NOP
CLR IO
NOP
SETB IO
NOP
RET
;*********************************
; 写DS1302 *
;参数:写地址 、数据 *
;*********************************
WRITEC:
CLR SCLK
CLR RST
SETB RST
MOV B,R0
CALL WRITEB
MOV B,@R1
CALL WRITEB
CLR SCLK
CLR RST
RET
;*********************************
; 数据区 *
;*********************************
DIGDATA:
DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
DB 0x7f,0x6f;,0x77,0x7c,0x39,0x5e,0x79,0x71
;*********************************
; 读字节程序 *
;*********************************
READB:
PUSH PSW
PUSH 0
MOV 0,#8
RLOOP:
MOV C,IO
RRC A
SETB SCLK
CLR SCLK
DJNZ 0,RLOOP
POP 0
POP PSW
RET
;*********************************
; 写字节程序 *
;*********************************
WRITEB:
PUSH PSW
PUSH 0
MOV 0,#8
WLOOP:
MOV A,B
RRC A
MOV B,A
MOV IO,C
SETB SCLK
CLR SCLK
DJNZ 0,WLOOP
POP 0
POP PSW
RET
;*********************************
; 延时程序 *
;*********************************
DELAY2MS: ;误差 0us
MOV R6,#04H
DL1:
MOV R5,#0F8H
DJNZ R5,$
DJNZ R6,DL
SCLK BIT P3.6
RST BIT P3.5
LSA BIT P2.2
LSB BIT P2.3
LSC BIT P2.4
DIG EQU P0
ORG 0000H
JMP MAIN
ORG 000BH
JMP DISPLAY
ORG 0040H
;*********************************
; 主程序 *
;*********************************
MAIN:
SEC EQU 30H
MIN EQU 31H
HOU EQU 32H
MOV SEC,#00H
MOV MIN,#00H
MOV HOU,#09H
MOV 33H,#80H
MOV TMOD,#02H
MOV TH0,#9CH
MOV TL0,#9CH
SETB ET0
SETB TR0
SETB EA
MOV DPTR,#DIGDATA
CALL DINIT
LOOP:
CALL READTIME
SJMP LOOP
;*********************************
; DS1302初始化程序 *
;*********************************
DINIT:
MOV R0, #8EH;写保护寄存器
MOV R1, #30H;禁写保护寄存器
CALL WRITEC
MOV R0, #80H;写秒
MOV R1, #SEC
MOV 0,#3
LOOP1: CALL WRITEC
INC R0
INC R0
INC R1
DJNZ 0,LOOP
MOV R0, #8EH ;开启写保护
MOV R1, #33H
CALL WRITEC
; MOV SEC,#00H
; MOV MIN,#00H
; MOV HOU,#00H
RET
;*********************************
; DS1302读时间程序 *
;*********************************
READTIME:
MOV R0, #81H
MOV R1, #40H;读秒
MOV 0,#3
LOOP2: CALL READC
INC R0
INC R0
INC R1
DJNZ 0,LOOP2
RET
;*********************************
; 中断显示程序 *
;*********************************
DISPLAY:
;-------------第一个
CLR LSA
CLR LSB
CLR LSC
MOV A,40H
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第二个
SETB LSA
CLR LSB
CLR LSC
MOV A,40
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第三个
CLR LSA ;测试数码管
SETB LSB
CLR LSC
MOV DIG,#40H
CALL DELAY2MS
MOV DIG,#000H
;-------------第四个
SETB LSA
SETB LSB
CLR LSC
MOV A,41H
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第五个
CLR LSA
CLR LSB
SETB LSC
MOV A,41H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第六个
SETB LSA
CLR LSB
SETB LSC
MOV DIG,#40H
CALL DELAY2MS
MOV DIG,#000H
;------------ 第七个
CLR LSA
SETB LSB
SETB LSC
MOV A,42H
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
;-------------第八个
SETB LSA
SETB LSB
SETB LSC
MOV A,42H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV DIG,A
CALL DELAY2MS
MOV DIG,#000H
RETI
;*********************************
; 读DS1302 *
;参数:读地址、数据 *
;*********************************
READC:
CLR SCLK
CLR RST
SETB RST
MOV B,R0
CALL WRITEB
CALL READB
MOV @R1,A
CLR RST
SETB SCLK
NOP
CLR IO
NOP
SETB IO
NOP
RET
;*********************************
; 写DS1302 *
;参数:写地址 、数据 *
;*********************************
WRITEC:
CLR SCLK
CLR RST
SETB RST
MOV B,R0
CALL WRITEB
MOV B,@R1
CALL WRITEB
CLR SCLK
CLR RST
RET
;*********************************
; 数据区 *
;*********************************
DIGDATA:
DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
DB 0x7f,0x6f;,0x77,0x7c,0x39,0x5e,0x79,0x71
;*********************************
; 读字节程序 *
;*********************************
READB:
PUSH PSW
PUSH 0
MOV 0,#8
RLOOP:
MOV C,IO
RRC A
SETB SCLK
CLR SCLK
DJNZ 0,RLOOP
POP 0
POP PSW
RET
;*********************************
; 写字节程序 *
;*********************************
WRITEB:
PUSH PSW
PUSH 0
MOV 0,#8
WLOOP:
MOV A,B
RRC A
MOV B,A
MOV IO,C
SETB SCLK
CLR SCLK
DJNZ 0,WLOOP
POP 0
POP PSW
RET
;*********************************
; 延时程序 *
;*********************************
DELAY2MS: ;误差 0us
MOV R6,#04H
DL1:
MOV R5,#0F8H
DJNZ R5,$
DJNZ R6,DL