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

📄 i2c.lst

📁 ZLG7290键盘驱动程序。按下按键
💻 LST
字号:
C51 COMPILER V7.20   I2C                                                                   11/06/2008 20:27:10 PAGE 1   


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

line level    source

   1          
   2          #include "I2C.h"
   3          
   4          
   5          /*****************************************************
   6          宏定义:I2C_Delay()
   7          功能:延时,模拟I2C总线专用
   8          *****************************************************/
   9          void I2C_Delay()
  10          {
  11   1          unsigned char i;
  12   1          for(i=0;i<250;i++);
  13   1      }
  14          
  15          
  16          
  17          /*****************************************************
  18          函数:I2C_Init()
  19          功能:I2C总线初始化,使总线处于空闲状态
  20          说明:在main()函数的开始处,通常应当要执行一次本函数
  21          *****************************************************/
  22          void I2C_Init()
  23          {
  24   1              I2C_SCL = 1;    I2C_Delay();
  25   1              I2C_SDA = 1;    I2C_Delay();
  26   1      }
  27          
  28          
  29          
  30          /*****************************************************
  31          函数:I2C_Start()
  32          功能:产生I2C总线的起始状态
  33          说明:
  34                  SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
  35                  不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
  36                  本函数也可以用来产生重复起始状态
  37                  本函数执行后,I2C总线处于忙状态
  38          *****************************************************/
  39          void I2C_Start()
  40          {
  41   1              I2C_SDA = 1; I2C_Delay();
  42   1              
  43   1              I2C_SCL = 1; I2C_Delay();
  44   1              
  45   1              I2C_SDA = 0; I2C_Delay();
  46   1              
  47   1              I2C_SCL = 0; I2C_Delay();
  48   1      
  49   1      }
  50          
  51          
  52          
  53          /*****************************************************
  54          函数:I2C_Write()
  55          功能:向I2C总线写1个字节的数据
C51 COMPILER V7.20   I2C                                                                   11/06/2008 20:27:10 PAGE 2   

  56          参数:
  57                  dat:要写到总线上的数据
  58          *****************************************************/
  59          void I2C_Write(char dat)
  60          {
  61   1              unsigned char t = 8;
  62   1              do
  63   1              {
  64   2                      I2C_SDA = (bit)(dat & 0x80);
  65   2                      dat <<= 1;
  66   2                      I2C_SCL = 1;
  67   2                      I2C_Delay();
  68   2                      I2C_SCL = 0;
  69   2                      I2C_Delay();
  70   2              } while ( --t != 0 );
  71   1      
  72   1      }
  73          
  74          
  75          
  76          /*****************************************************
  77          函数:I2C_Read()
  78          功能:从从机读取1个字节的数据
  79          返回:读取的一个字节数据
  80          *****************************************************/
  81          char I2C_Read()
  82          {
  83   1              char dat = 0;
  84   1              unsigned char t = 8;
  85   1              I2C_SDA = 1;    //在读取数据之前,要把SDA拉高
  86   1              do
  87   1              {
  88   2                      I2C_SCL = 1;
  89   2                      I2C_Delay();
  90   2                      dat <<= 1;
  91   2                      if ( I2C_SDA ) dat |= 0x01;
  92   2                      I2C_SCL = 0;
  93   2                      I2C_Delay();
  94   2              } while ( --t != 0 );
  95   1              return dat;
  96   1      }
  97          
  98          
  99          
 100          /*****************************************************
 101          函数:I2C_GetAck()
 102          功能:读取从机应答位
 103          返回:
 104                    0:从机应答
 105                    1:从机非应答
 106          说明:
 107                    从机在收到每个字节的数据后,要产生应答位
 108                    从机在收到最后1个字节的数据后,一般要产生非应答位
 109          *****************************************************/
 110          void I2C_GetAck()
 111          {
 112   1      /*      bit ack;
 113   1              I2C_SDA = 1;    I2C_Delay();
 114   1      
 115   1              I2C_SCL = 1;    I2C_Delay();
 116   1      
 117   1              ack = I2C_SDA;
C51 COMPILER V7.20   I2C                                                                   11/06/2008 20:27:10 PAGE 3   

 118   1              I2C_SCL = 0;    I2C_Delay();
 119   1      
 120   1              return ack;*/
 121   1      
 122   1              I2C_SDA = 0;    I2C_Delay();
 123   1          I2C_SCL = 1;        I2C_Delay();
 124   1          I2C_SCL = 0;    //  SCL为低电平, SDA才允许改变
 125   1      }
 126          
 127          
 128          
 129          /*****************************************************
 130          函数:I2C_PutAck()
 131          功能:主机产生应答位或非应答位
 132          参数:
 133                    ack=0:主机产生应答位
 134                    ack=1:主机产生非应答位
 135          说明:
 136                    主机在接收完每一个字节的数据后,都应当产生应答位
 137                    主机在接收完最后一个字节的数据后,应当产生非应答位
 138          *****************************************************/
 139          void I2C_PutAck(bit ack)
 140          {
 141   1              I2C_SDA = ack;  I2C_Delay();
 142   1              I2C_SCL = 1;    I2C_Delay();
 143   1              I2C_SCL = 0;    I2C_Delay();
 144   1      }
 145          
 146          
 147          
 148          
 149          /*****************************************************
 150          函数:I2C_Stop()
 151          功能:产生I2C总线的停止状态
 152          说明:
 153                    SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
 154                    不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态
 155                    本函数执行后,I2C总线处于空闲状态
 156          *****************************************************/
 157          void I2C_Stop()
 158          {
 159   1              unsigned char j,i;
 160   1          I2C_SDA = 0;        I2C_Delay();
 161   1              I2C_SCL = 1;    I2C_Delay();
 162   1              I2C_SDA = 1;    I2C_Delay();
 163   1              
 164   1              for( i=0;i<20;i++ )
 165   1          for( j=0;j<200;j++ );                //  在下一次产生Start之前,要加一定的延时   
 166   1      }                                    //  一次延时0.1ms,共延时2ms
 167          
 168          
 169          
 170          /*****************************************************
 171          函数:I2C_Gets()
 172          功能:I2C总线综合接收函数,从从机接收多个字节的数据
 173          参数:
 174                    SlaveAddr:从机地址(7位纯地址,不含读写位)
 175                    SubAddr:从机的子地址
 176                    *dat:保存接收到的数据
 177                    Size:数据的字节数
 178          返回:
 179                   
C51 COMPILER V7.20   I2C                                                                   11/06/2008 20:27:10 PAGE 4   

 180          说明:
 181                    本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
 182                    当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
 183          *****************************************************/
 184          void I2C_Gets
 185          (
 186                  unsigned char SlaveAddr,
 187                  unsigned char SubAddr,
 188                  char *dat,
 189                  unsigned int Size
 190          )
 191          {
 192   1              unsigned char i;             
 193   1              unsigned char a[3];
 194   1      
 195   1              a[0] = SlaveAddr;              //  准备从机地址 
 196   1              a[1] = SubAddr;                //  准备子地址           
 197   1                         
 198   1              I2C_Start();                   //  发送从机地址,接着发送子地址
 199   1              for ( i=0; i<2; i++ )
 200   1              {
 201   2                      I2C_Write(a[i]);
 202   2              I2C_GetAck();
 203   2              }
 204   1              
 205   1      //这里的I2C_Start()对于有子地址的从机是重复起始状态
 206   1      //对于无子地址的从机则是正常的起始状态
 207   1              I2C_Start();
 208   1      
 209   1              I2C_Write(a[0]+1);            //  发送从机地址,读器件
 210   1          I2C_GetAck();
 211   1      
 212   1              for (;;)
 213   1              {
 214   2                      *dat = I2C_Read();      
 215   2                      if ( --Size == 0 )
 216   2                      {
 217   3                              I2C_PutAck(1);
 218   3                              break;
 219   3                      }     
 220   2                      I2C_PutAck(0);
 221   2                      dat++;
 222   2              }
 223   1      
 224   1              I2C_Stop();                     //接收完毕,停止I2C总线,并返回结果
 225   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    216    ----
   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 + -