📄 pcf8563.c
字号:
当AIE=0时,alarm中断不允许;当AIE=1时,alarm中断允许;
当定时器倒计数为0时,将TF=1;
当报警产生时,将AF=1;
当TI/TP=0时,若TF=1且TIE=1,则INT有效;当TI/TP=1时,若TIE=1,则INT脚产生脉冲输出;
若AIE=1且AF=1,则PCF8563的INT脚一直输出为低电平
---------------------------------------------------------------------------------*/
void SetPCF8563(int timetype,int value)
{
I2CStart(); //发开始条件
write_I2C_byte(0xA2); //发送"写器件地址",PCF8563的"写器件地址"为0xA2
WaitAck(); //等待PCF8563_IO脚被PCF8563拉低;
write_I2C_byte(timetype); //发送器件的子地址:0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
WaitAck(); //等待PCF8563_IO脚被PCF8563拉低;
write_I2C_byte(value); // 发送器件的新设置时间值(BCD格式)
WaitAck(); //等待PCF8563_IO脚被PCF8563拉低;
I2CStop();
}
//下面的程序将2006年3月8日星期3,15点59分30秒写入PCF8563
void write_PCF8563_time(int year, int month, int day, int hour, int minute, int second){
SetPCF8563(0x00,0); //0x00是控控制/状态寄存器1,启动PCF8563时钟;
SetPCF8563(0x01,0); //0x01是控制/状态寄存器2;
//定时器倒计数中断不允许,TIE=0;
//清除定时器倒计数中断标志位,TF=0;
//报警中断不允许,AIE=0;
//清除报警中断标志位,AF=0;
//SetPCF8563(0x02,0x30); //将30秒写入PCF8563
//SetPCF8563(0x03,0x59); //将59分写入PCF8563
//SetPCF8563(0x04,0x15); //将15点写入PCF8563
//SetPCF8563(0x05,0x08); //将8日写入PCF8563
//SetPCF8563(0x06,0x03); //将星期3写入PCF8563
//SetPCF8563(0x07,0x03); //将3月写入PCF8563,同时将21世纪写入PCF8563(因为月寄存器的C=0);
//SetPCF8563(0x08,0x06); //将06年写入PCF8563
SetPCF8563(0x08,year); //将year年写入PCF8563
SetPCF8563(0x07,month); //将month月写入PCF8563,同时将21世纪写入PCF8563(因为月寄存器的C=0);
SetPCF8563(0x05,day); //将day日写入PCF8563
//SetPCF8563(0x06,0x03); //将星期3写入PCF8563
SetPCF8563(0x04,hour); //将hour点写入PCF8563
SetPCF8563(0x03,minute); //将minute分写入PCF8563
SetPCF8563(0x02,second); //将second秒写入PCF8563
}
//下面的程序设置在每小时零5分报警一次,即每小时报警一次;
//0x01 控制/状态寄存器2的地址
/* alarmtype为: 0x09 分钟报警寄存器地址;
0x0A 小时报警寄存器地址;
0x0B 日报警寄存器地址;
0x0C 星期报警寄存器地址;
alarm_time为:设置报警时间(BCD格式);
*/
void set_PCF8563_alarm(int alarmtype,int alarm_time){
SetPCF8563(0x01,0x00); //0x01:控制/状态寄存器2的地址,0x00即AIE=0报警无效,TIE=0,定时器中断无效
SetPCF8563(0x09,0x80); //0x09分钟报警寄存器地址,0x80即AE=1,分钟报警无效;
SetPCF8563(0x0A,0x80); //0x0A小时报警寄存器地址,0x80即AE=1,小时报警无效;
SetPCF8563(0x0B,0x80); //0x0B日报警寄存器地址,0x80即AE=1,日报警无效;
SetPCF8563(0x0C,0x80); //0x0C星期报警寄存器地址,0x80即AE=1,星期报警无效;
SetPCF8563(0x0D,0x00); //0x0D:CLKOUT频率寄存器地址,0X00:FE=0,禁止CLKOUT输出
SetPCF8563(0x0E,0x03); //0x0E:定时器控制寄存器地址, 0x03:TE=0,定时器无效,TD1=1,TD0=1(1/60Hz)
SetPCF8563(0x01,0x02); //0x01:控制/状态寄存器2的地址,0x02即AIE=1报警有效
//SetPCF8563(0x09,0x05); //0x09 分钟报警寄存器地址;设置在每小时零5分报警一次;(因为分钟报警寄存器的最高位AE=0);
//SetPCF8563(0x0A,0x16); //0x0A 小时报警寄存器地址;设置在每天的16时零5分报警一次;
SetPCF8563( alarmtype,alarm_time );
}
/**--------------------------------------------------------------------------------
调用方式:void CleanAlarm(void)
函数说明:清除所有报警设置。
---------------------------------------------------------------------------------*/
void CleanAlarm(void)
{
SetPCF8563(0x01,0x00); /*0x01:控制/状态寄存器2的地址,0x00即AIE=0报警无效,TIE=0,定时器中断无效*/
SetPCF8563(0x09,0x80); /*0x09分钟报警寄存器地址,0x80即AE=1,分钟报警无效*/
SetPCF8563(0x0A,0x80); /*0x0A小时报警寄存器地址,0x80即AE=1,小时报警无效*/
SetPCF8563(0x0B,0x80); /*0x0B日报警寄存器地址,0x80即AE=1,日报警无效*/
SetPCF8563(0x0C,0x80); /*0x0C星期报警寄存器地址,0x80即AE=1,星期报警无效*/
// SetPCF8563(0x0D,0x00); /*0x0D:CLKOUT频率寄存器地址,0X00:FE=0,禁止CLKOUT输出*/
// SetPCF8563(0x0E,0x03); /* 0x0E:定时器控制寄存器地址, 0x03:TE=0,定时器无效,TD1=1,TD0=1(1/60Hz)*/
}
/*
//串行移位输出一个字节
void write_PCF8563_byte(BYTE cmd) {
BYTE i;
for(i=0;i<=7;++i) {
output_bit(PCF8563_IO, shift_right(&cmd,1,0) ); //将cmd所指的单元右移一位,左端补0,移出的位经PCF8563_IO脚输出
output_high(PCF8563_SCLK); //PCF8563_SCLK脚上升沿到来时,PCF8563收到一位值;
output_low(PCF8563_SCLK); //PCF8563_SCLK脚置低电平,为下次移位做准备
}
}
//串行移位输入一个字节
BYTE read_PCF8563(BYTE cmd) {
BYTE i,data;
write_PCF8563_byte(cmd); //向PCF8563写地址;
for(i=0;i<=7;++i) {
shift_right(&data,1,input(PCF8563_IO)); //CPU从PCF8563读入1位
output_high(PCF8563_SCLK); //PCF8563_SCLK脚上升沿到来时,告诉PCF8563已经移出一位值;
delay_us(2);
output_low(PCF8563_SCLK); //PCF8563_SCLK脚置低电平,为PCF8563下次移位做准备
delay_us(2);
}
return(data);
}
void write_PCF8563(BYTE cmd, BYTE data) {
write_PCF8563_byte(cmd); //向PCF8563写数据所对应的地址;
write_PCF8563_byte(data); //向PCF8563所对应的地址处写数据;
}
void PCF8563_init() {
BYTE x;
delay_us(2);
output_low(PCF8563_SCLK);
write_PCF85630(x8e,0);
write_PCF8563(0x90,0xa6);
x=read_PCF8563(0x81);
if((x & 0x80)!=0)
write_PCF8563(0x80,0);
}
void PCF8563_set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) {
write_PCF8563(0x05,day); //0x05是PCF8563的day寄存器地址
write_PCF8563(0x07,mth); //0x07是PCF8563的month寄存器地址
write_PCF8563(0x08,year);//0x08是PCF8563的year寄存器地址
write_PCF8563(0x06,dow); //0x06是PCF8563的weekdays寄存器地址
write_PCF8563(0x04,hr); //0x04是PCF8563的hour寄存器地址
write_PCF8563(0x03,min); //0x03是PCF8563的mintue寄存器地址
write_PCF8563(0x02,0); //0x02是PCF8563的second寄存器地址
}
void PCF8563_get_date(BYTE& day, BYTE& mth, BYTE& year, BYTE& dow) {
day = read_PCF8563(0x05); //从PCF8563读天数
mth = read_PCF8563(0x07); //从PCF8563读月数
year =read_PCF8563(0x08); //从PCF8563读年数
dow = read_PCF8563(0x06); //从PCF8563读是星期几
}
void PCF8563_get_time(BYTE& hr, BYTE& min, BYTE& sec) {
hr = read_PCF8563(0x04);
min = read_PCF8563(0x03);
sec = read_PCF8563(0x02);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -