DS1302+AT89S51构成的万年历(源程序三);
*****************************************************************
; 从DS1302读数据或者写数据到DS1302子程序
;入口信息:R0中的内容是CPU_RAM中的块数据的首地址 (从高地址开始)
; R7中的内容是块数据中有多少个数
; B中的内容是DS1302中的块数据的首地址(从低地址开始)
; R_OR_W是从DS1302读数据还是写数据到DS1302的位标志( R_OR_W=0,写数据.
R_OR_W=1,读数据)
;出口信息:
;影响资源:
;占用资源:
;****************************************************************
RW_RTC: NOP;
RTC_1: CLR SCLK
NOP
SETB RST
MOV R6,#8
MOV A,B
RTC_2: CLR SCLK
RRC A
MOV IO,C
NOP
SETB SCLK
DJNZ R6,RTC_2;等八位都送完
MOV R6,#8
JNB R_OR_W,RTC_3;如果R_OR_W=0就跳转,也就是写数据
R_RTC: CLR SCLK
NOP
MOV C,IO;读数据
RRC A
SETB SCLK
DJNZ R6,R_RTC;等八位都读完
CJNE R0,#YEAR_SG,A1;
JB WEEK_BIT,A1;
MOV WEEK,A;
SETB WEEK_BIT;
INC R0;
AJMP RTC_6;
A1: MOV @R0,A;
SJMP RTC_6
RTC_3: NOP;
CJNE R0,#YEAR_SG,B1;
JB WEEK_BIT,B1;
MOV A,WEEK;
SETB WEEK_BIT;
INC R0;
AJMP W_RTC;
B1: MOV A,@R0;取要写的数
W_RTC: CLR SCLK
RRC A;
MOV IO,C;写数据
NOP
SETB SCLK
DJNZ R6,W_RTC;等八位都写完
RTC_6: DEC R0;NEXT DATA/ADDRESS. (R0=#SECSG,SECSG=37H,
MINSG=36H........YEARSG=31H)
MOV A,B
ADD A,#00000010B;ADDRESS+1.
MOV B,A;
CLR RST
NOP
CLR SCLK
DJNZ R7,RTC_1;等七个数都读完
NOP
RET
;**************************************************************
; 初始化DS1302子程序













