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

📄 pcf8583.c

📁 CVAVR的函数库的源代码。开发AVR的编译器CodeVision AVR最新版本2.53的函数库c语言源代码。函数短小精悍
💻 C
字号:
/*
  CodeVisionAVR C Compiler
  (C) 1998-2004 Pavel Haiduc, HP InfoTech S.R.L.

  Philips PCF8583 I2C bus Real Time Clock functions
*/


#include <i2c.h>
#include <bcd.h>

unsigned char rtc_read(unsigned char chip,unsigned char address)
{
unsigned char a;
a=(chip<<1)|0xa0;
i2c_start();
i2c_write(a);
i2c_write(address);
i2c_start();
i2c_write(a|1);
a=i2c_read(0);
i2c_stop();
return a;
}

void rtc_write(unsigned char chip, unsigned char address,unsigned char data)
{
i2c_start();
i2c_write((chip<<1)|0xa0);
i2c_write(address);
i2c_write(data);
i2c_stop();
}

unsigned char rtc_get_status(unsigned char chip)
{
__rtc_status=rtc_read(chip,0);
__rtc_alarm=(__rtc_status&2);
return __rtc_status;
}

void rtc_init(unsigned char chip,unsigned char dated_alarm)
{
unsigned char d;
d=0x90;
if (dated_alarm) d=0xb0;
__rtc_status=0;
__rtc_alarm=0;
rtc_write(chip,0,0);
rtc_write(chip,4,rtc_read(chip,4)&0x3f);
rtc_write(chip,8,d);
}

void rtc_stop(unsigned char chip)
{
rtc_get_status(chip);
__rtc_status|=0x80;
rtc_write(chip,0,__rtc_status);
}

void rtc_start(unsigned char chip)
{
rtc_get_status(chip);
__rtc_status&=0x7f;
rtc_write(chip,0,__rtc_status);
}

void rtc_hold_off(unsigned char chip)
{
rtc_get_status(chip);
__rtc_status&=0xbf;
rtc_write(chip,0,__rtc_status);
}

void rtc_hold_on(unsigned char chip)
{
rtc_get_status(chip);
__rtc_status|=0x40;
rtc_write(chip,0,__rtc_status);
}

void rtc_alarm_off(unsigned char chip)
{
rtc_get_status(chip);
__rtc_status&=0xfb;
rtc_write(chip,0,__rtc_status);
}

void rtc_alarm_on(unsigned char chip)
{
rtc_get_status(chip);
__rtc_status|=4;
rtc_write(chip,0,__rtc_status);
}

unsigned char rtc_read_bcd(unsigned char chip,unsigned char addr)
{
return bcd2bin(rtc_read(chip,addr));
}

void rtc_write_bcd(unsigned char chip,unsigned char addr,unsigned char data)
{
rtc_write(chip,addr,bin2bcd(data));
}

void rtc_write_word(unsigned char chip,unsigned char addr,unsigned data)
{
rtc_write(chip,addr,(unsigned char) data&0xff);
rtc_write(chip,++addr,(unsigned char)(data>>8));
}

void rtc_write_date(unsigned char chip,unsigned char addr,unsigned char date,
unsigned year)
{
rtc_write(chip,addr,bin2bcd(date)|(((unsigned char) year&3)<<6));
}

void rtc_get_time(unsigned char chip,unsigned char *hour,unsigned char *min,
unsigned char *sec,unsigned char *hsec)
{
rtc_hold_on(chip);
*hsec=rtc_read_bcd(chip,1);
*sec=rtc_read_bcd(chip,2);
*min=rtc_read_bcd(chip,3);
*hour=rtc_read_bcd(chip,4);
rtc_hold_off(chip);
}

void rtc_set_time(unsigned char chip,unsigned char hour,unsigned char min,
unsigned char sec,unsigned char hsec)
{
rtc_stop(chip);
rtc_write_bcd(chip,1,hsec);
rtc_write_bcd(chip,2,sec);
rtc_write_bcd(chip,3,min);
rtc_write_bcd(chip,4,hour);
rtc_start(chip);
}

void rtc_get_date(unsigned char chip,unsigned char *date,unsigned char *month,
unsigned *year)
{
unsigned char dy;
unsigned y1;
rtc_hold_on(chip);
dy=rtc_read(chip,5);
*month=bcd2bin(rtc_read(chip,6)&0x1f);
rtc_hold_off(chip);
*date=bcd2bin(dy&0x3f);
dy>>=6;
y1=rtc_read(chip,0x10)|((unsigned) rtc_read(chip,0x11)<<8);
if (((unsigned char) y1&3)!=dy) rtc_write_word(chip,0x10,++y1);
*year=y1;
}

void rtc_set_date(unsigned char chip,unsigned char date,unsigned char month,
unsigned year)
{
rtc_write_word(chip,0x10,year);
rtc_stop(chip);
rtc_write_date(chip,5,date,year);
rtc_write_bcd(chip,6,month);
rtc_start(chip);
}

void rtc_get_alarm_time(unsigned char chip,unsigned char *hour,
unsigned char *min,unsigned char *sec,unsigned char *hsec)
{
*hsec=rtc_read_bcd(chip,9);
*sec=rtc_read_bcd(chip,0xa);
*min=rtc_read_bcd(chip,0xb);
*hour=rtc_read_bcd(chip,0xc);
}

void rtc_set_alarm_time(unsigned char chip,unsigned char hour,
unsigned char min,unsigned char sec,unsigned char hsec)
{
rtc_write_bcd(chip,9,hsec);
rtc_write_bcd(chip,0xa,sec);
rtc_write_bcd(chip,0xb,min);
rtc_write_bcd(chip,0xc,hour);
}

void rtc_get_alarm_date(unsigned char chip,unsigned char *date,
unsigned char *month)
{
*date=bcd2bin(rtc_read(chip,0xd)&0x3f);
*month=bcd2bin(rtc_read(chip,0xe)&0x1f);
}

void rtc_set_alarm_date(unsigned char chip,unsigned char date,
unsigned char month)
{
rtc_write_date(chip,0xd,date,0);
rtc_write_bcd(chip,0xe,month);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -