;这是DS1302的读写子程序部分,已经注释的很清楚了。
;********************************************************
;DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302
;以下是有关DS1302的读写、设置程序
;由于DS1302的寄存数据是压缩BCD码,为了和其他程序对接方便,
;MCU的数据仍然用16进制,所以读出和写入前先转换成16进制
;**********************************************************
ZH_16_BCD:
MOV A, YEAR ;为了和显示子程序接口进行了调整
CALL ZH_16_BCD1
MOV H_YEAR, A
MOV A, MONTH
CALL ZH_16_BCD1
MOV H_MONTH, A ;
MOV A, DATE
CALL ZH_16_BCD1
MOV H_DATE, A ;
MOV A, HOUR ;
CALL ZH_16_BCD1
MOV H_HOUR, A
MOV A, MIN_F ;
CALL ZH_16_BCD1
MOV H_MIN_F, A
MOV A, SEC ;
CALL ZH_16_BCD1
MOV H_SEC, A
RET
ZH_16_BCD1:
MOV B, #10
DIV AB ;16进制转换到10进制后写入1302
SWAP A ;"压缩BCD码"
ADD A, B
RET
;**********************************************************
ZH_BCD_16: ;二—十BCD码转换成十六进制码
PUSH 00H
MOV @R0, #0 ;BCD码转换成16进制
XCHD A, @R0 ;个位转到@R0暂存
SWAP A ;十位转到低4位
MOV B, #0AH ;十位数乘以10(0AH)
MUL AB ;
ADD A, @R0 ;加上个位数
POP 00H
RET
;********************************************
;入口参数:写入或读出的首数据在H_SEC中,写或读的首地址
;固定为秒;写入或读出的字节个数在R7中
;********************************************
RW1302:
MOV A, CMD1302
RW1302_11:
CLR RST1302
CLR SCLK1302 ;拉高RST前,一定置SCLK低
NOP ;
SETB RST1302 ;拉高RST,对1302读写有效
RW1302_1: ;发送指令
MOV A, CMD1302 ;取指令
MOV R6, #8 ;循环,8位指令
RW1302_2: ;
CLR SCLK1302 ;
RRC A ;
MOV IO1302, C ;
NOP ;
SETB SCLK1302 ;
DJNZ R6, RW1302_2 ;以上6行是写指令
RW1302_22:
MOV R6, #8 ;8位数据
MOV A, CMD1302 ;仅仅判断程序走向
JNB ACC.0, RW1302_4 ;读写分别处理,ACC.0=0,转
RW1302_3: ;ACC.0=1,是读,转来
CLR SCLK1302 ;以下是读数据
NOP ;
MOV C, IO1302
NOP ;
SETB SCLK1302 ;
RRC A ;
DJNZ R6, RW1302_3 ;以上7行是写数据
MOV @R0, A ;送缓存
SJMP RW1302_6 ;跳过“写”
RW1302_4: ;
MOV A, @R0 ;如果ACC.0=0,是写,转来
RW1302_5: ;
RRC A ;
CLR SCLK1302 ;
MOV IO1302, C ;
NOP ;
SETB SCLK1302 ;
DJNZ R6, RW1302_5 ;
RW1302_6: ;
INC R0 ;指向下一缓存位
DJNZ R7, RW1302_22 ;字节数没完,转回继续
CLR RST1302 ;读写完后,拉低RST,禁止读写1302
; NOP ;
; CLR SCLK1302 ;
RET ;
;********************************************
;INITIALIZE DS1302, 打开写保护
;设置充电, 启动时钟
;********************************************
INIT1302: ;
CLR SCLK1302 ;
CLR RST1302 ;
MOV CMD1302, #8EH ;打开写保护,允许写入
MOV H_SEC, #0 ;读写的数据
MOV R7, #1 ;读写的字节数
MOV R0, #H_SEC ;地址送R0
CALL RW1302 ;调用读写子程序
MOV CMD1302, #90H ;涓流充电
MOV H_SEC, #0A5H ;数据,一个二极管,2K电阻
MOV R7, #1 ;读写的字节数
MOV R0, #H_SEC ;
CALL RW1302 ;调用读写子程序
CALL ZH_16_BCD ;将时间值16进制转换成BCD
MOV H_SEC+7, #00 ;1302第8个寄存器,写保护
MOV CMD1302, #0BEH ;连续写时钟数据指令
MOV R7, #8 ;读写的字节数,设置7,也是连续8个数据
MOV R0, #H_SEC ;
CALL RW1302 ;调用读写子程序
MOV CMD1302, #11000000B ;写入1302 RAM 00H单元
MOV H_SEC, #00000101B ;读写的数据,写入05H,设置过标记
MOV R7, #1 ;读写的字节数
MOV R0, #H_SEC ;地址送R0
CALL RW1302 ;调用读写子程序
MOV CMD1302, #10000000B ;写秒寄存器指令
MOV A, SEC ;H_SEC的值已被改变,重读
CALL ZH_16_BCD1 ;写入“秒“当前值
CLR ACC.7 ;最高位=0,启动时钟(冗余)
MOV H_SEC, A ;读写的数据,最高位为0,启动时钟
MOV R7, #1 ;读写的字节数
MOV R0, #H_SEC ;
CALL RW1302 ;调用读写子程序
MOV CMD1302, #10001110B ;设置写保护指令
MOV H_SEC, #10000000B ;读写的数据,不允许写入
MOV R7, #1 ;读写的字节数
MOV R0, #H_SEC ;地址送R0
CALL RW1302 ;调用读写子程序
RET
;DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 |