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

📄 24c64.lst

📁 主要有基于51的I2c读写24c64的测试程序
💻 LST
字号:
C51 COMPILER V7.06   24C64                                                                 11/10/2008 22:12:04 PAGE 1   


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

stmt level    source

   1          
   2          #define _24c64_c_
   3          #include "24c64.h"
   4          
   5          /*
   6          ********************************************************************
   7          ** 函数名:5ms延时函数
   8          ** 注意  : 
   9          ** 说明  :
  10          **         
  11          ********************************************************************
  12          */
  13          void delay_5ms( void )
  14          {
  15   1              uchar i;
  16   1              uchar j;
  17   1              uchar t;
  18   1              for( t = 0; t < 10; t++ ) 
  19   1              {
  20   2                      for( j = 0; j < 15; j ++ )
  21   2                      {
  22   3                              for( i = 0; i < 21; i++ )
  23   3                                      {;}
  24   3                      }       
  25   2              }
  26   1      }
  27          
  28          /*
  29          ********************************************************************
  30          ** 函数名:i2c启动
  31          ** 注意  :
  32          ** 说明  :
  33          ********************************************************************
  34          */
  35          void I2cStart( void )
  36          {
  37   1          //scl=1时
  38   1          //sda由1-->0
  39   1          SDA = 1;           //准备下降沿
  40   1          SCL = 1;
  41   1          NOP_5;
  42   1          SDA = 0;
  43   1          NOP_5;
  44   1      
  45   1          SCL = 0;  //一定要
  46   1         //SDA = 0;
  47   1      }
  48          
  49          /*
  50          ********************************************************************
  51          ** 函数名:i2c停止
  52          ** 注意  :
  53          ** 说明  :
  54          ********************************************************************
  55          */
C51 COMPILER V7.06   24C64                                                                 11/10/2008 22:12:04 PAGE 2   

  56          void I2cStop( void )
  57          {
  58   1          //scl=1时
  59   1          //sda由0-->1
  60   1          SDA = 0;         //准备上升沿
  61   1          SCL = 1;
  62   1          NOP_5;
  63   1          SDA = 1;
  64   1          NOP_5;
  65   1      
  66   1          //SCL = 0;  //本来书上说要此句,但发觉加入后仿真不正确...
  67   1          //SDA = 0;
  68   1      }
  69          
  70          /*
  71          ********************************************************************
  72          ** 函数名:查询应答信号
  73          ** 注意  :
  74          ** 说明  :如果有应答返回 1
  75          ********************************************************************
  76          */
  77          uchar WaitAsk( void )
  78          {
  79   1          uchar askflag = 0;
  80   1      
  81   1          SDA = 1;                    //SDA置为输入
  82   1      
  83   1          SCL = 1;
  84   1          NOP_5;                      //5us后检测
  85   1      
  86   1          if( SDA == 0 )     //检测sda线
  87   1              askflag = 1;   //有应答返回 1 表示成功
  88   1      
  89   1          SCL = 0;
  90   1      
  91   1          return askflag;
  92   1      }
  93          
  94          /*
  95          ********************************************************************
  96          ** 函数名:发送应答信号
  97          ** 注意  :
  98          ** 说明  :SCL = 1 , SDA = 0;
  99          ********************************************************************
 100          */
 101          void SendAsk( void )
 102          {
 103   1          SDA = 0;
 104   1      
 105   1          SCL = 1;
 106   1          NOP_5;
 107   1          SCL = 0;  //在scl为高时,sda为0
 108   1      
 109   1          SDA = 1;
 110   1      }
 111          
 112          /*
 113          ********************************************************************
 114          ** 函数名:发送非应答信号
 115          ** 注意  :
 116          ** 说明  :SCL = 1 , SDA = 1
 117          ********************************************************************
C51 COMPILER V7.06   24C64                                                                 11/10/2008 22:12:04 PAGE 3   

 118          */
 119          void SendNoAsk( void )
 120          {
 121   1          SDA = 1;
 122   1      
 123   1          SCL = 1;
 124   1          NOP_5;
 125   1          SCL = 0;   //在scl为高时, sda为1
 126   1      
 127   1          SDA = 0;
 128   1      }
 129          
 130          /*
 131          ********************************************************************
 132          ** 函数名  :写一个字节数据
 133          ** 入口参数: 字节数据wbyte
 134          ** 注意    :
 135          ** 说明    :可以用来写地址字节,也可以用来写数据字节
 136          ********************************************************************
 137          */
 138          void I2cWriteByte( uchar wbyte )
 139          {
 140   1          uchar i;
 141   1          for(i = 0; i < 8; i++ )
 142   1          {
 143   2              if( ( wbyte & 0x80 ) == 0x80 )   //!!!!  先发送高位,再发送低位.., 在数据传输时一定要注意此处细节
 144   2                  SDA = 1;
 145   2              else
 146   2                  SDA = 0;  //因为数据传输时要保持数据稳定, 因此要先准备好SDA上的数据才能进行SCL的变化
 147   2      
 148   2              SCL = 1;
 149   2              NOP_5;
 150   2              SCL = 0;
 151   2      
 152   2              wbyte = wbyte << 1;
 153   2          }
 154   1      }
 155          
 156          /*
 157          ********************************************************************
 158          ** 函数名  :写一个字节数据到某器件某地址
 159          ** 入口参数: 器件地址DeviceAddress  字节地址ByteAddress    要写的字节数据Wdata
 160          ** 注意    :里面加有5ms延时。
 161          ** 说明    :I2cWriteDataToAddr( 0xa0, 0x08, 'a' );
 162          ********************************************************************
 163          */
 164          void I2cWriteDataToAddr( uchar DeviceAddress, uint ByteAddress, uchar Wdata )
 165          {
 166   1          I2cStart();
 167   1          I2cWriteByte( DeviceAddress );
 168   1          WaitAsk();    //等待应答
 169   1          I2cWriteByte( ByteAddress >> 8 );  //高8位
 170   1          WaitAsk();
 171   1          I2cWriteByte( ByteAddress );       //低8位
 172   1          WaitAsk();
 173   1          I2cWriteByte( Wdata );
 174   1          WaitAsk();
 175   1          I2cStop();
 176   1      
 177   1              delay_5ms();   //发觉这里要加一小段延时,如果不加,则可以在外面加。
 178   1      }
 179          
C51 COMPILER V7.06   24C64                                                                 11/10/2008 22:12:04 PAGE 4   

 180          /*
 181          ********************************************************************
 182          ** 函数名  :读一个字节数据
 183          ** 入口参数: 无
 184          ** 注意    :
 185          ** 说明    :
 186          ********************************************************************
 187          */
 188          uchar I2cReadByte( void )
 189          {
 190   1          uchar rbyte = 0;
 191   1              uchar i = 0;
 192   1          for(i = 0; i < 8; i++ )
 193   1          {
 194   2                      rbyte = rbyte << 1;        //非常注意...此语句不放在循环体内最后.
 195   2      
 196   2              SDA = 1;   //SDA为输入
 197   2      
 198   2              SCL = 1;
 199   2              NOP_5;
 200   2      
 201   2              if( SDA == 1 )
 202   2                  rbyte = rbyte | 0x01;
 203   2      
 204   2              SCL = 0;
 205   2          }
 206   1      
 207   1              return rbyte;
 208   1      }
 209          
 210          
 211          /*
 212          ********************************************************************
 213          ** 函数名  :写一个字节数据到某器件某地址
 214          ** 入口参数: 器件地址DeviceAddress  字节地址ByteAddress
 215          ** 出口参数: 读到的字节数据rdata
 216          ** 注意    :
 217          ** 说明    :I2cWriteDataToAddr( 0xa0, 0x08, 'a' );
 218          ********************************************************************
 219          */
 220          uchar I2cReadDataFromAddr( uchar DeviceAddress, uint ByteAddress )
 221          {
 222   1              uchar rdata;
 223   1      
 224   1          I2cStart();
 225   1          I2cWriteByte( DeviceAddress );
 226   1          WaitAsk();    //等待应答
 227   1          I2cWriteByte( ByteAddress >> 8 );  //高8位
 228   1          WaitAsk();
 229   1          I2cWriteByte( ByteAddress );        //低8位
 230   1          WaitAsk();
 231   1      
 232   1          I2cStart();
 233   1          I2cWriteByte( DeviceAddress | 0x01 ); //读
 234   1              WaitAsk();
 235   1              rdata = I2cReadByte();
 236   1          SendNoAsk();    //不发送应答信号
 237   1          I2cStop();
 238   1      
 239   1          return rdata;
 240   1      }
 241          
C51 COMPILER V7.06   24C64                                                                 11/10/2008 22:12:04 PAGE 5   

 242          /*
 243          ********************************************************************
 244          ** 函数名  :连续写字节数据到某器件某地址之后的好几个单元
 245          ** 入口参数: 器件地址DeviceAddress  字节地址ByteAddress    要写的字节数据取址*Wdata  字节数据的个数n
 246          ** 注意    :里面加有5ms延时。
 247          ** 说明    :I2cWriteDataToAddr( 0xa0, 0x08, "hebei is a big pig!", 20 );
 248          ********************************************************************
 249          */
 250          void I2c_Write_n( uchar DeviceAddress, uint ByteAddress, uchar *Wdata, uchar n )
 251          {
 252   1          uchar i = 0;
 253   1          I2cStart();
 254   1          I2cWriteByte( DeviceAddress );
 255   1          WaitAsk();    //等待应答
 256   1          I2cWriteByte( ByteAddress >> 8 );  //高8位
 257   1          WaitAsk();
 258   1          I2cWriteByte( ByteAddress );       //低8位
 259   1          WaitAsk();
 260   1      
 261   1          for( i = 0; i < n; i++ )
 262   1          {
 263   2              I2cWriteByte( *Wdata );
 264   2              WaitAsk();
 265   2              Wdata++;
 266   2          }
 267   1          
 268   1          I2cStop();
 269   1      
 270   1              delay_5ms();   //发觉这里要加一小段延时,如果不加,则可以在外面加。
 271   1      }
 272          
 273          /*
 274          ********************************************************************
 275          ** 函数名  :写一个字节数据到某器件某地址
 276          ** 入口参数: 器件地址DeviceAddress  字节地址ByteAddress
 277          ** 出口参数: 读到的字节数据rdata
 278          ** 注意    :
 279          ** 说明    :I2c_Read_n( 0xa0, 0x0003, a, 10 )   //uchar a[10];
 280          ********************************************************************
 281          */
 282          void I2c_Read_n( uchar DeviceAddress, uint ByteAddress, uchar *rdatabuf, uchar n )
 283          {
 284   1              uchar i = 0;
 285   1      
 286   1          I2cStart();                        //启动总线
 287   1          I2cWriteByte( DeviceAddress );
 288   1          WaitAsk();    //等待应答
 289   1          I2cWriteByte( ByteAddress >> 8 );  //高8位
 290   1          WaitAsk();
 291   1          I2cWriteByte( ByteAddress );       //低8位
 292   1          WaitAsk();
 293   1      
 294   1          I2cStart();                                                 //重新启动
 295   1          I2cWriteByte( DeviceAddress | 0x01 ); //读
 296   1              WaitAsk();
 297   1              
 298   1          for( i = 0; i < n; i++ )
 299   1              {
 300   2                 *rdatabuf = I2cReadByte();
 301   2             SendAsk();             //连续发送应答信号
 302   2             rdatabuf++;
 303   2          }
C51 COMPILER V7.06   24C64                                                                 11/10/2008 22:12:04 PAGE 6   

 304   1      
 305   1          I2cStop();
 306   1      }
 307          
 308          
 309          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    370    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      14
   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 + -