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

📄 hi2c_c51.lst

📁 keil 下单片机与2404通讯
💻 LST
字号:
C51 COMPILER V8.08   HI2C_C51                                                              04/16/2008 11:17:07 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE HI2C_C51
OBJECT MODULE PLACED IN HI2C_C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE HI2C_C51.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************
   2          *                               P89LPC932硬件I2C软件包(主)
   3          * 1  使用I2C总线软件包时P1.2,P1.3切勿写为0,并要设置为开漏输出。
   4          * 2  总线定义为P1.2=SCL,P1.3=SDA,需外接上拉电阻2-10k。
   5          * 3  相应寄存器:
   6          *    地址寄存器  I2ADR   用于存放自身从地址(从方式时才有用)
   7          *    数据寄存器  I2DAT   接收/发送数据用
   8          *    控制寄存器  I2CON   用于硬件I2C的设置、使能、启动、结束,
   9          *                       应答控制,中断标志等。
  10          *    状态寄存器  I2STAT  指示I2C总线的操作状态码,高5位有效,
  11          *                       若I2C中断志置位,可查询此寄存器判断
  12          *                        总线情况。
  13          *    SCL占空比寄存器  I2SCLH、I2SCLL  设置SCL的频率发生。
  14          *                        
  15          *    此软件包是以查询方式完成各种总线操作的,在使用前应对总线进行检查,并
  16          * 使用看门狗,以防等待总线而造成死机。
  17          *        文件名:HI2C_C51.C
  18          *                                  更新时间:2002.11.05
  19          *******************************************************************/
  20          #include <REG931.H>
  21          #include"HI2C_C51.H"
  22          //#include"main.h"
  23          
  24          #define uchar   unsigned char
  25          #define GENERATE_STOP        0x54     /* 置位 STO, 复位 STA 、 SI          */
  26          #define RELEASE_BUS_ACK      0x44     /* 复位 STO,STA,SI 并置位  AA (ack)  */
  27          #define RELEASE_BUS_NOACK    0x40     /* 复位 STO,STA,SI 并置位 AA (noack) */
  28          #define RELEASE_BUS_STA      0x64     /* 起动总线/重新起动总线, 置位 STA   */
  29          
  30          
  31          /*******************************************************************
  32          *                  申请总线
  33          * 功能:进行I2C总线的初始化--包括时钟选择,I2C使能,发送起始信号等等。
  34          *       I2EN为1,设置为主机;CRSEL位为0,使用内部SCL发生器。
  35          *******************************************************************/
  36          void GetBus()                            
  37          { I2SCLH = 100;                         /* 设置SCL高电平的PCLK周期数                                */
  38   1        I2SCLL = 100;              /* 设置SCL低电平的PCLK周期数,6MHz时为100Kbit/S */
  39   1        /* 申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位。              */
  40   1        I2CON = RELEASE_BUS_STA;      
  41   1        while( SI==0 );               /* 等待起始位的发送                             */
  42   1      }
  43          
  44          
  45          /*******************************************************************
  46          *                    发送数据函数
  47          * 功能:用于向总线发送数据 
  48          * 入口参数:ACC   待发送的数据                   
  49          *******************************************************************/
  50          void SendByte(uchar c)
  51          { I2DAT = c;
  52   1        I2CON = RELEASE_BUS_ACK;      /* 清除SI位等等                 */
  53   1        while( SI==0 );                       /* 等待数据的发送               */
  54   1      }
  55          
C51 COMPILER V8.08   HI2C_C51                                                              04/16/2008 11:17:07 PAGE 2   

  56          
  57          
  58          /*******************************************************************
  59          *                    向无子地址器件发送字节数据函数               
  60          * 功能:从启动总线到发送地址,数据,结束总线的全过程。
  61          * 入口参数:sla         从器件地址
  62          *           c           待发送的数据
  63          * 出口参数:返回1表示操作成功,否则操作有误。
  64          ********************************************************************/
  65          bit ISendByte(uchar sla, uchar c)
  66          { GetBus();                     /* 启动总线                    */
  67   1        SendByte(sla);                /* 发送器件地址,并接收应答位  */
  68   1        if( I2STAT!=0X18 )                    /* 无从机应答则退出操作        */
  69   1        { I2CON = GENERATE_STOP;
  70   2          return(0);
  71   2        }
  72   1      
  73   1        SendByte(c);                  /* 发送数据                    */
  74   1        if( I2STAT!=0X28 )
  75   1        { I2CON = GENERATE_STOP;
  76   2          return(0);
  77   2        }
  78   1        I2CON = GENERATE_STOP;        /* 结束总线                    */ 
  79   1        return(1);
  80   1      }
  81          
  82          
  83          
  84          /*******************************************************************
  85          *                    向有子地址器件发送多字节数据函数                 
  86          * 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
  87          * 入口参数;sla         从器件地址
  88          *           suba    子地址
  89          *           s       发送内容的指针
  90          *           no      发送字节数
  91          * 出口参数:返回1表示操作成功,否则操作有误。
  92          ********************************************************************/
  93          bit ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
  94          { uchar i;
  95   1      
  96   1        GetBus();                 /* 启动总线                 */
  97   1        SendByte(sla);            /* 发送器件地址             */
  98   1        if( I2STAT!=0X18 )
  99   1        { I2CON = GENERATE_STOP;
 100   2          return(0);
 101   2        }
 102   1      
 103   1        SendByte(suba);           /* 发送器件子地址                   */
 104   1        if( I2STAT!=0X28 )
 105   1        { I2CON = GENERATE_STOP;
 106   2          return(0);
 107   2        }
 108   1           
 109   1        for(i=0; i<no; i++)
 110   1        { SendByte(*s);           /* 发送数据                                 */
 111   2          if( I2STAT!=0X28 )
 112   2              { I2CON = GENERATE_STOP;
 113   3                return(0);
 114   3              }
 115   2          s++;
 116   2        } 
 117   1      
C51 COMPILER V8.08   HI2C_C51                                                              04/16/2008 11:17:07 PAGE 3   

 118   1        I2CON = GENERATE_STOP;    /* 结束总线                                 */ 
 119   1        return(1);
 120   1      }
 121          
 122          
 123          
 124          /*******************************************************************
 125          *                    向无子地址器件读字节数据函数                
 126          *功能:从启动总线到发送地址,读数据,结束总线的全过程。
 127          *入口参数:sla          从器件地址
 128          *          c        读出的数据(地址传送)
 129          * 出口参数:函数返回1表示操作成功,否则操作有误。
 130          ********************************************************************/
 131          bit IRcvByte(uchar sla, uchar *c)
 132          { GetBus();                     /* 启动总线                                          */
 133   1        SendByte(sla+1);              /* 发送器件地址                              */   
 134   1        if( I2STAT!=0X40 )
 135   1        { I2CON = GENERATE_STOP;
 136   2          return(0);
 137   2        }
 138   1        I2CON = RELEASE_BUS_NOACK; /* 接收一字节数据即发送非应答位 */
 139   1        while( SI==0 );            /* 等待接收数据                             */  
 140   1        if( I2STAT!=0X58 )
 141   1        { I2CON = GENERATE_STOP;
 142   2          return(0);
 143   2        }
 144   1        *c = I2DAT;                /* 读取数据                                         */
 145   1        I2CON = GENERATE_STOP;     /* 结束总线                                         */   
 146   1        return(1);
 147   1      }
 148          
 149          
 150          
 151          /*******************************************************************
 152          *                    向有子地址器件读取多字节数据函数                
 153          *功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
 154          *入口参数:sla          从器件地址
 155          *          suba         子地址
 156          *                  s        读出的内容存储区的指针
 157          *          no           读no个字节。
 158          *出口参数:函数返回1表示操作成功,否则操作有误。
 159          ********************************************************************/
 160          bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 161          { uchar i;
 162   1      
 163   1        GetBus();                     /* 启动总线                                             */
 164   1        SendByte(sla);            /* 发送器件地址                                     */
 165   1        if( I2STAT!=0X18)
 166   1        { I2CON = GENERATE_STOP;
 167   2          return(0);
 168   2        }
 169   1        SendByte(suba);           /* 发送器件子地址                           */
 170   1        if( I2STAT!=0X28 )
 171   1        { I2CON = GENERATE_STOP;
 172   2          return(0);
 173   2        }
 174   1      
 175   1        I2CON = RELEASE_BUS_STA;  /* 重新启动总线                                     */
 176   1        while( SI==0 );
 177   1        SendByte(sla+1);
 178   1        if( I2STAT!=0X40 )
 179   1        { I2CON = GENERATE_STOP;
C51 COMPILER V8.08   HI2C_C51                                                              04/16/2008 11:17:07 PAGE 4   

 180   2          return(0);
 181   2        } 
 182   1         
 183   1        for(i=0; i<no-1; i++)
 184   1        { I2CON = RELEASE_BUS_ACK;   /* 接收一字节数据并发送应答位            */
 185   2          while( SI==0 );            /* 等待接收数据                                          */  
 186   2          if( I2STAT!=0X50 )
 187   2              { I2CON = GENERATE_STOP;
 188   3                return(0);
 189   3              }
 190   2          *s = I2DAT;                /* 读取数据                                                      */ 
 191   2          s++;
 192   2        } 
 193   1        I2CON = RELEASE_BUS_NOACK;   /* 接收最后一字节数据并发送非应答位      */
 194   1        while( SI==0 );  
 195   1        *s = I2DAT;
 196   1        I2CON = GENERATE_STOP;       /* 结束总线                                                      */ 
 197   1        return(1);
 198   1      }
 199          


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


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

⌨️ 快捷键说明

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