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

📄 eeprom.lst

📁 MCS51 C语言操作AT24Cxx的函数。采用头文件加c文件的形式。可对AT24Cxx系列的EEPROM进行单字节和多字节的读写操作。可作底层库函数使用。在EEPROM.c文件修改编译设置
💻 LST
字号:
C51 COMPILER V7.50   EEPROM                                                                05/26/2009 15:22:14 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN eeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE eeprom.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*************************************************************************
   2          File Name:      eeprom.c
   3          Description:    AT24cXX
   4          By:     Jemmydeng
   5          Date:   2008-06-xx
   6          *************************************************************************/
   7          #include <reg51.h>
   8          #include <intrins.h>
   9          
  10          #include <delay.h>
  11          #include <eeprom.h>
  12          
  13          
  14          #define uchar unsigned char
  15          #define uint  unsigned int
  16          
  17          //#define _PAGES_       1                       //单字节地址,多页时定义此项(for 24c04,24c08,24c16)
  18          
  19          //#define _16_BITS_ADDRESS_     1       //双字节地址时定义此项(for 24c32,24c64)
  20          //=======================================================================
  21          sbit SCL=P0^4;
  22          sbit SDA=P0^5;
  23          
  24          bit ack_state=0;
  25          //=======================================================================
  26          
  27          void ST_EEPROM(void)
  28          {
  29   1          SDA=1;
  30   1          SCL=1;
  31   1          delay_us(10);
  32   1          SDA=0;
  33   1          delay_us(10);
  34   1          SCL=0;
  35   1          delay_us(10);
  36   1      }
  37          
  38          //------------------------------------
  39          void END_EEPROM(void)
  40          {
  41   1          SDA=0;
  42   1          SCL=0;
  43   1          delay_us(10);
  44   1          SCL=1;
  45   1          delay_us(10);
  46   1          SDA=1;
  47   1          delay_us(10);
  48   1      }
  49          
  50          //------------------------------------
  51          void write(unsigned char byte)
  52          {
  53   1          unsigned char i,j;
  54   1          
  55   1          for(i=0;i<8;i++)
C51 COMPILER V7.50   EEPROM                                                                05/26/2009 15:22:14 PAGE 2   

  56   1          {
  57   2              j = (0x80>>i);
  58   2              j = j&byte;
  59   2              if(j)
  60   2              {
  61   3                  SDA=1;
  62   3                  }
  63   2              else
  64   2              {
  65   3                  SDA=0;
  66   3              }
  67   2              
  68   2              delay_us(10);
  69   2      
  70   2              SCL=1;
  71   2              delay_us(10);
  72   2              SCL=0;
  73   2              delay_us(10);
  74   2          }
  75   1      }
  76          
  77          //------------------------------------
  78          unsigned char read(void)
  79          {
  80   1          bit data1=0;
  81   1          unsigned char a=0,i;
  82   1          
  83   1          for(i=0;i<8;i++)
  84   1          {
  85   2              SDA=1;
  86   2              SCL=1;
  87   2              delay_us(10);
  88   2              data1=SDA;
  89   2              delay_us(10);
  90   2              SCL=0;
  91   2              delay_us(10);
  92   2              a=a<<1;
  93   2              if(data1)
  94   2              {
  95   3                  a+=1;
  96   3              }
  97   2          }
  98   1          
  99   1          return a;
 100   1      }
 101          
 102          //-------------------------------------
 103          bit TEST_ACK(void)
 104          {
 105   1           bit ack1;
 106   1           SDA=1;
 107   1           SCL=1;
 108   1           delay_us(10);
 109   1           ack1=SDA;
 110   1           delay_us(10);
 111   1           SCL=0;
 112   1           delay_us(10);
 113   1           return ack1;
 114   1      }
 115          
 116          //----------------------
 117          void ACK(void)
C51 COMPILER V7.50   EEPROM                                                                05/26/2009 15:22:14 PAGE 3   

 118          {
 119   1              SDA=0;
 120   1              SCL=1;
 121   1              delay_us(10);
 122   1              SCL=0;
 123   1              SDA=1;
 124   1      }
 125          
 126          //---------------------
 127          void NOT_ACK(void)
 128          {
 129   1              SDA=1; 
 130   1              SCL=1;
 131   1              delay_us(10);
 132   1              SCL=0;
 133   1      }
 134          
 135          //===============================================================
 136          //  写EEPROM单字节程序,参数1为高地址,参数2为低地址,参数3为要写的数据
 137          //  器件地址引脚固定接地(0xa0)
 138          //------------------------------------------------------------
 139          
 140          void WR_BYTE(unsigned char page,uchar address_h,uchar address_l,uchar data1)
 141          {
 142   1          unsigned char device_addr;
 143   1          
 144   1          #ifdef _PAGES_
                  page = (page<<1);
                  device_addr = (0xa0|page);  //器件地址引脚固定接地
                  #else
 148   1          device_addr = 0xa0;
 149   1          #endif
 150   1          
 151   1          ST_EEPROM();               //启动开始
 152   1          write(device_addr);        //写器件地址10100000
 153   1          ack_state = TEST_ACK();
 154   1          
 155   1          #ifdef _16_BITS_ADDRESS_
                  write(address_h);          //写高地址
                  ack_state=TEST_ACK();
                  #endif
 159   1          
 160   1          write(address_l);          //写低地址
 161   1          ack_state=TEST_ACK();
 162   1          write(data1);              //写数据
 163   1          ack_state=TEST_ACK();
 164   1          END_EEPROM();              //结束
 165   1              delay_us(300);
 166   1      }
*** WARNING C280 IN LINE 140 OF EEPROM.C: 'page': unreferenced local variable
*** WARNING C280 IN LINE 140 OF EEPROM.C: 'address_h': unreferenced local variable
 167          
 168          //-----------------------------------------------------
 169          //  读EEPROM单字节程序,参数1为高地址,参数2为低地址
 170          //----------------------------------------------------
 171          uchar RD_BYTE(unsigned char page, uchar address_h,uchar address_l)
 172          {
 173   1              unsigned char rd_data=0;
 174   1              unsigned char device_addr;
 175   1          
 176   1              #ifdef _PAGES_
                      page = (page<<1);
C51 COMPILER V7.50   EEPROM                                                                05/26/2009 15:22:14 PAGE 4   

                      device_addr = (0xa0|page);      //器件地址引脚固定接地
                      #else
 180   1              device_addr = 0xa0;
 181   1              #endif
 182   1          
 183   1              ST_EEPROM();               //启动
 184   1              write(device_addr);               //写器件地址
 185   1              ack_state=TEST_ACK();
 186   1              
 187   1              #ifdef _16_BITS_ADDRESS_
                      write(address_h); 
                      ack_state=TEST_ACK();
                      #endif
 191   1              
 192   1              write(address_l);
 193   1              ack_state=TEST_ACK();
 194   1              ST_EEPROM();               //再次启动
 195   1              write(device_addr|1);               //读器件地址10100001
 196   1              ack_state=TEST_ACK();
 197   1              rd_data=read();            //读数据
 198   1              NOT_ACK();                 //无应答信号
 199   1              END_EEPROM();
 200   1              delay_us(300);
 201   1              
 202   1              return rd_data;
 203   1      }
*** WARNING C280 IN LINE 171 OF EEPROM.C: 'page': unreferenced local variable
*** WARNING C280 IN LINE 171 OF EEPROM.C: 'address_h': unreferenced local variable
 204          
 205          //===============================================================================
 206          //连续写EEPROM多个字节子程序,参数1为要写首地址的高字节,参数2为要写首地址的低字节,
 207          //参数3为要写的字节数,参数4为要写字节的首地址
 208          //-------------------------------------------------------------------------------
 209          
 210          void WR_BYTES(unsigned char page,uchar init_address_h,uchar init_address_l,uchar number,uchar *data1)
 211          {
 212   1          unsigned char i;
 213   1          unsigned char device_addr;
 214   1          
 215   1          #ifdef _PAGES_
                  page = (page<<1);
                  device_addr = (0xa0|page);  //器件地址引脚固定接地
                  #else
 219   1          device_addr = 0xa0;
 220   1          #endif
 221   1          
 222   1          ST_EEPROM();
 223   1              write(device_addr);
 224   1              ack_state=TEST_ACK();
 225   1              
 226   1              #ifdef _16_BITS_ADDRESS_
                      write(init_address_h);
                      ack_state=TEST_ACK();
                      #endif
 230   1              
 231   1              write(init_address_l);
 232   1              ack_state=TEST_ACK();
 233   1              
 234   1              for(i=0;i<number;i++)
 235   1              {
 236   2                      write(data1[i]);
 237   2                      if(TEST_ACK())
C51 COMPILER V7.50   EEPROM                                                                05/26/2009 15:22:14 PAGE 5   

 238   2                          ;
 239   2              }
 240   1              END_EEPROM();
 241   1              delay_us(300);
 242   1      }
*** WARNING C280 IN LINE 210 OF EEPROM.C: 'page': unreferenced local variable
*** WARNING C280 IN LINE 210 OF EEPROM.C: 'init_address_h': unreferenced local variable
 243          
 244          //===============================================================================
 245          //连续读EEPROM多个字节子程序,参数1为要读首地址的高字节,参数2为要读写首地址的低字节,
 246          //参数3为要读的字节数,参数4为要读字节的首地址
 247          //-------------------------------------------------------------------------------
 248          void RD_BYTES(unsigned char page,uchar init_address_h,uchar init_address_l,uchar number,uchar *data1)
 249          {
 250   1          unsigned char i;
 251   1          unsigned char device_addr;
 252   1          
 253   1          #ifdef _PAGES_
                  page = (page<<1);
                  device_addr = (0xa0|page);  //器件地址引脚固定接地
                  #else
 257   1          device_addr = 0xa0;
 258   1          #endif
 259   1          
 260   1          ST_EEPROM();
 261   1              write(device_addr);
 262   1              ack_state=TEST_ACK();
 263   1              
 264   1              #ifdef _16_BITS_ADDRESS_
                      write(init_address_h);
                      ack_state=TEST_ACK();
                      #endif
 268   1              
 269   1              write(init_address_l);
 270   1              ack_state=TEST_ACK();
 271   1              ST_EEPROM();
 272   1              write(device_addr|1);
 273   1              ack_state=TEST_ACK();
 274   1              
 275   1              for(i=0;i<number-1;i++)
 276   1              {
 277   2                      *data1=read();
 278   2                      ACK();
 279   2                      data1++;
 280   2              }
 281   1              
 282   1              *data1 = read();
 283   1              NOT_ACK();
 284   1              
 285   1              END_EEPROM();
 286   1              delay_us(300);
 287   1      }
*** WARNING C280 IN LINE 248 OF EEPROM.C: 'page': unreferenced local variable
*** WARNING C280 IN LINE 248 OF EEPROM.C: 'init_address_h': unreferenced local variable
 288          
 289          
 290          
 291          //---------
 292          


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V7.50   EEPROM                                                                05/26/2009 15:22:14 PAGE 6   

   CODE SIZE        =    506    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      32
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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