eeprom2.lst

来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 271 行

LST
271
字号
C51 COMPILER V7.20   EEPROM2                                                               06/19/2007 13:41:10 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE EEPROM2
OBJECT MODULE PLACED IN eeprom2.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE eeprom2.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          /***********************************************************************************
   3          此程序包括对24XX系列EEPROM的字节、页读写操作
   4          DataBuff为读写数据输入/输出缓冲区的首址
   5          ByteQuantity 为要读写数据的字节数量
   6          Address 为EEPROM的片内地址
   7          ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
   8          表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
   9          EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;
  10          函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
  11          ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
  12          SDA和SCL由用户自定义,这里暂定义为P0^1和P0^0;
  13          
  14          ***********************************************************************************/
  15          
  16          #pragma ot(5,SIZE)
  17          #include <reg51.h>
  18          #include <intrins.h>
  19          #define ERRORCOUNT 10
  20          sbit SDA=P3^3;
  21          sbit SCL=P3^5;
  22          enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
  23          enum eepromtype EepromType;           /* 器件类型枚举变量取值为0-8 */
  24          
  25          /***********************************************************************************/
  26          bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
  27          unsigned char ControlByte,enum eepromtype EepromType)
  28          {
  29   1        void Delay(unsigned char DelayCount);
  30   1        void IICStart(void);
  31   1        void IICStop(void);
  32   1        bit IICRecAck(void);
  33   1        void IICNoAck(void);
  34   1        void IICAck(void);
  35   1        unsigned char IICReceiveByte(void);
  36   1        void IICSendByte(unsigned char sendbyte);
  37   1        unsigned char data j,i=ERRORCOUNT;
  38   1        bit errorflag=1;                      /* clr errorflag */
  39   1        while(i--)                            /* 启动IIC总线并发送EEPROM从器件地址 */
  40   1         {
  41   2          IICStart();                         /* 启动IIC总线 */
  42   2          IICSendByte(ControlByte&0xfe);      /* 发送EEPROM地址 */
  43   2          if(IICRecAck())                     /* 接收EEPROM应答信号 */
  44   2            continue;                         /* 接收EEPROM应答信号,为1重新启动 */
  45   2          if(EepromType>M2416)                /* EEPROM为24C32以上器件内地址为2字节 */
  46   2            {
  47   3              IICSendByte((unsigned char)(Address>>8));/* 先发送高字节,参考硬件相关说明 */
  48   3              if(IICRecAck())
  49   3                 continue;
  50   3            }
  51   2          IICSendByte((unsigned char)Address);/* 再发送低字节或单字节地址 */
  52   2          if(IICRecAck())
  53   2            continue;
  54   2          if(!(ControlByte&0x01))             /* 以下为写操作 */
  55   2            {
C51 COMPILER V7.20   EEPROM2                                                               06/19/2007 13:41:10 PAGE 2   

  56   3              j=ByteQuantity;                 /* ByteQuantity为写入字节数 */
  57   3              errorflag=0;
  58   3              while(j--)
  59   3                {
  60   4                  IICSendByte(*DataBuff++);   /* DataBuff写操作缓冲区 */
  61   4                  if(!IICRecAck())
  62   4                    continue;
  63   4                  errorflag=1;
  64   4                  break;
  65   4                }
  66   3              if(errorflag==1)
  67   3                continue;
  68   3              break;
  69   3           }
  70   2          else                                /* 以下为读操作 */
  71   2           {
  72   3            IICStart();                       /* 重新启动IIC总线并发送EEPROM从器件地址 */
  73   3            IICSendByte(ControlByte);
  74   3            if(IICRecAck())
  75   3              continue;
  76   3            while(--ByteQuantity)             /* 每次读一字节,共ByteQuantity字节 */
  77   3             {
  78   4               *DataBuff++=IICReceiveByte();  /*读1字节并存入DataBuff为指针的存储单元 */
  79   4               IICAck();                      /* 发送应答信号 */
  80   4             }
  81   3            *DataBuff=IICReceiveByte();       /*read last byte data*/
  82   3            IICNoAck();                       /* 读入最后一字节无须发送应答信号 */
  83   3            errorflag=0;
  84   3            break;
  85   3           }
  86   2          }
  87   1         IICStop();                           /* 停止IIC总线信号 */
  88   1         if(!(ControlByte&0x01))              /* 写入操作需延时,确保足够长写入时间 */
  89   1            {
  90   2             Delay(255);
  91   2             Delay(255);
  92   2             Delay(255);
  93   2             Delay(255);
  94   2            }
  95   1         return(errorflag);
  96   1      }
  97          
  98          /*******************
  99          以下是对IIC操作子程序
 100          *******************/
 101          /*******************
 102                启动IIC
 103          *******************/
 104          void IICStart(void)
 105          {
 106   1      SCL=0;
 107   1      SDA=1;
 108   1      SCL=1;
 109   1      _nop_();
 110   1      _nop_();
 111   1      _nop_();
 112   1      SDA=0;
 113   1      _nop_();
 114   1      _nop_();
 115   1      _nop_();
 116   1      _nop_();
 117   1      SCL=0;
C51 COMPILER V7.20   EEPROM2                                                               06/19/2007 13:41:10 PAGE 3   

 118   1      SDA=1;
 119   1      }
 120          /*****************
 121             停止IIC总线
 122          *****************/
 123          void IICStop(void)
 124          {
 125   1      SCL=0;
 126   1      SDA=0;
 127   1      SCL=1;
 128   1      _nop_();
 129   1      _nop_();
 130   1      _nop_();
 131   1      SDA=1;
 132   1      _nop_();
 133   1      _nop_();
 134   1      _nop_();
 135   1      SCL=0;
 136   1      }
 137          /**************
 138             检查应答位
 139          **************/
 140          bit IICRecAck(void)
 141          {
 142   1      SCL=0;
 143   1      SDA=1;
 144   1      SCL=1;
 145   1      _nop_();
 146   1      _nop_();
 147   1      _nop_();
 148   1      _nop_();
 149   1      CY=SDA;                                 /* 应答位返回值在CY中,0有效 */
 150   1      SCL=0;
 151   1      return(CY);
 152   1      }
 153          /***************
 154          对IIC总线产生应答
 155          ***************/
 156          
 157          void IICAck(void)
 158          {
 159   1      SDA=0;
 160   1      SCL=1;
 161   1      _nop_();
 162   1      _nop_();
 163   1      _nop_();
 164   1      _nop_();
 165   1      SCL=0;
 166   1      _nop_();
 167   1      SDA=1;
 168   1      }
 169          
 170          /*****************
 171          不对IIC总线产生应答
 172          *****************/
 173          void IICNoAck(void)
 174          {
 175   1      SDA=1;
 176   1      SCL=1;
 177   1      _nop_();
 178   1      _nop_();
 179   1      _nop_();
C51 COMPILER V7.20   EEPROM2                                                               06/19/2007 13:41:10 PAGE 4   

 180   1      _nop_();
 181   1      SCL=0;
 182   1      }
 183          
 184          /*******************
 185             向IIC总线写数据
 186          *******************/
 187          void IICSendByte(unsigned char sendbyte)
 188          {
 189   1      unsigned char data j=8;
 190   1      for(;j>0;j--)
 191   1      {
 192   2      SCL=0;
 193   2      sendbyte<<=1;  /* 发送字节变量sendbyte左移1位,CY=sendbyte^7,并回存 */
 194   2      SDA=CY;
 195   2      SCL=1;
 196   2      }
 197   1      SCL=0;
 198   1      }
 199          
 200          /********************
 201          从IIC总线读数据子程序
 202          ********************/
 203          unsigned char IICReceiveByte(void)
 204          {
 205   1      register receivebyte,i=8;
 206   1      SCL=0;
 207   1      while(i--)
 208   1      {
 209   2      SCL=1;
 210   2      receivebyte=(receivebyte<<1)|SDA;
 211   2      SCL=0;
 212   2      }
 213   1      return(receivebyte);
 214   1      }
 215          
 216          /***************
 217              延时程序
 218          ***************/
 219          void Delay(unsigned char DelayCount)
 220          {
 221   1      while(DelayCount--);
 222   1      }
 223          
 224          /****************
 225              应用举例
 226          ****************/
 227          main()
 228          {
 229   1      unsigned char str1[6]="abcdef";
 230   1      unsigned char str2[6]="";
 231   1                                  /* 设置待写入数据 */
 232   1      RW24XX(str1,6,0x0010,0xa0,6);          /*把0x30开始的 待写入数据存储指针,写入字节数 */
 233   1                                              /* 写入器件内首地址,写入控制字,器件类型 */
 234   1      RW24XX(str2,6,0x0010,0xa1,6);
 235   1      
 236   1      
 237   1      Delay(50);                              /* 检查内部数据区0x30-0x39与0x40-0x49应完全相同 */
 238   1      }
 239          


C51 COMPILER V7.20   EEPROM2                                                               06/19/2007 13:41:10 PAGE 5   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    446    ----
   CONSTANT SIZE    =     12    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      24
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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