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

📄 pcf8563.lst

📁 单片机测试=====================================时钟芯片测试
💻 LST
字号:
C51 COMPILER V7.06   PCF8563                                                               01/02/2008 09:54:09 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE PCF8563
OBJECT MODULE PLACED IN PCF8563.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PCF8563.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg52.h>
   2          #include <stdio.h>
   3          #include <absacc.h>
   4          #include <intrins.h>
   5          
   6          typedef unsigned char uchar;
   7          
   8          uchar g8563_Store[4]; /*时间交换区,全局变量声明*/
   9          uchar code c8563_Store[4]={0x50,0x59,0x07,0x01}; /*写入时间初值:星期一 07:59:40*/
  10          
  11          sbit CS=P1^4;
  12          sbit CLK=P1^7;
  13          sbit DIO=P1^6;
  14          sbit KEY=P3^2;
  15          
  16          sbit SDA=P1^1;    // pcf8563时钟
  17          sbit SCL=P1^0;    // pcf8563时钟
  18          
  19          bdata uchar com_data;
  20          sbit mos_bit=com_data^7;
  21          sbit low_bit=com_data^0;
  22          
  23          void delay_50us()
  24          {   
  25   1              uchar i;
  26   1              for (i=0; i<6; i++){;}
  27   1      }
  28          
  29          void delay_8us()
  30          {
  31   1              uchar i;
  32   1              for (i=0; i<1; i++){;}
  33   1      }
  34          void delay_50ms()
  35          {
  36   1              uchar i,j;
  37   1              for(j=0;j<50;j++)
  38   1                      for(i=0;i<125;i++){;}
  39   1      }
  40          void send(uchar sebuf)
  41          {
  42   1              uchar i;
  43   1              com_data=sebuf;
  44   1              CLK=0;
  45   1              CS=0;
  46   1              delay_50us();
  47   1              for(i=0;i<8;i++)
  48   1              {
  49   2                      delay_8us();
  50   2                      DIO=mos_bit;
  51   2                      CLK=1;
  52   2                      delay_8us();
  53   2                      com_data=com_data<<1;
  54   2                      CLK=0;
  55   2              }
C51 COMPILER V7.06   PCF8563                                                               01/02/2008 09:54:09 PAGE 2   

  56   1              DIO=0;
  57   1      }
  58          uchar receive(void)
  59          {
  60   1              uchar i,rebuf;
  61   1              CLK=1;
  62   1              delay_50us();
  63   1              for(i=0;i<8;i++)
  64   1              {
  65   2                      com_data=com_data<<1;
  66   2                      low_bit=DIO;
  67   2                      CLK=1;
  68   2                      delay_8us();
  69   2                      CLK=0;
  70   2                      delay_8us();
  71   2              }
  72   1              rebuf=com_data;
  73   1              DIO =1;
  74   1              CS=1;
  75   1              return rebuf;
  76   1      }
  77          void reset(void)
  78          {
  79   1              DIO=1;
  80   1              delay_50ms();
  81   1              send(0xa4);
  82   1              CS=1;
  83   1      }
  84          /*  7289显示程序                  */ 
  85          /*  addr为显示位置 范围0~7                */
  86          /*  dat为现实内容                 */
  87          void display(uchar addr,uchar dat)
  88          {
  89   1              if(addr<0 || addr >7)
  90   1                      return;
  91   1              send(0xc8 + addr);
  92   1              delay_50us();
  93   1              send(dat);
  94   1              CS=1;
  95   1      }
  96          /*  发送双字节命令                              */
  97          void sendcommand(uchar addr,uchar dat)
  98          {
  99   1              send(addr);
 100   1              delay_50us();
 101   1              send(dat);
 102   1              CS=1;
 103   1      }          
 104          /********************************************
 105          内部函数,延时1
 106          ********************************************/
 107          void Delay()
 108          {
 109   1              // {P10=1;_nop_();P10=0;}
 110   1              _nop_();
 111   1              _nop_(); /*根据晶振频率制定延时时间*/
 112   1      }
 113          /********************************************
 114          内部函数,I2C开始
 115          ********************************************/
 116          void Start()
 117          {  
C51 COMPILER V7.06   PCF8563                                                               01/02/2008 09:54:09 PAGE 3   

 118   1              EA=0;
 119   1              SDA=1;
 120   1              SCL=1;
 121   1              Delay();
 122   1              SDA=0;
 123   1              Delay();
 124   1              SCL=0;
 125   1      }
 126          /********************************************
 127          内部函数,I2C结束
 128          ********************************************/
 129          void Stop()
 130          {
 131   1              SDA=0;
 132   1              SCL=0;
 133   1              Delay();
 134   1              SCL=1;
 135   1              Delay();
 136   1              SDA=1;
 137   1              Delay();
 138   1              EA=1;
 139   1      }
 140          /********************************************
 141          内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
 142          ********************************************/
 143          void WriteACK(uchar ack)
 144          {
 145   1              SDA=ack;
 146   1              Delay();
 147   1              SCL=1;
 148   1              Delay();
 149   1              SCL=0;
 150   1      }
 151          /********************************************
 152          内部函数,等待ACK
 153          ********************************************/
 154          void WaitACK()
 155          {  
 156   1              uchar errtime=20;
 157   1              SDA=1;
 158   1              Delay(); /*读ACK*/
 159   1              SCL=1;
 160   1              Delay();
 161   1              while(SDA)
 162   1              {  errtime--; }
 163   1              SCL=0;
 164   1              Delay();
 165   1      
 166   1      }
 167          /********************************************
 168          内部函数.输出数据字节
 169          入口:B=数据
 170          ********************************************/
 171          void writebyte(uchar wdata)
 172          {
 173   1         uchar i;
 174   1         for(i=0;i<8;i++)
 175   1         {
 176   2             if(wdata&0x80) SDA=1;
 177   2             else SDA=0;
 178   2             wdata<<=1;
 179   2             SCL=1;
C51 COMPILER V7.06   PCF8563                                                               01/02/2008 09:54:09 PAGE 4   

 180   2             Delay();
 181   2             SCL=0;
 182   2         }
 183   1         WaitACK();     //I2C器件或通讯出错,将会退出I2C通讯
 184   1      }
 185          /********************************************
 186          内部函数.输入数据
 187          出口:B
 188          ********************************************/
 189          uchar Readbyte()
 190          {
 191   1         uchar i,bytedata;
 192   1         SDA=1;
 193   1         for(i=0;i<8;i++)
 194   1         {
 195   2            SCL=1; 
 196   2            bytedata<<=1;
 197   2            bytedata|=SDA;
 198   2            SCL=0;
 199   2            Delay();
 200   2         }
 201   1         return(bytedata);
 202   1      }
 203          /********************************************
 204          输出数据->pcf8563
 205          ********************************************/
 206          void writeData(uchar address,uchar mdata)
 207          {
 208   1              Start();
 209   1              writebyte(0xa2); /*写命令*/
 210   1              writebyte(address); /*写地址*/
 211   1              writebyte(mdata); /*写数据*/
 212   1              Stop();
 213   1      }
 214          /********************************************
 215          输入数据<-pcf8563
 216          ********************************************/
 217          uchar ReadData(uchar address) /*单字节*/
 218          {  
 219   1              uchar rdata;
 220   1              Start();
 221   1              writebyte(0xa2); /*写命令*/
 222   1              writebyte(address); /*写地址*/
 223   1              Start();
 224   1              writebyte(0xa3); /*读命令*/
 225   1              rdata=Readbyte();
 226   1              WriteACK(1);
 227   1              Stop();
 228   1              return(rdata);
 229   1      }
 230          void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
 231          {  
 232   1              uchar i;
 233   1              Start();
 234   1              writebyte(0xa2); /*写命令*/
 235   1              writebyte(address); /*写地址*/
 236   1              Start();
 237   1              writebyte(0xa3); /*读命令*/
 238   1              for(i=0;i<count;i++)
 239   1              {
 240   2                  buff[i]=Readbyte();
 241   2                  if(i<count-1) WriteACK(0);
C51 COMPILER V7.06   PCF8563                                                               01/02/2008 09:54:09 PAGE 5   

 242   2              }
 243   1              WriteACK(1);
 244   1              Stop();
 245   1      }
 246          /********************************************
 247          内部函数,读入时间到内部缓冲区
 248          ********************************************/
 249          void P8563_Read()
 250          {   
 251   1              uchar time[7];
 252   1          ReadData1(0x02,0x07,time);
 253   1          g8563_Store[0]=time[0]&0x7f; /*秒*/
 254   1          g8563_Store[1]=time[1]&0x7f; /*分*/
 255   1          g8563_Store[2]=time[2]&0x3f; /*小时*/
 256   1          g8563_Store[3]=time[4]&0x07; /*星期*/
 257   1      }
 258          /********************************************
 259          读入时间到内部缓冲区----外部调用 
 260          ********************************************/
 261          void P8563_gettime()
 262          {
 263   1          P8563_Read();
 264   1          if(g8563_Store[0]==0)
 265   1                      P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
 266   1      }
 267          /********************************************
 268          写时间修改值
 269          ********************************************/
 270          void P8563_settime()
 271          {
 272   1           uchar i;
 273   1           for(i=2;i<=4;i++) { writeData(i,g8563_Store[i-2]); }
 274   1           writeData(6,g8563_Store[3]);
 275   1      }
 276          /********************************************
 277          P8563的初始化-----外部调用
 278          ********************************************/
 279          void P8563_init()
 280          {
 281   1          uchar i;
 282   1         
 283   1          for(i=0;i<=3;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
 284   1          P8563_settime();
 285   1          writeData(0x0,0x00);
 286   1          writeData(0xa,0x8); /*8:00报警*/
 287   1          writeData(0x1,0x12); /*报警有效*/
 288   1          writeData(0xd,0xf0);
 289   1        
 290   1      }
 291          
 292          main()
 293          {
 294   1              reset();
 295   1              P8563_init();
 296   1              while(1)
 297   1              {
 298   2                      P8563_Read();
 299   2                      display(0,g8563_Store[2] >> 4);
 300   2                      display(1,g8563_Store[2] &  0x0f);
 301   2                      sendcommand(0x82,0x0a);
 302   2                      display(3,g8563_Store[1] >> 4);
 303   2                      display(4,g8563_Store[1] &  0x0f);
C51 COMPILER V7.06   PCF8563                                                               01/02/2008 09:54:09 PAGE 6   

 304   2                      sendcommand(0x85,0x0a);
 305   2                      display(6,g8563_Store[0] >> 4);
 306   2                      display(7,g8563_Store[0] &  0x0f);
 307   2              }
 308   1      }   
 309          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    612    ----
   CONSTANT SIZE    =      4    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5      10
   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 + -