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

📄 pcf8563.c

📁 PIC18F6720写DAC7612U,TA1604_LCD显示,I2C读写PCF8563,PIC单片机之间模拟I2C通讯,该软件已调试通过,已经在产品上使用,有中文说明.
💻 C
📖 第 1 页 / 共 2 页
字号:
                                          当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 + -