//打開DS1302
void TimeSpiOpen(void)
{
TIMECLK = 0;
TIMERST = 0;//禁止DS1302
TIMEIO= 1;//釋放數(shù)據(jù)總線
TIMERST = 1;//使能DS1302
}
//關閉DS1302
void TimeSpiClose(void)
{
TIMERST = 0;//禁止DS1302
TIMEIO= 1;//釋放數(shù)據(jù)總線
TIMECLK = 1;
}
//讀寫DS1302
unsigned char TimeSpiReadWrite(unsigned char val)
{
unsigned char i;
ACC = val;//取8位數(shù)據(jù)
for (i = 8;i > 0; i--)
{
TIMECLK = 0;//時鐘下降沿輸入數(shù)據(jù)(DS1302讀)
_nop_();//延時
CY = TIMEIO;//接收串行數(shù)據(jù)到CY
_rrca_();//右移一位數(shù)據(jù)到CY(先存后取)
TIMEIO = CY;//發(fā)送串行數(shù)據(jù)
TIMECLK = 1;//時鐘上升沿打入數(shù)據(jù)(DS1302寫)
TIMEIO= 1;//釋放數(shù)據(jù)總線
}
val = ACC;
return val;
}
//讀DS1302字節(jié)
unsigned char TimeByteRead(unsigned char address)
{
TimeSpiOpen();//打開DS1302
TimeSpiReadWrite(address);//寫入DS1302命令
address = TimeSpiReadWrite(0xff);//讀入DS1302數(shù)據(jù)
TimeSpiClose();//關閉DS1302
return address;//返回數(shù)據(jù)
}
//讀DS1302RAM字節(jié)
unsigned char TimeRamByteRead(unsigned char address)
{
TimeSpiOpen();//打開DS1302
TimeSpiReadWrite((address << 1) | 0xc1);//寫入DS1302命令
address = TimeSpiReadWrite(0xff);//讀入DS1302數(shù)據(jù)
TimeSpiClose();//關閉DS1302
return address;//返回數(shù)據(jù)
}
//寫DS1302字節(jié)
void TimeByteWrite(unsigned char address, unsigned char val)
{
TimeSpiOpen();//打開DS1302
TimeSpiReadWrite(address);//寫地址
TimeSpiReadWrite(val);//寫數(shù)據(jù)
TimeSpiClose();//關閉DS1302
}
//寫DS1302字節(jié)
void TimeRamByteWrite(unsigned char address, unsigned char val)
{
TimeSpiOpen();//打開DS1302
TimeSpiReadWrite((address << 1) | 0xc0);//寫地址
TimeSpiReadWrite(val);//寫數(shù)據(jù)
TimeSpiClose();//關閉DS1302
}
//使能DS1302寫保護
void TimeWriteEnable(void)
{
TimeByteWrite(timewriteregall, timewriteseg);//使能DS1302寫保護
}
//開放DS1302寫保護
void TimeWrieDisbale(void)
{
TimeByteWrite(timewriteregall, 0);//開放DS1302寫保護
}
//DS1302工作開始
void TimeWorkStart(void)
{
unsigned char val;
val = TimeByteRead(timereadseg);//讀秒數(shù)據(jù)
val &= 0x7f;//打開晶振
TimeWrieDisbale();//開放DS1302寫保護
TimeByteWrite(timewriteseg, val);//打開晶振
TimeByteWrite(tricklewrite, 0xa5);//打開充電二極管
TimeWriteEnable();//使能DS1302寫保護
}





