接口/时钟/PLL
ds1302芯片时钟芯片大家都在问到底需要不需要初始化?这篇文章将会给大家一个程序,可以自动决定DS1302是否需要初始化。
方法很简单:程序重新运行时,在 1302 初始化子程序之前,首先读取一次 1302 的信息,然后,对其信息进行分析或比较,以此来决定是否需要初始化!
我们利用 1302 自带的 31 个RAM ,仅仅使用一个 RAM 就可以了。在第一次上电 1302 读取数据后,同时也读取一个 RAM 的数据,拿这个数据去比较一个特征码,相同则不用运行 1302 初始化程序,不相同则需要运行DS1302 的初始化程序。
ORG 0000H
JMP B_REST
ORG 050H
B_REST:
MOV WDTCR,#WDTOF
MOV SP,#0E0H;SP[81H],范围: RAM 在 00H--0FFH.
CALL Z_CRAM
CALL Z_OFF8X8 ;关闭8*8点阵----仅仅51hei-5 使用
CALL GET_TIME ;读取1302
MOV A,4FH ;特征码在 4FH
CJNE A,#0ABH,Z_INIT1302 ;特征码是 #0abh (也可以其它啊!)
JMP Z_LOOP ;特征码相同跳转到 Z_LOOP
Z_INIT1302:
CALL DS1302_INIT ;特征码不同运行 1302 初始化程序
Z_LOOP:
CALL GET_TIME ;读取1302
JNB F_1302,Z_LOOP0 ;F_1302=1刷新显示数据
CLR F_1302
CALL Z_RTCBIN
Z_LOOP0:
CALL B_LEDXS
JMP Z_LOOP
DS1302_INIT:
CLR RST
CLR CLK
NOP
NOP
SETB RST
;实时时钟写入
ZM0 07FH
MOV R1,#80H
Z_WR1302: ;秒,分,时,天,月份,星期,年度==81H,83H,85H,97H,89H,8BH,8DH
MOV R0,#00H
CALL WRITE
INC2 R1
COM_ R1,#86H,Z_WR1302
MOV R0,#01H ;天
CALL WRITE
INC2 R1
MOV R0,#01H ;月份
CALL WRITE
INC2 R1
MOV R0,#06H ;星期
CALL WRITE
INC2 R1
MOV R0,#11H ;年度
CALL WRITE
ZB1 F_1302
MOV R1,#0C8H
MOV R0,#0ABH ;写入特征码
CALL WRITE
RET
;读时间 数据子程序
GET_TIME: ; ;秒,分,时,天,月份,星期,年度==81H,83H,85H,97H,89H,8BH,8DH
MOV R0,#40H
MOV R1,#81H; 读秒
Z_GET_TIME0:
CALL READ
MOV @R0,A;41H,
INC R1
INC R1
INC R0
COM_ R0,#047H,Z_GET_TIME0
MOV R1,#0C9H ;读出特征码;内部RAM命令与地址:C0H--FDH.奇数=读,偶数=写。
CALL READ
MOV 4FH,A ;读出特征码保存到4FH
MOV A,40H
CJNE A,7FH,Z_F1302 ;7fh 是上一次秒数值的备份
RET
Z_F1302:
MOV 7FH,A ;7fh 是秒数值的备份
ZB1 F_1302 ;设置刷新显示标志
INC 7EH
COM_ 7EH,#5,Z_7EH
ZM0 7EH
CPL FRLSZ ;反转轮流显示标志
Z_7EH:
RET
全部0条评论
快来发表一下你的评论吧 !