给你一个参考程序,还带有时钟芯片驱动的
SCL2 BIT P1.3; //SCL2定义为P1口的第3位脚,连接ADC0831SCL脚
SDA2 BIT P1.4; //SDA2定义为P1口的第4位脚,连接ADC0831SDA脚
CS2 BIT P1.6; //CS2定义为P1口的第4位脚,连接ADC0831CS脚
RST BIT P1.5;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突
L_DISPLAY EQU 30H
L_TMPDATE1 EQU 38H ;秒
L_TMPDATE2 EQU 39H ;分
L_TMPDATE3 EQU 3AH ;时
L_TMPDATE4 EQU 3BH ;星期
L_TMPDATE5 EQU 3CH ;日
L_TMPDATE6 EQU 3DH ;月
L_TMPDATE7 EQU 3EH ;年
ORG 0100H
write_rtc_address: DB 80H,82H,84H,86H,88H,8aH,8cH
read_rtc_address: DB 81H,83H,85H,87H,89H,8bH,8dH
L_TIMER: DB 00H,59H,18H,01H,01H,01H,01H
TABLE: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H
/*共阴数码管 0-9 - 表*/
ORG 0000H
LJMP MAIN
ORG 0200H
MAIN: MOV SP,#60H
CLR RST
LCALL SET_RTC ;先写入初值
M0: LCALL READ_RTC ;循环读取时间数据
MOV R0,#L_DISPLAY
MOV A,L_TMPDATE3 ;把时拆分为两个数据,个时和十时
MOV B,#16
DIV AB
MOV @R0,A ;十时
INC R0
MOV @R0,B ;个时
INC R0
MOV @R0,#10 ;加"-"
INC R0
MOV A,L_TMPDATE2 ;同上
MOV B,#16
DIV AB
MOV @R0,A
INC R0
MOV @R0,B
INC R0
MOV @R0,#10
INC R0
MOV A,L_TMPDATE1
MOV B,#16
DIV AB
MOV @R0,A
INC R0
MOV @R0,B
MOV R0,#L_DISPLAY
MOV R7,#8
LCALL DISPLAY
SJMP M0
DISPLAY:MOV DPTR,#TABLE /*R0为地址,R7为个数*/
MOV P2,#0
ANL P1,#0F8H
L2: MOV A,@R0
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P2,#0
INC P1
INC R0
DJNZ R7,L2
RET
DELAY: MOV R5,#20
D1: DJNZ R5,D1
RET
SET_RTC:MOV R6,#7 ;转输7个数据:秒、分、时、星期、日、月、年
MOV DPTR,#L_TIMER ;初始的7个数据从ROM中转到我们定义的RAM中
MOV R0,#L_TMPDATE1
S0: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R6,S0
MOV R1,#8EH
MOV R2,#0
LCALL W1302 ;首先写入地址8EH为0,即解锁,否则写入不了数据
MOV R0,#L_TMPDATE1 ;数据保存的地址
MOV DPTR,#write_rtc_address ;所写数据的地址
MOV R6,#7 ;写入7个数据:秒、分、时、星期、日、月、年
S1: MOV A,@R0
MOV R2,A
CLR A
MOVC A,@A+DPTR
MOV R1,A
LCALL W1302
INC DPTR
INC R0
DJNZ R6,S1
MOV R1,#8EH
MOV R2,#80H
LCALL W1302 ;;最后写入地址8EH为80H,即加上锁,不让写入不了数据
RET
READ_RTC:MOV R6,#7 ;读出7个数据:秒、分、时、星期、日、月、年
MOV R0,#L_TMPDATE1 ;存入定义的RAM中
MOV DPTR,#read_rtc_address
RE0: CLR A
MOVC A,@A+DPTR
MOV R1,A
LCALL R1302
MOV @R0,A
INC DPTR
INC R0
DJNZ R6,RE0
RET
W1302B: MOV R7,#8 ;单字节写,R1参数为所写数据
MOV A,R1
W0: RRC A
MOV SDA2,C
NOP
SETB SCL2
NOP
CLR SCL2
DJNZ R7,W0
RET
W1302: CLR RST ;指定地址写入数据,R1:地址,R2:数据
NOP
CLR SCL2
NOP
SETB RST
NOP
LCALL W1302B
MOV A,R2
MOV R1,A
LCALL W1302B
CLR RST
NOP
RET
R1302: MOV R2,#0 ;指定地址读数据,R1:地址,A:返回的数据
CLR RST
NOP
CLR SCL2
NOP
SETB RST
NOP
LCALL W1302B
MOV R7,#8
CLR A
RR0: MOV C,SDA2 ;;单字节读,读出数据存入A传出
RRC A
SETB SCL2
NOP
CLR SCL2
DJNZ R7,RR0
CLR RST
NOP
CLR SCL2
NOP
SETB SCL2
NOP
CLR SDA2
NOP
SETB SDA2
NOP
RET
END