📄 pcf8563.c
字号:
/*
* Date & Time support for Philips PCF8563 RTC
* CHENMENG(Meterchen) 20041200
* www.cmtekchina.com
*/
/* #define DEBUG */
#include "bsp.h"
void rtc_write(char reg, unsigned char val);
unsigned char rtc_read(char reg);
unsigned char bin2bcd(unsigned int n);
unsigned int bcd2bin(unsigned char c);
/* ------------------------------------------------------------------------- */
unsigned char rtc_read (char reg)
{
return (i2c_reg_read (CFG_I2C_RTC_ADDR, reg));
}
void rtc_write (char reg, unsigned char val)
{
i2c_reg_write (CFG_I2C_RTC_ADDR, reg, val);
}
unsigned bcd2bin (unsigned char n)
{
return ((((n >> 4) & 0x0F) * 10) + (n & 0x0F));
}
unsigned char bin2bcd (unsigned int n)
{
return (((n / 10) << 4) | (n % 10));
}
/* ------------------------------------------------------------------------- */
void RTC_Get(struct rtc_time *t)
{
unsigned char sec, min, hour, mday, wday, mon_cent, year;
sec = rtc_read (0x02);
min = rtc_read (0x03);
hour = rtc_read (0x04);
mday = rtc_read (0x05);
wday = rtc_read (0x06);
mon_cent= rtc_read (0x07);
year = rtc_read (0x08);
if (sec & 0x80) {
putk ("### Warning: RTC Low Voltage - date/time not reliable\n");
}
t->tm_sec = bcd2bin (sec & 0x7F);
t->tm_min = bcd2bin (min & 0x7F);
t->tm_hour = bcd2bin (hour & 0x3F);
t->tm_mday = bcd2bin (mday & 0x3F);
t->tm_mon = bcd2bin (mon_cent & 0x1F);
t->tm_year = bcd2bin (year) + ((mon_cent & 0x80) ? 2000 : 1900);
t->tm_wday = bcd2bin (wday & 0x07);
t->tm_yday = 0;
t->tm_isdst= 0;
putk("Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
t->tm_year, t->tm_mon, t->tm_mday, t->tm_wday,
t->tm_hour, t->tm_min, t->tm_sec);
}
/* ------------------------------------------------------------------------- */
void RTC_Set(struct rtc_time *t)
{
unsigned char century;
putk ( "Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\r\n",
t->tm_year, t->tm_mon, t->tm_mday, t->tm_wday,
t->tm_hour, t->tm_min, t->tm_sec);
rtc_write (0x08, bin2bcd(t->tm_year % 100));
century = (t->tm_year >= 2000) ? 0x80 : 0;
rtc_write (0x07, bin2bcd(t->tm_mon) | century);
rtc_write (0x06, bin2bcd(t->tm_wday));
rtc_write (0x05, bin2bcd(t->tm_mday));
rtc_write (0x04, bin2bcd(t->tm_hour));
rtc_write (0x03, bin2bcd(t->tm_min ));
rtc_write (0x02, bin2bcd(t->tm_sec ));
}
/* ------------------------------------------------------------------------- */
void RTC_Reset (void)
{
/* clear all control & status registers */
rtc_write (0x00, 0x00);
rtc_write (0x01, 0x00);
rtc_write (0x0D, 0x00);
/* clear Voltage Low bit */
rtc_write (0x02, rtc_read (0x02) & 0x7F);
/* reset all alarms */
rtc_write (0x09, 0x00);
rtc_write (0x0A, 0x00);
rtc_write (0x0B, 0x00);
rtc_write (0x0C, 0x00);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -