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

📄 i2c.lst

📁 51单片机下
💻 LST
字号:
C51 COMPILER V7.06   I2C                                                                   08/08/2007 10:10:38 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN E:\NETBRO~1\TRUNK\NETBRO~1\I2C\I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\NETBRO~1\TRUNK\NETBRO~1\I2C\I2C.C DB SB OE

stmt level    source

   1          //iic.c
   2          #include <reg51.h>
   3          #include <intrins.h>
   4          #include "I2C.H"
   5          
   6          bit gAck;//应答标志位
   7          #define  _Nop()  _nop_(),_nop_(),_nop_(),_nop_()//,_nop_(),_nop_()
   8          
   9          //短延时
  10          void I2C_Delay(long lDly)
  11          {
  12   1          while ( lDly ) lDly--;
  13   1      }
  14          
  15          void I2C_Init()
  16          {
  17   1              SCL = 1;
  18   1              I2C_Delay(10);
  19   1              SDA = 1;
  20   1              I2C_Delay(10);
  21   1      }
  22          
  23          /*******************************************************************
  24                               起动总线函数
  25          函数原型: void  I2C_Start();
  26          功能:     启动I2C总线,即发送I2C起始条件
  27          
  28          ********************************************************************/
  29          void I2C_Start()
  30          {
  31   1        SDA = 1;      //发送起始条件的数据信号
  32   1        _Nop();
  33   1        SCL = 1;
  34   1        _Nop();       //起始条件建立时间大于4.7us,延时
  35   1        I2C_Delay(40);//_Nop();  _Nop();  _Nop();  _Nop();
  36   1        SDA = 0;      //发送起始信号
  37   1        _Nop();       // 起始条件锁定时间大于4μs
  38   1        I2C_Delay(40);//_Nop();  _Nop();  _Nop();  _Nop();
  39   1        SCL = 0;      //钳住I2C总线,准备发送或接收数据
  40   1        _Nop();  _Nop();
  41   1      }
  42          
  43          /*******************************************************************
  44                                 结束总线函数
  45          函数原型: void  Stop_I2c();
  46          功能:     结束I2C总线,即发送I2C结束条件.
  47          ********************************************************************/
  48          void I2C_Stop()
  49          {
  50   1        SDA = 0;      //发送结束条件的数据信号
  51   1        _Nop();       //发送结束条件的时钟信号
  52   1        SCL = 1;      //结束条件建立时间大于4μs
  53   1        I2C_Delay(50);//_Nop();  _Nop();  _Nop();  _Nop();  _Nop();
  54   1      
  55   1        SDA = 1;      //发送I2C总线结束信号
C51 COMPILER V7.06   I2C                                                                   08/08/2007 10:10:38 PAGE 2   

  56   1        I2C_Delay(40);//_Nop();  _Nop();  _Nop();  _Nop();
  57   1      }
  58          
  59          /*******************************************************************
  60                           字节数据发送函数
  61          函数原型: void  I2C_SendByte(uchar uchData);
  62          功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  63                    此状态位进行操作.(不应答或非应答都使ack=0)
  64                    发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  65          ********************************************************************/
  66          void  I2C_SendByte(unsigned char uchData)
  67          {
  68   1       unsigned char uchBitCnt;
  69   1      
  70   1       for(uchBitCnt = 0;uchBitCnt < 8;uchBitCnt ++)  /*要传送的数据长度为8位*/
  71   1       {
  72   2           if( (uchData << uchBitCnt) & 0x80)
  73   2              SDA = 1;                //判断发送位
  74   2           else
  75   2              SDA = 0;
  76   2           _Nop();
  77   2           SCL = 1;                     //置时钟线为高,通知被控器开始接收数据
  78   2            _Nop();                     //保证时钟高电平周期大于4μs
  79   2            I2C_Delay(40);//_Nop();_Nop();_Nop();_Nop();
  80   2           SCL = 0;
  81   2        }
  82   1        _Nop();    _Nop();
  83   1        SDA = 1;                //8位发送完后释放数据线,准备接收应答位
  84   1        I2C_Delay(20);//_Nop();    _Nop();
  85   1        SCL = 1;
  86   1        I2C_Delay(30);//_Nop();    _Nop();    _Nop();
  87   1        if(SDA == 1)
  88   1           gAck=0;
  89   1        else
  90   1           gAck=1;        //判断是否接收到应答信号
  91   1        SCL = 0;
  92   1        I2C_Delay(20);//_Nop();    _Nop();
  93   1      }
  94          
  95          /*******************************************************************
  96                           字节数据接收函数
  97          函数原型: unsigned char  I2C_RcvByte();
  98          功能:     用来接收从器件传来的数据,并判断总线错误(不发应答信号),
  99                    发完后请用应答函数应答从机。
 100          ********************************************************************/
 101          unsigned char  I2C_RcvByte()
 102          {
 103   1        unsigned char uchRetc;
 104   1        unsigned char uchBitCnt;
 105   1      
 106   1        uchRetc = 0;
 107   1        SDA = 1;                             //置数据线为输入方式
 108   1        for(uchBitCnt = 0;uchBitCnt < 8;uchBitCnt ++)
 109   1        {
 110   2              _Nop();
 111   2              SCL = 0;                       //置时钟线为低,准备接收数据位
 112   2              _Nop();                        //时钟低电平周期大于4.7μs
 113   2              I2C_Delay(40);//_Nop();  _Nop();  _Nop();  _Nop();
 114   2              SCL = 1;                       //置时钟线为高使数据线上数据有效
 115   2              I2C_Delay(20);//_Nop();  _Nop();
 116   2              uchRetc = uchRetc << 1;
 117   2              if(SDA == 1)
C51 COMPILER V7.06   I2C                                                                   08/08/2007 10:10:38 PAGE 3   

 118   2                 uchRetc = uchRetc + 1;       //读数据位,接收的数据位放入retc中
 119   2              I2C_Delay(20);//_Nop();  _Nop();
 120   2         }
 121   1        SCL = 0;
 122   1        I2C_Delay(20);//_Nop();  _Nop();
 123   1        return uchRetc;
 124   1      }
 125          
 126          /********************************************************************
 127                               应答子函数
 128          函数原型:  void Ack_I2c(bit a);
 129          功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
 130          ********************************************************************/
 131          void I2C_Ack(bit bData)
 132          {
 133   1      
 134   1        if(bData == 0)
 135   1           SDA=0;                    //在此发出应答或非应答信号
 136   1        else
 137   1           SDA=1;
 138   1        I2C_Delay(30);//_Nop();  _Nop();  _Nop();
 139   1        SCL = 1;
 140   1        _Nop();                      //时钟低电平周期大于4μs
 141   1        I2C_Delay(30);//_Nop();  _Nop();  _Nop();  _Nop();
 142   1        SCL = 0;                     //清时钟线,钳住I2C总线以便继续接收
 143   1        I2C_Delay(20);//_Nop();  _Nop();
 144   1      }
 145          
 146          /*******************************************************************
 147                              向有子地址器件发送多字节数据函数
 148          函数原型: bit I2C_SendStr(unsigned char uchSlaveAddr,unsigned char uchSubAddr,unsigned char uchSize,unsign
             -ed char *pBuf);
 149          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 150                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 151                    如果返回1表示操作成功,否则操作有误。
 152          注意:    使用前必须已结束总线。
 153          ********************************************************************/
 154          bit I2C_SendStr(unsigned char uchSlaveAddr,unsigned char uchSubAddr,unsigned char uchSize,unsigned char *p
             -SendBuf)
 155          {
 156   1         unsigned char i;
 157   1      
 158   1         I2C_Start();                            //启动总线
 159   1         I2C_SendByte(uchSlaveAddr);             //发送器件地址
 160   1         if(gAck == 0)
 161   1            return(0);
 162   1         I2C_SendByte(uchSubAddr);               //发送器件子地址
 163   1         if(gAck == 0)
 164   1            return(0);
 165   1      
 166   1         for(i = 0;i < uchSize;i++)
 167   1         {
 168   2           I2C_SendByte(*pSendBuf);                  //发送数据
 169   2           if(gAck == 0)
 170   2              return(0);
 171   2           pSendBuf++;
 172   2         }
 173   1         I2C_Stop();                             //结束总线
 174   1      
 175   1         return(1);
 176   1      }
 177          
C51 COMPILER V7.06   I2C                                                                   08/08/2007 10:10:38 PAGE 4   

 178          /*******************************************************************
 179                              向有子地址器件读取多字节数据函数
 180          函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
 181          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 182                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 183                     如果返回1表示操作成功,否则操作有误。
 184          注意:    使用前必须已结束总线。
 185          ********************************************************************/
 186          bit I2C_RcvStr(unsigned char uchSlaveAddr,unsigned char uchSubAddr,unsigned char uchSize,unsigned char *pR
             -cvBuf)
 187          {
 188   1         unsigned char i;
 189   1      
 190   1         I2C_Start();                               //启动总线
 191   1         I2C_SendByte(uchSlaveAddr);                //发送器件地址
 192   1         if(gAck == 0)
 193   1            return(0);
 194   1         I2C_SendByte(uchSubAddr);                  //发送器件子地址
 195   1         if(gAck == 0)
 196   1            return(0);
 197   1      
 198   1         I2C_Start();                               //重新启动总线
 199   1         I2C_SendByte(uchSlaveAddr + 1);
 200   1         if(gAck == 0)
 201   1            return(0);
 202   1      
 203   1         for(i = 0;i < uchSize - 1;i++)
 204   1         {
 205   2           *pRcvBuf = I2C_RcvByte();                //发送数据
 206   2            I2C_Ack(0);                             //发送数据应答位
 207   2           pRcvBuf ++;
 208   2         }
 209   1         *pRcvBuf = I2C_RcvByte();
 210   1      
 211   1         I2C_Ack(1);                                //发送非应位
 212   1         I2C_Stop();                                //结束总线
 213   1      
 214   1         return(1);
 215   1      }
C51 COMPILER V7.06   I2C                                                                   08/08/2007 10:10:38 PAGE 5   

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
====                                    =====   ======  ====    ======  ====


P1 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0090H  1
_I2C_SendByte. . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  uchData. . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0003H  1
  uchBitCnt. . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0002H  1
I2C_Ack. . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  bData. . . . . . . . . . . . . . . .  AUTO     DATA   BIT      0000H  1
I2C_Start. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
I2C_Init . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
_I2C_SendStr . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  uchSlaveAddr . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0002H  1
  uchSubAddr . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
  uchSize. . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0002H  1
  pSendBuf . . . . . . . . . . . . . .  AUTO     DATA   PTR      0003H  3
  i. . . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0006H  1
I2C_Stop . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
SDA. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0096H  1
I2C_RcvByte. . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  uchRetc. . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0003H  1
  uchBitCnt. . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0002H  1
SCL. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0097H  1
_I2C_RcvStr. . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  uchSlaveAddr . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
  uchSubAddr . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
  uchSize. . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0002H  1
  pRcvBuf. . . . . . . . . . . . . . .  AUTO     DATA   PTR      0003H  3
  i. . . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0006H  1
_I2C_Delay . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0008H  -----
  lDly . . . . . . . . . . . . . . . .  AUTO     DATA   LONG     0000H  4
gAck . . . . . . . . . . . . . . . . .  PUBLIC   DATA   BIT      0000H  1


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


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

⌨️ 快捷键说明

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