⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8563.c

📁 at91sam9263 for rtc,其中rtc是npx公司的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 + -