📄 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 + -