搞了几天的PCF8563时钟芯片。。求助。。

2019-07-21 07:07发布

I2C有应答,但是不管写什么数据进去,读出来都是为0。有应答,应该可以说时序没有问题吧?、不知道为什么??晶振起振了。。换了几片的8563都不行。。写数据是按手册来写的。。望搞过的大侠求求助。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
18条回答
mvip
2019-07-21 19:08
给你一直在用的代码

#include "CF8563.h"

// 读取时间 
uchar ReadDateTime(DATETIME  *dt)
{
  uchar xdata i, buf[7];
  
  IIC_BitStart();
  if(!IIC_SendByte(PCF8563_WR)) return 0;  // 写地址 0x02
  if(!IIC_SendByte(0x02)) return 0;
  
  IIC_BitStart();            // 写读控制字
  if(!IIC_SendByte(PCF8563_RD)) return 0;
  for(i=0; i<7; i++)
  {
      buf = IIC_RcvByte();
      if(i<7)
      {
        SDA = 0;
        IIC_Clock();
      }
      else
      {
        SDA = 1;
        IIC_Clock();
        IIC_BitStop();
      }
  }
  
  dt->year   = ((buf[6]>>4)*10) + (buf[6] & 0x0F);
  dt->month  = (((buf[5]>>4) & 0x01)*10) + (buf[5] & 0x0F);
  dt->day    = (((buf[3]>>4) & 0x03)*10) + (buf[3] & 0x0F);
  dt->hour   = (((buf[2]>>4) & 0x03)*10) + (buf[2] & 0x0F);
  dt->minute = (((buf[1]>>4) & 0x07)*10) + (buf[1] & 0x0F);
  dt->second = (((buf[0]>>4) & 0x07)*10) + (buf[0] & 0x0F);
  
  return 1;
}

// 启动时钟
uchar StartDateTime(void)
{
  uchar xdata i, buf[2];
  
  buf[0] = 0;
  buf[1] = 0;
  
  IIC_BitStart();
  if(!IIC_SendByte(PCF8563_WR)) return 0;
  if(!IIC_SendByte(0x00)) return 0;      //address
  for(i=0; i<2; i++)
  {
    if(!IIC_SendByte(buf)) return 0;
  }
  IIC_BitStop();  
  
  return 1;
}

// 设置时间
uchar SetDateTime(DATETIME *dt)
{
  uchar xdata i, buf[7];
  
  buf[0] = ((dt->second/10) << 4) + (dt->second%10);
  buf[1] = ((dt->minute/10) << 4) + (dt->minute%10);
  buf[2] = ((dt->hour/10) << 4) + (dt->hour%10);
  buf[3] = ((dt->day/10) << 4) + (dt->day%10);
  buf[4] = 1;
  buf[5] = ((dt->month/10) << 4) + (dt->month%10);
  buf[6] = ((dt->year/10) << 4) + (dt->year%10);

  IIC_BitStart();
  if(!IIC_SendByte(PCF8563_WR)) return 0;
  if(!IIC_SendByte(0x02)) return 0;      //address
  for(i=0; i<7; i++)
  {
    if(!IIC_SendByte(buf)) return 0;
  }
  IIC_BitStop();  
  
  return 1;
}

// 判断时间
bit IsDateTime(void)
{
  DATETIME xdata dt;
  ReadDateTime(&dt);
  
  if((dt.year > 99) || (dt.year < 0)) return 0;
  if((dt.month > 12) || (dt.month <= 0)) return 0;
  if((dt.day > 31) || (dt.day <= 0)) return 0;
  if((dt.hour > 23) || (dt.hour < 0)) return 0;
  if((dt.minute > 59) || (dt.minute < 0)) return 0;
  if((dt.second > 59) || (dt.second < 0)) return 0;
  
  return 1;
}

一周热门 更多>