|
//********向1302寫數(shù)據(jù)*********
void Write1302(uchar dat)
{
uchar i;
SCLK=0; //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準(zhǔn)備
delay1(1); //稍微等待,使硬件做好準(zhǔn)備
for(i=0;i<8;i++) //連續(xù)寫8個(gè)二進(jìn)制位數(shù)據(jù)
{
IO=dat&0x01; //取出dat的第0位數(shù)據(jù)寫入1302
delay(1); //稍微等待,使硬件做好準(zhǔn)備
SCLK=1; //上升沿寫入數(shù)據(jù)
delay1(1); //稍微等待,使硬件做好準(zhǔn)備
SCLK=0; //重新拉低SCLK,形成脈沖
dat>>=1; //將dat的各數(shù)據(jù)位右移1位,準(zhǔn)備寫入下一個(gè)數(shù)據(jù)位
}
}
void WriteSet1302(uchar Cmd,uchar dat)
{
RST=0; //禁止數(shù)據(jù)傳遞
SCLK=0; //確保寫數(shù)居前SCLK被拉低
RST=1; //啟動數(shù)據(jù)傳輸
delay1(1); //稍微等待,使硬件做好準(zhǔn)備
Write1302(Cmd); //寫入命令字
Write1302(dat); //寫數(shù)據(jù)
SCLK=1; //將時(shí)鐘電平置于已知狀態(tài)
RST=0; //禁止數(shù)據(jù)傳遞
}
uchar Read1302(void)
{
uchar i,dat;
delay(1); //稍微等待,使硬件做好準(zhǔn)備
for(i=0;i<8;i++) //連續(xù)讀8個(gè)二進(jìn)制位數(shù)據(jù)
{
dat>>=1; //將dat的各數(shù)據(jù)位右移1位,因?yàn)橄茸x出的是字節(jié)的最低位
if(IO==1) //如果讀出的數(shù)據(jù)是1
dat|=0x80; //將1取出,寫在dat的最高位
SCLK=1; //將SCLK置于高電平,為下降沿讀出
delay1(1); //稍微等待
SCLK=0; //拉低SCLK,形成脈沖下降沿
delay1(1); //稍微等待
}
return dat; //將讀出的數(shù)據(jù)返回
}
uchar ReadSet1302(uchar Cmd)
{
uchar dat;
RST=0; //拉低RST
SCLK=0; //確保寫數(shù)居前SCLK被拉低
RST=1; //啟動數(shù)據(jù)傳輸
Write1302(Cmd); //寫入命令字
dat=Read1302(); //讀出數(shù)據(jù)
SCLK=1; //將時(shí)鐘電平置于已知狀態(tài)
RST=0; //禁止數(shù)據(jù)傳遞
return dat; //將讀出的數(shù)據(jù)返回
}
void Init_DS1302(void)
{
WriteSet1302(0x8E,0x00); //根據(jù)寫狀態(tài)寄存器命令字,寫入不保護(hù)指令
WriteSet1302(0x80,((0/10)<<4|(0%10))); //根據(jù)寫秒寄存器命令字,寫入秒的初始值
WriteSet1302(0x82,((45/10)<<4|(45%10))); //根據(jù)寫分寄存器命令字,寫入分的初始值
WriteSet1302(0x84,((15/10)<<4|(15%10))); //根據(jù)寫小時(shí)寄存器命令字,寫入小時(shí)的初始值
WriteSet1302(0x86,((29/10)<<4|(29%10))); //根據(jù)寫日寄存器命令字,寫入日的初始值
WriteSet1302(0x88,((11/10)<<4|(11%10))); //根據(jù)寫月寄存器命令字,寫月的初始值
WriteSet1302(0x8c,((15/10)<<4|(15%10))); //.....年.....................年.........
}
|
|