?? ds1307.c
字號:
//=====================================================================
// ds1307.c
//=====================================================================
#define A_DS1307 0xd0
//===================================================================
//= 函數原型: int8 bcd2bin(int8 bcdval)
//= 參 數: 待轉換的BCD碼
//= 返 回 值: 轉換后的BCD進制代碼
//= 功 能: BCD => BIN
//===================================================================
int8 bcd2bin(int8 bcdval)
{
int8 binval;
/*
if(bcdval >= 0x10)
{
// binval = 10*(bcdval>>4) + (bcdval&0x0f);
binval = bcdval>>4;
binval = 10*binval;
binval = binval+(bcdval&0x0f);
}
else
binval = bcdval;
*/
binval = bcdval>>4;
binval = 10*binval;
binval = binval+(bcdval&0x0f);
return binval;
}
/*
//===================================================================
//= 函數原型: int8 bin2bcd(int8 binval)
//= 參 數: 待轉換的BIN碼
//= 返 回 值: 轉換后的BCD進制代碼
//= 功 能: BIN => BCD
//===================================================================
int8 bin2bcd(int8 binval)
{
int8 bcdval;
if(binval >= 10)
bcdval = ((binval/10) << 4) | (binval%10);
else
bcdval = binval;
return bcdval;
}
*/
//===================================================================
//= 函數原型: int8 LeapYear(int8 year)
//= 參 數: 年份(0--99) bin碼
//= 返 回 值: 1--閏年 0--平年
//= 功 能: 判斷是否是閏年
//===================================================================
int8 LeapYear(int8 year)
{
int16 inty;
int8 leapy = 0;
inty = year + 2000;
if (((inty%4 == 0) && (inty%100 != 0)) || (inty%400 == 0))
leapy = 1;
return(leapy);
}
//===================================================================
//= 函數原型: int8 GetNumDays(int8 year,int8 month)
//= 參 數: 年份 月份
//= 返 回 值: 該月的天數
//= 功 能: 判斷某個月的天數
//===================================================================
int8 GetNumDays(int8 year,int8 month)
{
int16 inty;
int8 day;
static char daytab[] = {31,28,31,30,31,30,31,31,30,31,30,31};
inty = year + 2000;
if (LeapYear(inty) && (month==2))
day = 29;
else
day = daytab[month-1];
return(day);
}
//===================================================================
//= 函數原型: bit RTCTimeSet(void)
//= 參 數: 無(全局變量gv_time_data[]傳遞參數)
//= 返 回 值: TRUE/FALSE
//= 功 能: 設置時間(寫時間)
//===================================================================
int1 RTCTimeSet(void)
{
unsigned char i,buf[7],retval;
for (i=0;i<7;i++) buf[i] = gv_time_data[i];
if (i2c_pkt_write(A_DS1307,RTC_SECOND,&buf[RTC_SECOND],3))
{
i2c_pkt_write(A_DS1307,RTC_DATE,&buf[RTC_DATE],3);
retval = 1;
}
else
retval = 0;
return retval;
}
//===================================================================
//= 函數原型: bit RTCTimeRead(void)
//= 參 數: 無(全局變量gv_time_data[]傳遞參數)
//= 返 回 值: TRUE/FALSE
//= 功 能: 取時間(讀時間)
//===================================================================
int1 RTCTimeRead(void)
{
unsigned char i,buf[7],retval;
if (i2c_pkt_read(A_DS1307,RTC_SECOND,&buf[RTC_SECOND],3))
{
i2c_pkt_read(A_DS1307,RTC_DAY,&buf[RTC_DAY],4);
for (i=0;i<7;i++)
gv_time_data[i] = buf[i]; //二進制BCD碼
retval = 1;
}
else
retval = 0;
return retval;
}
//===================================================================
//= 函數原型: void InitDS1307(void)
//= 參 數: 無
//= 返 回 值: 無
//= 功 能: 初始化DS1307
//===================================================================
void InitDS1307(void)
{
int8 i;
int8 time_err = 0;
if(!RTCTimeRead()) return;
// i = Bin(10000000);
i = 0x80;
i2c_pkt_write(A_DS1307,RTC_CONTROL,&i,3); // 寫控制字
for (i=0;i<7;i++) gv_time_data[i] = bcd2bin(gv_time_data[i]);
if ((gv_time_data[RTC_SECOND] > 59) ||
(gv_time_data[RTC_MINUTE] > 59) ||
(gv_time_data[RTC_HOUR] > 23))
time_err = 1;
if ((gv_time_data[RTC_DATE] == 0) ||
(gv_time_data[RTC_DATE] > GetNumDays(gv_time_data[RTC_YEAR],gv_time_data[RTC_MONTH])))
time_err = 1;
if ((gv_time_data[RTC_MONTH] == 0) ||
(gv_time_data[RTC_MONTH] > 12))
time_err = 1;
if(time_err == 1)
{
gv_time_data[RTC_SECOND] = 1;
gv_time_data[RTC_MINUTE] = 1;
gv_time_data[RTC_HOUR] = 1;
gv_time_data[RTC_DATE] = 1;
gv_time_data[RTC_MONTH] = 1;
gv_time_data[RTC_YEAR] = 6;
time_err = 0;
RTCTimeSet();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -