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

📄 pcf8563.c

📁 pcf8563 51单片机
💻 C
字号:
//以下是PCF8563.c文件的源程序
#include "pcf8563.h"
#include "iic.h"

/*功能描述:向地址adr的寄存器写入多个字节
  隶属模块:PCF8563驱动模块
  函数属性:内部
  参数说明:addr:寄存器地址
            length:要写入的字节数
            pbuf:指向数据缓冲区的指针
  返回说明:操作结果,0表示成功,1表示失败*/

  
unsigned char PCF8563_Write_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf)
{ unsigned char i=0;
  IIC_Start(); //IIC通讯开始
  if(IIC_Write_Byte(0xa2)) return 1;  //写入PCF8563的ID与读写控制位,通讯有错误立即返回
  if(IIC_Write_Byte(addr)) return 1;  //写寄存器地址
  for(i=0;i<length;i++)  //写入length个字节
  {
    if(IIC_Write_Byte(pbuf[i])) return 1;//将pbuf中的length个字节写入pcf8563的数据缓冲区

   }
 IIC_Stop();
 return 0;

}

/*功能描述:从地址addr的寄存器读取多个字节
  隶属模块:PCF8563驱动模块
  函数属性:内部:
  参数说明:addr:寄存器地址
            length:要读出的字节数
            pbuf:指向数据缓冲区的指针
  返回说明:操作结果,0表示成功,1表示失败*/
unsigned char PCF8563_Read_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf )
{
 unsigned char i=0,err=0;
 IIC_Start(); //IIC通讯开始
 if(IIC_Write_Byte(0xa2)) return 1;  //写入PCF8563的ID与读写控制位,通讯有错误立即返回
 if(IIC_Write_Byte(addr)) return 1;  //写寄存器地址
 
 IIC_Start();
 if(IIC_Write_Byte(0xa3)) return 1; //前length-1个字节,每读完一个字节要向PCF8563提供ACK,即告诉其继续提供下面的数据,读取操作还未完毕 

   for(i=0;i<length-1;i++)
   { pbuf[i]=IIC_Read_Byte();
     IIC_Ack();

   }
  pbuf[i]=IIC_Read_Byte(); //读取最后一个字节,即第length个字节 
  IIC_NAck();  //读取最后一个字节后,要向PCF8563提NACK,告诉其读取操作结束,不再向下读了 
  IIC_Stop();
  return 0;

}    


/* 功能描述:将BCD码装换为十进制的数值
   隶属模块:PCF8563驱动模块
   函数属性:内部
   参数说明:x:待转换的BCD码字节
   返回说明:转换后的值
   注:将BCD格式数据转换为十进制的值,如29的BCD格式为0x29   */

unsigned char BCD2Val(unsigned char x)
{
 return (x>>4)*10+(x&0x0f);//高四位乘以10,再加上低四位
}


/*功能描述:将十进制数值转换为BCD码
   隶属模块:PCF8563驱动模块*/
  // 函数属性:内部
 //  参数说明:x:待转换的数值
  // 转换说明:转换后的值
  // 注: 将值转为BCD格式,如23转为BCD格式为0x23 */

 unsigned char Val2BCD(unsigned char x)
{
  return (x/10)*16+(x%10); //将十进制的数值十位乘以16,再 
}





/* 功能描述:读取时间
   隶属模块:PCF8563驱动模块
   函数属性:外部,供用户使用
   参数说明:无
   返回说明:操作结果,0表示成功,1表示失败
   注:从PCF8563中读到的时间值,被装载到全局的外部结构体 */
unsigned char P8563_Read_Time()
{
 unsigned char temp[7];
 if(!PCF8563_Read_Bytes(0x02,7,temp))   //读取时间,即读取秒 分 时 日 星期 月 年
 {  //以下对读取到temp的数组中的时间数据进行截取
    // 并转换为十进制数值写入到temp中去
  time.second=BCD2Val(temp[0]&0x7f);  //秒
  time.minute=BCD2Val(temp[1]&0x7f);
  time.hour  =BCD2Val(temp[2]&0x3f);
  time.day   =BCD2Val(temp[3]&0x3f);
  time.week  =BCD2Val(temp[4]&0x07);
  time.month =BCD2Val(temp[5]&0x1f);
  time.year  =BCD2Val(temp[6]);
  return 0;

 } 
 else 
 return 1;

}







/*功能描述:设置时间
  隶属模块:PCF8563驱动模块
  函数属性:外部,供用户使用
  参数说明:无
  返回说明:操作结果,0表示成功,1表示失败
  注:在设置时间前先将时间数据填充到time中去,随后调用此函数,时间
      数据即被写入到PCF8563中,并以新设置的时间继续走时 */

unsigned char P8563_Set_Time()
{
  unsigned char temp[7];
  unsigned char i;
  for(i=0;i<7;i++)
  {
  temp[i]=Val2BCD(((unsigned char *)(&time))[i]);
  }

return PCF8563_Write_Bytes(0x02,7,temp);

}

/* 功能描述:设置倒计时寄存器
   隶属模块:PCF8563驱动模块
   返回说明:0表示成功,1表示失败
   注:先将要写入到倒计时寄存器的数据装入全局变量外部结构体变量dcounter中
       随后调用此函数将数据写入 */
 unsigned char P8563_Set_DownCounter()
{
 return PCF8563_Write_Bytes(0x0e,2,(unsigned char *)&dcounter);

}

/* 功能描述:读取倒计时寄存器
   隶属模块:PCF8563驱动模块
   返回说明:操作结果,0表示成功,1表示失败
   注:将倒计时寄存器的值读回到dcounter中 */
unsigned char P8563_Read_DownCounter()
{
 return PCF8563_Read_Bytes(0x0e,2,(unsigned char *)&dcounter);

}

⌨️ 快捷键说明

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