?? ds1307.c
字號:
#include"comm.h"
#include"ds1307.h"
#include"twi.h"
/*************DS1307操作**************開始**************/
//對DS1307內(nèi)存連續(xù)的寫操作
uchar rtc_write(uchar addr,uchar *buf,uchar len)
{
uchar i;
twi_start();
DelayMs(10);
twi_writebyte(DS1307_ADDR|TW_WRITE);
DelayMs(10);
twi_writebyte(addr);//write address
DelayMs(10);
for(i=0;i<len;i++)
{
twi_writebyte(buf[i]);
DelayMs(10);
}
twi_stop();
return 0;
}
//對DS1307內(nèi)存連續(xù)的讀操作
uchar rtc_read(uchar addr,uchar *buf,uchar len)
{
uchar i;
rtc_write(addr,0,0);//set address
DelayMs(10);
twi_start();
DelayMs(10);
twi_writebyte(DS1307_ADDR|TW_READ);
for(i=0;i<len-1;i++)
{
twi_readbyte(buf+i,TW_ACK);
DelayMs(10);
}
twi_readbyte(buf+i,TW_NACK);
DelayMs(10);
twi_stop();
return 0;
}
/*************DS1307操作**************結(jié)束**************/
/*************接口部分****************開始**************/
//更新或讀取DS1307日歷/時間數(shù)據(jù)
uchar RtcUpdateData(uchar direction)
{
uchar ret;
if(direction) //讀
ret=rtc_read(0,g_aTimeBuf,7);
else //寫
ret=rtc_write(0,g_aTimeBuf,7);
return ret;
}
//讀DS1307用戶RAM
uchar RtcReadRAM(uchar addr,uchar *buf,uchar len)
{
addr+=8;
return rtc_read(addr,buf,len);
}
//寫DS1307用戶RAM
uchar RtcWriteRAM(uchar addr,uchar *buf,uchar len)
{
addr+=8;
return rtc_write(addr,buf,len);
}
uchar byte_bintobcd(uchar bin)
{
uchar ret;
bin&=0x7f;
bin%=100;
ret=bin/10;
ret <<=4;
ret|=bin%10;
return ret;
}
uchar byte_bcdtobin(uchar bcd)
{
uchar ret;
ret=bcd & 0x0f;
ret+=(bcd>>4)*10;
return ret;
}
//將二進制格式緩沖區(qū)(g_aTimeBin)內(nèi)容轉(zhuǎn)換成BCD格式后保存到BCD格式緩沖區(qū)(g_aTimeBuf)
void RtcBinToBCD()
{
uchar i;
g_aTimeBin[0]&=0x7f;
g_aTimeBin[1]&=0x7f;
g_aTimeBin[2]&=0x3f;
g_aTimeBin[3]&=0x07;
g_aTimeBin[4]&=0x3f;
g_aTimeBin[5]&=0x1f;
g_aTimeBin[6]&=0xff;
for(i=0;i<7;i++)
g_aTimeBuf[i]=byte_bintobcd(g_aTimeBin[i]);
}
//將BCD格式緩沖區(qū)(g_aTimeBuf)內(nèi)容轉(zhuǎn)換成二進制格式后保存到二進制格式緩沖區(qū)(g_aTimeBin)
void RtcBCDToBin()
{
uchar i;
for(i=0;i<7;i++)
g_aTimeBin[i]=byte_bcdtobin(g_aTimeBuf[i]);
}
//寫DS1307配置字節(jié)
void RtcSetSQWOutput(uchar en,uchar level)
{
//en:方波輸出允許 TRUE 有效 level:如果輸出禁止 OUT口的邏輯電平
uchar c=0;
if(en) //enable
c=0x10;
else //disable
{
if(level)
c=0x80;
}
rtc_write(7,&c,1);
}
/*************接口部分***************結(jié)束**************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -