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

📄 pcf8563.lst

📁 stc15单片机测试程序V1.0版
💻 LST
📖 第 1 页 / 共 2 页
字号:
 133   2                      scl=0;
 134   2                      delay_();       
 135   2              }
 136   1              return rbyte;          //读到的字节
 137   1      }
 138          
 139          /*----------------------------------------------------------------------------& 
 140                                                         pcf8563
 141          ----------------------------------------------------------------------------&&*/
 142          struct Time             //时间结构体,包括了秒,分,时,日,周,月,年
 143          {
 144           uchar second;
 145           uchar minute;
 146           uchar hour;
 147           uchar day;
 148           uchar week;
 149           uchar month;
 150           uchar year;
 151          };
 152          struct Time time;         //用来装时间数据
 153          /******************************************************************************* 
 154          功能描述:向地址addr的寄存器写入多个字节
 155          参数说明:addr:寄存器地址 
 156                    length:要写入的字节数
 157                            pbuf:指向数据缓冲区的指针
 158          返回说明:操作结果,0表示成功,1表示失败 
 159          *******************************************************************************/
 160          uchar pcfwrite(uchar addr,uchar length,uchar *pbuf )
 161          {
 162   1              uchar i=0;
 163   1              start();
 164   1              if(writebyte(0xa2)) return 1;       /*写pcf8563的ID与读控制位,通信有错误返回
 165   1              IIC写入一个字节以后,将会读取从机上的应答,如果为0说明写入成功,如果为1则写入失败,
 166   1              这里判断写入字节后的返回值,为1则返回1,即(这个函数运行失败),否则继续向下运行*/
 167   1              if(writebyte(addr)) return 1;       //写寄存器地址
 168   1              for(i=0;i<length;i++)               //写入length个字节
 169   1              {
 170   2                      if(writebyte(pbuf[i])) return 1;//写数据 
 171   2              }
 172   1              stop();
 173   1              return 0;
 174   1      }
 175          /*******************************************************************************
 176          功能描述:从地址addr的寄存器读取多个字节
 177          参数说明:addr:寄存器地址
 178                    length:要读出的字节数
 179                            pbuf:指向数据缓冲区的指针
C51 COMPILER V9.01   PCF8563                                                               07/28/2012 10:12:55 PAGE 4   

 180          返回说明:操作结果,0表示成功,1表示失败 
 181          *******************************************************************************/
 182          uchar pcfread(uchar addr,uchar length,uchar *pbuf)
 183          {
 184   1              uchar i=0;
 185   1              start();//通信开始
 186   1              if(writebyte(0xa2)) return 1;//写PCF8563的ID与读(写)控制位,通信有错误返回
 187   1              if(writebyte(addr)) return 1;//写寄存器地址
 188   1      
 189   1              start();//通信开始
 190   1              if(writebyte(0xa3)) return 1;//写PCF8563的ID与(读)写控制位,通信有错误返回
 191   1              for(i=0;i<length-1;i++)      //写入前length-1个字节,并作出应答
 192   1              {
 193   2                      pbuf[i]=readbyte();
 194   2                      ack();                   //每读取一个字节,主机应答
 195   2              }
 196   1              pbuf[i]=readbyte();    //写入最后一个字节且不应答
 197   1              nack();
 198   1              stop();
 199   1              return 0;
 200   1      }
 201          /******************************************************************************* 
 202          功能描述:将BCD码转换为十进制的数值
 203          参数说明:x:待转换的BCD码字节
 204          返回说明:转换后的值
 205          注:将BCD格式数据转为实际的值,如29的BCD格式为0x29,实 
 206          *******************************************************************************/
 207          uchar bcdval(uchar x)
 208          {return (x>>4)*10+(x&0x0f);//bcd码转为十进制
 209   1      }                                               //高四位乘以十加上低四位
 210          /******************************************************************************* 
 211          功能描述:将十进制的数值转换为BCD码
 212          参数说明:x:待转换的BCD码字节
 213          返回说明:转换后的值
 214          注:将BCD格式数据转为实际的值,如29的BCD格式为0x29,实 
 215          *******************************************************************************/
 216          uchar valbcd(uchar x)    //十进制数转为BCD码
 217          {return (x/10)*16+(x%10);//十位乘以16加上个位
 218   1      }
 219          /*******************************************************************************
 220          功能描述:读取时间
 221          返回结果:操作结果,0表示成功,1表示失败 
 222          注:从PCF8563中读到的时间值,被装载到全局的外部结构体 
 223          *******************************************************************************/ 
 224          uchar readtime()
 225          {
 226   1              uchar temp[7];//用于装载读回来的秒-年的7个字节的数据
 227   1              if(!pcfread(0x02,7,temp))/*读取时间;时间寄存器的地址是02,
 228   1                                        从02这个地址中读取7个字节放到temp中*/
 229   1              {   
 230   2                      //以下对读取到temp数组中的时间数据进行截取
 231   2                      //并转换为十进制写入到time中去 
 232   2                      time.second=bcdval(temp[0]&0x7f);//秒,通过与操作屏蔽多余的位
 233   2                      time.minute=bcdval(temp[1]&0x7f);//分,获取真正的时间
 234   2                      time.hour  =bcdval(temp[2]&0x3f);//时,bcd--是将bad编码转换成十进制数的函数 
 235   2                      time.day   =bcdval(temp[3]&0x3f);//日 
 236   2                      time.week  =bcdval(temp[4]&0x07);//星期 
 237   2                      time.month =bcdval(temp[5]&0x1f);//月 
 238   2                      time.year  =bcdval(temp[6]     );//年 
 239   2                      return 0;//返回0,运行成功
 240   2              }
 241   1          else return 1;
C51 COMPILER V9.01   PCF8563                                                               07/28/2012 10:12:55 PAGE 5   

 242   1      }
 243          /******************************************************************************* 
 244          功能描述:设置时间
 245          返回结果:操作结果,0表示成功,1表示失败
 246          注:在设置时间前先将事间数据填充到time中去,随后调用此函数,时间 
 247              数据即被写入到PCF8563中,并以新设置的时间继续走时 
 248          *******************************************************************************/ 
 249          uchar settime()
 250          {
 251   1              uchar i,temp[7];
 252   1              for(i=0;i<7;i++)
 253   1              {
 254   2                      temp[i]=valbcd(((uchar *)(&time))[i]);//将time中的十进制时间数据转换为BCD
 255   2              }                                                                                 //转换后装到temp[7]临时数组中
 256   1              return pcfwrite(0x02,7,temp);//将temp数组的数据写入到时间寄存器中 
 257   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    540    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7      26
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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