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

📄 i2c.lst

📁 液晶显示键盘操作密码编辑控制加上对存储器操作
💻 LST
字号:
C51 COMPILER V7.50   I2C                                                                   04/10/2008 19:53:20 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\obj\I2C.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE src\I2C.c BROWSE DEBUG OBJECTEXTEND PRINT(.\lst\I2C.lst) OBJECT(.\obj\I2C.o
                    -bj)

line level    source

   1          #include <reg51.h>
   2          
   3          #include "i2c.h"
   4          
   5          uchar code set_tab[]={ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x01,
   6                                 0x00,0x01,0x02,0x03,0x04,0x06,0x06,0x07,0x08,0x09,0x00,0x02,
   7                                 0x00,0x01,0x02,0x03,0x04,0x07,0x06,0x07,0x08,0x09,0x00,0x03,
   8                                 0x00,0x01,0x02,0x03,0x04,0x08,0x06,0x07,0x08,0x09,0x00,0x04,
   9                                 0x00,0x01,0x02,0x03,0x04,0x09,0x06,0x07,0x08,0x09,0x00,0x05 };
  10          ////5个用户的帐号和密码信息,前6个是帐户,后6个是密码////////////////////////////////////
  11          /* =========================================================================
  12          *     I2C总线基本操作函数(接口模拟函数)
  13          * =========================================================================*/
  14          
  15          /****************************************************************************
  16          *    函数原型: void i_delay(void);
  17          *    功    能: 本函数实际上只有一条返回指令, 在具体应用中可视具体要求增加延时 
  18          *              指令。
  19          ****************************************************************************/
  20          void i_delay( void )
  21           {      ;;;;
  22   1       }
  23          
  24          /****************************************************************************
  25          *    函数原型: void I_start(void);
  26          *    功    能: 提供I2C总线工作时序中的起始位。                             
  27          ****************************************************************************/
  28          void I_start( void )
  29           {      SCL = HIGH ;
  30   1          SDA = HIGH;
  31   1              i_delay() ;
  32   1              SDA = LOW ;
  33   1              i_delay() ;
  34   1              SCL = LOW ;
  35   1              i_delay() ;
  36   1        
  37   1       }
  38          
  39          /****************************************************************************
  40          *    函数原型: void I_stop(void);
  41          *    功    能: 提供I2C总线工作时序中的停止位。
  42          ****************************************************************************/
  43          void I_stop( void ) 
  44          {       SDA = LOW ;
  45   1              SCL = HIGH ;
  46   1              i_delay() ;
  47   1              SDA = HIGH ;
  48   1              i_delay() ;
  49   1              SCL = LOW ;
  50   1              i_delay() ;
  51   1       }
  52          
  53          /****************************************************************************
  54          *    函数原型: void I_init(void);
C51 COMPILER V7.50   I2C                                                                   04/10/2008 19:53:20 PAGE 2   

  55          *    功    能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
  56          *              其它函数。
  57          ****************************************************************************/
  58          void I_init( void ) 
  59          {       SCL = LOW ;
  60   1              I_stop() ;
  61   1      }
  62          
  63          /****************************************************************************
  64          *    函数原型: bit I_clock(void);
  65          *    功    能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状
  66          *              态。本函数可用于数据发送, 也可用于数据接收。
  67          ****************************************************************************/
  68          bit I_clock( void )
  69           {      bit sample ;
  70   1              SCL = HIGH ;
  71   1              i_delay() ;
  72   1              sample = SDA ;
  73   1              SCL = LOW ;
  74   1              i_delay() ;
  75   1              return (sample);
  76   1       }
  77          
  78          /****************************************************************************
  79          *    函数原型: bit I_send(uchar I_data);
  80          *    功    能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
  81          *              则返回1(TRUE), 否则返回0(FALSE)。
  82          ****************************************************************************/
  83          bit I_send( uchar I_data )
  84           {      uchar i;
  85   1              for (i=0;i<8;i++)       // 发送8位数据 //
  86   1              {       SDA = (bit)(I_data & 0x80) ;
  87   2                      I_clock() ;
  88   2                      I_data=I_data<<1 ;
  89   2              }       
  90   1              SDA=HIGH ; //请求应答信号ACK //
  91   1              return (~I_clock());
  92   1        }
  93          
  94          /****************************************************************************
  95          *    函数原型: uchar I_receive(void);
  96          *    功    能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
  97          *              返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
  98          *              号线处于浮置状态, 即使8051的P1.7脚置1。
  99          ****************************************************************************/
 100          uchar I_receive( void )
 101           {      uchar I_data = 0 ;
 102   1              register uchar i ;
 103   1              for (i=0;i<8;i++) 
 104   1              {       I_data *= 2 ;
 105   2                      if (I_clock()) I_data++;
 106   2              }
 107   1              return (I_data) ;
 108   1              //注意:没有回送ACK信号,方便后面读取数据时控制传输结束////////////
 109   1      }
 110          /****************************************************************************
 111          *    函数原型: void I_Ack(void);
 112          *    功    能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
 113          *****************************************************************************/
 114          void I_Ack( void )
 115          {       SDA = LOW ;
 116   1              I_clock() ;
C51 COMPILER V7.50   I2C                                                                   04/10/2008 19:53:20 PAGE 3   

 117   1              SDA = HIGH ;
 118   1      }
 119          /****************************************************************************
 120          *    函数原型: bit E_address(uchar Address);
 121          *    功    能: 对24C01指定一个存储器空间地址。
 122          *****************************************************************************/
 123          bit E_address( uchar Address ) 
 124          {       I_start() ;// 发送启动信号,该信号不可掉,否则无法正常传输////////
 125   1              if (I_send(WRITE))
 126   1                      return (I_send( Address));
 127   1              else
 128   1                      return (FALSE);
 129   1      }
 130          
 131          /****************************************************************************
 132          *    函数原型: uchar E_read_onedata(uchar address);
 133          *    功    能: 从24C01中address地址中读取1个字节的数据,并将读取的数据作为
 134          *              函数的返回值返回。读取不成功返回值为0。注意不要将address地址
 135          *              中的数据放为0,以免误解。
 136          *****************************************************************************/
 137          /*
 138          uchar E_read_onedata(uchar address)
 139          {       uchar m ;       
 140                  if ( E_address(address)) // 从指定的地址开始读取数据 //
 141                    {  I_start();           // 发送重复启动信号//
 142                          if(I_send( READ)) 
 143                            {     
 144                       m=(I_receive());
 145                                     return(m);                           
 146                            }             
 147                          else {
 148                                  I_stop() ;
 149                                  return (0) ;
 150                              }
 151                  }
 152                  else
 153                     {  I_stop() ;
 154                            return (0) ;
 155                     }
 156          }
 157          */
 158          /****************************************************************************
 159          *    函数原型: void wait_5ms(void);
 160          *    功    能: 提供5ms延时(时钟频率为12MHz)。
 161          *****************************************************************************/
 162          void wait_5ms( void ) 
 163          {       int i;
 164   1              for(i=0;i<1000;i++) 
 165   1              {       
 166   2              ;
 167   2              }
 168   1      }
 169          
 170          /****************************************************************************
 171          *    函数原型: bit E_write_onedata(uchar address,uchar i_data );
 172          *    功    能: 将数据i_data写入到24C01的address地址中
 173          *               成功写入返回1( TRUE ), 否则返回0(FALSE)
 174          *****************************************************************************/
 175          /*
 176          bit E_write_onedata(uchar address,uchar i_data )
 177          {
 178            if(E_address(address) &&I_send( i_data ) )  
C51 COMPILER V7.50   I2C                                                                   04/10/2008 19:53:20 PAGE 4   

 179                   {      
 180                I_stop() ;
 181                    wait_5ms();
 182                    return(TRUE);
 183                   }
 184           else
 185                  {return(FALSE);}
 186          }
 187          */
 188          /****************************************************************************
 189          *    函数原型: uchar E_read_datablock(uchar address,uchar length);
 190          *    功    能: 从24C01中以指定的地址address为首地址读取length个长度的数据
 191          *                放到由指针p指定内部存储器(的数组变量)中 ,读取成功返回1,否则返回0。 
 192          *                          
 193          *****************************************************************************/
 194          
 195          bit E_read_datablock(uchar address,uchar length,uchar *p)
 196          {       uchar i ;       
 197   1              if (E_address(address) ) //从地址address开始读取数据//
 198   1              {       ////只指定了一个起始地址为首址,顺序读取数据///////
 199   2                I_start() ;  // 发送重复启动信号 //
 200   2                      if(I_send(READ)) 
 201   2                       {
 202   3                 for(i=0;i<=length;i++) 
 203   3                                {
 204   4                      p[i] = (I_receive()) ;
 205   4                                      if (i !=length) I_Ack() ;//每读取一个数据后要有一个Ack信号/////
 206   4                                      else 
 207   4                        {
 208   5                                         I_clock();/////不给Ack信号,准备结束传输/////
 209   5                                         I_stop();
 210   5                                         }
 211   4                                }
 212   3                         return (TRUE);
 213   3                      }
 214   2               else {
 215   3                              I_stop() ;
 216   3                              return (FALSE);
 217   3                    }
 218   2          }
 219   1        else I_stop() ;               
 220   1      return (FALSE);
 221   1      }
 222          
 223          
 224          /****************************************************************************
 225          *    函数原型:bit E_write_datablock(uchar address,uchar length,uchar *p);
 226          *    功    能: 写入数据到24C01的以address为首址length个存储器中,数据来源 
 227          *              由指针p指定内部RAM(数组)中的数据,成功写入返回1( TRUE ), 
 228          *              否则返回0(FALSE)
 229          *****************************************************************************/
 230          bit E_write_datablock(uchar address,uchar length,uchar *p)
 231          {       uchar i ;
 232   1              for(i=0;i<=length;i++) 
 233   1              {       if(E_address(address+i)&&I_send(*(p+i)))
 234   2          ////指定一个地址。写一个数据//////
 235   2                      {       I_stop() ;
 236   3                              wait_5ms();
 237   3                      }
 238   2                      else
 239   2                              return (FALSE);
 240   2              }
C51 COMPILER V7.50   I2C                                                                   04/10/2008 19:53:20 PAGE 5   

 241   1              return (TRUE);
 242   1       }
 243          
 244          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    281    ----
   CONSTANT SIZE    =     60    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12       8
   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 + -