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

📄 e2prom.lst

📁 手把手教你单片机
💻 LST
字号:
C51 COMPILER V8.02   E2PROM                                                                02/08/2011 09:22:39 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE E2PROM
OBJECT MODULE PLACED IN e2prom.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE source\e2prom.c BROWSE INCDIR(include/) DEBUG OBJECTEXTEND PRINT(.\e2prom.l
                    -st) OBJECT(e2prom.obj)

line level    source

   1          /*
   2           * E2PROM 读写
   3          */
   4          
   5          #include "e2prom.h"
   6          
   7          
   8          /**
   9           * 函数: i2c_start()
  10           * 功能: 启动i2c
  11          */
  12          void i2c_start()
  13          {
  14   1              SCL = 1;
  15   1              nops();
  16   1              SDA = 1;
  17   1              nops();
  18   1              SDA = 0;
  19   1              nops();
  20   1              SCL = 0;
  21   1      }
  22          
  23          /**
  24           * 函数: i2c_stop()
  25           * 功能: 停止i2c
  26          */
  27          void i2c_stop()
  28          {
  29   1              SCL = 0;
  30   1              nops();
  31   1              SDA = 0;
  32   1              nops();
  33   1              SCL = 1;
  34   1              nops();
  35   1              SDA = 1;
  36   1              nops();
  37   1      }
  38          
  39          /**
  40           * 函数: i2c_ACK(bit ck)
  41           * 功能: ck为1时发送应答信号ACK,
  42           *       ck为0时不发送ACK
  43          */
  44          void i2c_ACK(bit ck)
  45          {
  46   1          if (ck)
  47   1                      SDA = 0;
  48   1          else
  49   1                      SDA = 1;
  50   1          nops();
  51   1          SCL = 1;
  52   1          nops();
  53   1          SCL = 0;
  54   1              nops();
C51 COMPILER V8.02   E2PROM                                                                02/08/2011 09:22:39 PAGE 2   

  55   1          SDA = 1;
  56   1          nops();
  57   1      }
  58          
  59          /**
  60           * 函数: i2c_waitACK()
  61           * 功能: 返回为0时收到ACK
  62           *       返回为1时没收到ACK
  63          */
  64          bit i2c_waitACK()
  65          {
  66   1              SDA = 1;
  67   1              nops();
  68   1              SCL = 1;
  69   1              nops();
  70   1              if (SDA)
  71   1              {   
  72   2                      SCL = 0;
  73   2                      i2c_stop();
  74   2                      return 1;
  75   2              }
  76   1              else
  77   1              {  
  78   2                      SCL = 0;
  79   2                      return 0;
  80   2              }
  81   1      }
  82          
  83          /**
  84           * 函数: i2c_sendbyte(uint8 bt)
  85           * 功能: 将输入的一字节数据bt发送
  86          */
  87          void i2c_sendbyte(uint8 bt)
  88          {
  89   1          uint8 i;
  90   1          
  91   1          for(i=0; i<8; i++)
  92   1          {  
  93   2              if (bt & 0x80) 
  94   2                              SDA = 1;
  95   2              else 
  96   2                              SDA = 0;
  97   2              nops();
  98   2              SCL = 1;
  99   2              bt <<= 1;
 100   2              nops();       
 101   2              SCL = 0;
 102   2          }
 103   1      }
 104          
 105          /**
 106           * 函数: i2c_recbyte( )
 107           * 功能: 从总线上接收1字节数据
 108          */
 109          uint8 i2c_recbyte()
 110          {
 111   1              uint8 dee, i;
 112   1              
 113   1              for (i=0; i<8; i++)
 114   1              {
 115   2                      SCL = 1;    
 116   2                      nops();
C51 COMPILER V8.02   E2PROM                                                                02/08/2011 09:22:39 PAGE 3   

 117   2                      dee <<= 1;
 118   2                      if (SDA) 
 119   2                              dee = dee | 0x01;
 120   2                      SCL = 0;
 121   2                      nops();
 122   2              }
 123   1              
 124   1              return dee;
 125   1      }
 126          
 127          /**
 128           * 函数: i2c_writebyte
 129           * 功能: 字节写,在指定的地址(add)
 130           *       写入一字节数据(dat)
 131           * 返回值: 0->成功  1->失败
 132          */
 133          bit i2c_writebyte(uint8 addr, uint8 dat)
 134          {
 135   1          i2c_start();
 136   1          i2c_sendbyte(SLAVEADDR);  //控制字节
 137   1          if (i2c_waitACK())
 138   1                      return 1;
 139   1          i2c_sendbyte(addr);   //地址
 140   1          if (i2c_waitACK())
 141   1                      return 1;
 142   1          i2c_sendbyte(dat);   //数据
 143   1          if (i2c_waitACK())
 144   1                      return 1;
 145   1          i2c_stop();
 146   1          delay(2000);
 147   1              return 0;
 148   1      }
 149          
 150          /**
 151           * 函数: i2c_readbyte
 152           * 输入: add
 153           * 返回: hep
 154           * 功能: 字节读,在指定的地址(add)
 155           *       读出一字节数据
 156           * 返回值: 0->成功  1->失败
 157          */
 158          bit i2c_readbyte(uint8 addr, uint8 *dat)
 159          {       
 160   1              i2c_start();
 161   1              i2c_sendbyte(SLAVEADDR);    //控制字节
 162   1          if (i2c_waitACK())
 163   1                      return 1;
 164   1              i2c_sendbyte(addr);        //地址
 165   1          if (i2c_waitACK())
 166   1                      return 1;
 167   1              i2c_start();
 168   1              i2c_sendbyte(SLAVEADDR+1); //控制字节
 169   1          if (i2c_waitACK())
 170   1                      return 1;
 171   1              *dat = i2c_recbyte();      //读数据
 172   1              i2c_ACK(0);                //因为只读一字节数据,不发送ACK信号
 173   1              i2c_stop();   
 174   1              
 175   1              return 0;
 176   1      }
 177          
 178          /*
C51 COMPILER V8.02   E2PROM                                                                02/08/2011 09:22:39 PAGE 4   

 179           * *buf--待写数据,addr--e2prom地址,len--数据长度
 180          */
 181          bit i2c_write_buf(uint8 *buf, uint8 addr, uint8 len)
 182          {
 183   1              while (len--)
 184   1              {
 185   2                      if (i2c_writebyte(addr++, *buf++))
 186   2                              return 1;
 187   2              }
 188   1              return 0;
 189   1      }
 190          
 191          /*
 192           * *buf--读数据,addr--e2prom地址,len--数据长度
 193          */
 194          bit i2c_read_buf(uint8 *buf, uint8 addr, uint8 len)
 195          {
 196   1              while (len--)
 197   1              {
 198   2                      if (i2c_readbyte(addr++, buf++))
 199   2                              return 1;
 200   2              }
 201   1              return 0;
 202   1      }


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


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

⌨️ 快捷键说明

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