# include & lttask.h & gt
/******************************************************************/
sbit t_clk=p3^5;?//DS1302引腳連接
sbit t _ io =p3^6;
sbit t_rst=p3^7;sbit acc0=acc^0;//1位數據存儲位
sbit acc7=acc^7;
uchar starts_time[7]={0x00,0x10,0x22,0x20,0x05,0x04,0x 10 };?//初始化後的設置
uchar Sec
烏恰爾中心;
uchar小時;
烏恰年;
烏恰爾日;
uchar周;
uchar月;
/******************************************************************/
//根據選擇調整相應的項目。
空集合(uchar sel,uchar sel_1)
{
uchar地址、時間;
uchar max,min
if(sel==1)?{ address = 0x84max = 23min = 0;}?//小時
if(sel==2)?{ address = 0x82max = 59min = 0;}?//分鐘
if(sel==3)?{ address = 0x88max = 12;min = 1;}?//月份
if(sel==4)?{ address = 0x86max = 31;min = 1;}?//天
if(sel==5)?{ address = 0x8amax = 7;min = 1;}?//周
時間=R1302(地址+1)/16 * 10+r 1302(地址+1)% 16;?//轉換成BCD碼
if(sel _ 1 = = 1)time++;?否則時間-;
如果(時間& gtmax)時間= min
如果(時間& ltmin)時間= max
W1302(0x8e,0x 00);
W1302(地址,時間/10 * 16+時間% 10);
W1302(0x8e,0x 80);?
}
//* * * * * * * * ds 1302閱讀器* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
函數名:RTInputByte()
工作?Can:實時時鐘寫入壹個字節。
說?明:將1字節數據(內部函數)寫入DS1302。
錄入參數:d寫數據
返回值:無?
***********************************************************************/
無效RTInputByte(uchar d)
{
uchar h;
ACC = d;
for(h = 8;h & gt0;h -)
{
T _ IO = ACC0/*相當於RRC */
t _ CLK = 1;
t _ CLK = 0;
ACC = ACC & gt& gt1;
}
}
uchar RTOutputByte(void)
{
uchar h;
for(h = 8;h & gt0;h -)
{
ACC = ACC & gt& gt1;/*相當於RRC */
ACC7 = T _ IO
t _ CLK = 1;
t _ CLK = 0;
}
返回(ACC);
}
/***************************************************************************************************/
void W1302(uchar ucAddr,uchar ucDa)
{
t _ RST = 0;
t _ CLK = 0;
t _ RST = 1;
RTInputByte(UC addr);/*地址,命令*/
RTInputByte(ucDa);/*寫入1字節數據*/
t _ CLK = 1;
t _ RST = 0;
}
/********************************************************************
函數名:R1302()
工作?Can:讀取DS1302中某個地址的數據。
說?明:先寫地址,再讀命令/數據(內部函數)。
優化使用:RTInputByte(),RTOutputByte()
入口參數:ucAddr: DS1302地址。
返回值:ucData:數據讀取。
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData
t _ RST = 0;
t _ CLK = 0;
t _ RST = 1;
RTInputByte(UC addr);/*地址,命令*/
UC data = RTOutputByte();/*讀取1字節數據*/
t _ CLK = 1;
t _ RST = 0;
return(UC data);
}
/********************************************************************
函數名:Set1302()
工作?可以:設置初始時間。
說?明:先寫地址,再讀命令/數據(寄存器多字節模式)。
曲調使用:W1302()
入口參數:pClock:設置時鐘數據地址格式為:秒、分、日、月、周、年。
7Byte (BCD碼)1b 1b 1b 1b 1b?1B?1B
返回值:無
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar h;
uchar ucAddr = 0x80
W1302(0x8e,0x 00);/*控制命令,WP=0,寫操作?*/
for(h = 7;h & gt0;h -)
{
W1302(ucAddr,* pClock);?/*秒、分、天、月、周、年*/
pclock++;
ucAddr+= 2;
}
W1302(0xc0,0x 01);
W1302(0XC2,0x 03);?//初始自動轉換顯示時間為3秒。
W1302(0x8e,0x 80);/*控制命令,WP=1,寫保護?*/
}
void Auto _ set 1302(uchar * pClock)
{
uchar h;
uchar ucAddr = 0x80
if(((r 1302(0x 81))& amp;0x80)==0x80)
{
W1302(0x8e,0x 00);/*控制命令,WP=0,寫操作?*/
for(h = 7;h & gt0;h -)
{
W1302(ucAddr,* pClock);?/*秒、分、天、月、周、年*/
pclock++;
ucAddr+= 2;
}
W1302(ucNumRows_adder,0);
W1302(ucNumRows_p_adder,0);
w 1302(DISP _時間_加法器,170);
W1302(0xc0,0x 01);
W1302(0XC2,0x 03);?//初始自動轉換顯示時間為3秒。
W1302(0x8e,0x 80);/*控制命令,WP=1,寫保護?*/
?}
}
/* * * * * * * * * * * * * * * * ds 1302中的讀取時間* * * * * * * * *
void du1302()
{
sec = r 1302(0x 81);//以秒、分、天、月、周、年為單位。
cent = r 1302(0x 83);
小時= r 1302(0x 85);
day = r 1302(0x 87);
月= r 1302(0x 89);
week = r 1302(0x8b);
年份= r 1302(0x8d);
//b = r 1302(0xc 1);
//a = r 1302(0x C3);
//a = a/16 * 10+a % 16;
}
作廢?write_1302Data (uchar?ucAddr,uchar?值)
{
W1302(0x8e,0x 00);/*控制命令,WP=0,寫操作?*/
W1302(ucAddr,Value);?//地址和數據
W1302(0x8e,0x 80);/*控制命令,WP=1,寫保護?*/
}