pcf8563c.lst

来自「单片机C语言教程」· LST 代码 · 共 243 行

LST
243
字号
C51 COMPILER V8.02   PCF8563C                                                              08/10/2007 21:32:41 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE PCF8563C
OBJECT MODULE PLACED IN PCF8563C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PCF8563C.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************/
   2          /* 这是用C51高级语言编写的pcf8563时钟日历读写程序-没有调用汇编语言,*/
   3          /* 文件名 pcf8563C.C                                                */
   4          /* 功能:本程序主要是读pcf8563的日历时钟值(共7个字节)、置pcf8563  */
   5          /*       的日历时钟值。此外,还有分钟、小时、日和星期报警功能及4种  */
   6          /*       不同频率的方波输出功能。                                   */
   7          /********************************************************************/
   8          #include <reg52.h>
   9          #include <intrins.h>
  10          #define uchar unsigned char
  11          
  12          sbit SDA=P1^0;
  13          sbit SCL=P1^1;
  14          
  15          uchar g8563_Store[7]; /*全局数组变量声明*/
  16          uchar code c8563_Store[7]={0x00,0x59,0x07,0x00,0x15,0x07,0x07}; 
  17          /*写入时间初值:07-07-15,星期日 07:59:00*/
  18          
  19          /********************************************
  20          功能:延时
  21          ********************************************/
  22          void Delay()
  23          {
  24   1          _nop_();
  25   1          _nop_(); /*根据晶振频率确定延时时间*/
  26   1      }
  27          /********************************************
  28          功能:I2C开始
  29          ********************************************/
  30          void Start()
  31          {   
  32   1          SDA=1;
  33   1          SCL=1;
  34   1          Delay();
  35   1          SDA=0;
  36   1          Delay();
  37   1          SCL=0;
  38   1      }
  39          /********************************************
  40          功能:I2C结束
  41          ********************************************/
  42          void Stop()
  43          {
  44   1          SDA=0;
  45   1          SCL=0;
  46   1          Delay();
  47   1          SCL=1;
  48   1          Delay();
  49   1          SDA=1;
  50   1          Delay();
  51   1      }
  52          /*********************************************************
  53          功能:输出ACK,每个字节传输完成,输出ack=0,结束读数据,ack=1;
  54          **********************************************************/
  55          void WriteACK(uchar ack)
C51 COMPILER V8.02   PCF8563C                                                              08/10/2007 21:32:41 PAGE 2   

  56          {
  57   1          SDA=ack;
  58   1          Delay();
  59   1          SCL=1;
  60   1          Delay();
  61   1          SCL=0;
  62   1      }
  63          /********************************************
  64          功能:等待ACK
  65          ********************************************/
  66          void WaitACK()
  67          {   uchar errtime=20;
  68   1          SDA=1;
  69   1          Delay(); /*读ACK*/
  70   1          SCL=1;
  71   1          Delay();
  72   1          while(SDA)
  73   1          {   errtime--;
  74   2             if(!errtime) Stop();
  75   2          }
  76   1          SCL=0;
  77   1          Delay();
  78   1      }
  79          /********************************************
  80          功能:写一个字节,入口:wdata=数据
  81          ********************************************/
  82          void writebyte(uchar wdata)
  83          {
  84   1          uchar i;
  85   1          for(i=0;i<8;i++)
  86   1          {
  87   2              if(wdata&0x80) SDA=1;
  88   2              else SDA=0;
  89   2              wdata<<=1;
  90   2              SCL=1;
  91   2              Delay();
  92   2              SCL=0;
  93   2          }
  94   1          WaitACK();  //I2C器件或通讯出错,将会退出I2C通讯
  95   1      }
  96          /********************************************
  97          功能:读一个字节,出口:bytedata
  98          ********************************************/
  99          uchar Readbyte()
 100          {
 101   1          uchar i,bytedata;
 102   1          SDA=1;
 103   1          for(i=0;i<8;i++)
 104   1          {
 105   2             SCL=1;
 106   2             bytedata<<=1;
 107   2             bytedata|=SDA;
 108   2             SCL=0;
 109   2             Delay();
 110   2          }
 111   1          return(bytedata);
 112   1      }
 113          /********************************************
 114          功能:输出数据->pcf8563
 115          ********************************************/
 116          void writeData(uchar address,uchar mdata)
 117          {
C51 COMPILER V8.02   PCF8563C                                                              08/10/2007 21:32:41 PAGE 3   

 118   1          Start();
 119   1          writebyte(0xa2);    /*写命令*/
 120   1          writebyte(address); /*写地址*/
 121   1          writebyte(mdata);   /*写数据*/
 122   1          Stop();
 123   1      }
 124          /********************************************
 125          功能:输入数据<-pcf8563
 126          ********************************************/
 127          uchar ReadData(uchar address) /*单字节*/
 128          {   uchar rdata;
 129   1          Start();
 130   1          writebyte(0xa2);    /*写命令*/
 131   1          writebyte(address); /*写地址*/
 132   1          Start();
 133   1          writebyte(0xa3);    /*读命令*/
 134   1          rdata=Readbyte();
 135   1          WriteACK(1);
 136   1          Stop();
 137   1          return(rdata);
 138   1      }
 139          /********************************************
 140          功能:输入多个数据<-pcf8563
 141          ********************************************/
 142          void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
 143          {   uchar i;
 144   1          Start();
 145   1          writebyte(0xa2);    /*写命令*/
 146   1          writebyte(address); /*写地址*/
 147   1          Start();
 148   1          writebyte(0xa3);    /*读命令*/
 149   1          for(i=0;i<count;i++)
 150   1          {
 151   2               buff[i]=Readbyte();
 152   2               if(i<count-1) WriteACK(0);
 153   2          }
 154   1          WriteACK(1);
 155   1          Stop();
 156   1      }
 157          /********************************************
 158          功能:读入时间到内部缓冲区
 159          ********************************************/
 160          void P8563_Read()
 161          {    uchar time[7];
 162   1           ReadData1(0x02,0x07,time);
 163   1           g8563_Store[0]=time[0]&0x7f; /*秒*/
 164   1           g8563_Store[1]=time[1]&0x7f; /*分*/
 165   1           g8563_Store[2]=time[2]&0x3f; /*小时*/
 166   1           g8563_Store[3]=time[3]&0x3f; /*日*/
 167   1           g8563_Store[4]=time[4]&0x07; /*星期*/
 168   1           g8563_Store[5]=time[5]&0x1f; /*月*/
 169   1           g8563_Store[6]=time[6]&0xff; /*年*/
 170   1      }
 171          /********************************************
 172          功能:读入时间到内部缓冲区----外部调用
 173          ********************************************/
 174          /*void P8563_gettime()
 175          {
 176               P8563_Read();
 177               if(g8563_Store[0]==0)
 178                 P8563_Read(); //如果秒为0,为防止时间变化,再读一次
 179          }*/
C51 COMPILER V8.02   PCF8563C                                                              08/10/2007 21:32:41 PAGE 4   

 180          /********************************************
 181          功能:写时间修改值
 182          ********************************************/
 183          void P8563_settime()
 184          {
 185   1             uchar i;
 186   1             for(i=2;i<=8;i++) { writeData(i,g8563_Store[i-2]); }
 187   1      }
 188          /********************************************
 189          功能:P8563的初始化
 190          ********************************************/
 191          void P8563_init1()      //P8563的初始化
 192          {
 193   1           uchar i;
 194   1           if((ReadData(0xa)&0x3f)!=0x8) /*检查是否第一次启动,是则初始化时间*/
 195   1           {
 196   2               for(i=0;i<=6;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
 197   2               P8563_settime();
 198   2               writeData(0x0,0x00);
 199   2               writeData(0xa,0x8);  /*8:00报警*/
 200   2               writeData(0x1,0x12); /*报警有效*/
 201   2               writeData(0xd,0xf0);
 202   2           }
 203   1      }
 204          /********************************************
 205          功能:主程序
 206          ********************************************/
 207          main() 
 208          
 209          {
 210   1                    P8563_init1();   //P8563的初始化
 211   1              P8563_Read();    //读出时间
 212   1              while(1);
 213   1      }


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


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

⌨️ 快捷键说明

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