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

📄 iic.lst

📁 16C554VX1128MAX4359-MAX4456P89LPC952 驱动开发
💻 LST
字号:
C51 COMPILER V8.02   IIC                                                                   05/15/2008 11:56:36 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: D:\软件安装路径\C51\BIN\C51.EXE IIC.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <REG952.H>
   2          
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          
   6          //以下为I2C操作时所需要的变量 
   7          volatile uchar  I2C_sla;           // 从机地址(即器件地址)
   8          volatile uchar  I2C_suba;          // 子地址
   9          volatile uchar  *I2C_buf;          // 数据缓冲区指针 (读操作时会被更改)
  10          volatile uchar  I2C_num;           // 操作数据个数 (会被更改)
  11          volatile uchar  I2C_end;           // 操作结束标志,为1时表示操作结束,为0xFF时表示操作失败 (会被设置)
  12          volatile uchar  I2C_suba_en;       // 子地址使能控制,读操作时请设置为1,写操作时请设置为2 (会被更改)
  13          //--------------------------------
  14          //功能:IIC主机初始化
  15          //--------------------------------
  16          void IIC_Init()
  17          {
  18   1      //      EI2C=1; //开I2C中断
  19   1              CRSEL=0;
  20   1              I2SCLL=15;
  21   1              I2SCLH=15; //12Mhz下,IIC总线速率为120kbit/s
  22   1              I2EN=1;  //初始化为主机
  23   1          STA=0;             // 设置为主机,并启动总线
  24   1          STO=0;
  25   1          SI=0;
  26   1      
  27   1      
  28   1      }
  29          //--------------------------------
  30          /****************************************************************************
  31          * 名称:IRQ_I2C()
  32          * 功能:I2C中断,通过判断I2C状态字进行相应的操作。
  33          * 入口参数:无
  34          * 出口参数:无
  35          ****************************************************************************/
  36          void  IRQ_I2C(void)     //interrupt 7   
  37          {  
  38   1          uchar  sta;
  39   1          sta = I2STAT;                    // 读出I2C状态字
  40   1          switch(sta)
  41   1          {  
  42   2                      case  0x08:                   // 己发送起始条件
  43   2              if(1==I2C_suba_en) 
  44   2                      I2DAT = I2C_sla&0xFE;    // 指定子地址读时,先写入地址
  45   2              else I2DAT = I2C_sla;  // 否则直接发送从机地址
  46   2                      STO=0;
  47   2              SI=0;         // SI=0
  48   2              break;  
  49   2                              
  50   2                      case  0x10: 
  51   2                      STO=0;
  52   2                      SI=0;
  53   2              break;
  54   2      
  55   2                      case  0x20: 
C51 COMPILER V8.02   IIC                                                                   05/15/2008 11:56:36 PAGE 2   

  56   2                      case  0x18: 
  57   2                      if(0==I2C_suba_en)      // 无子地址,则直接发送数据
  58   2              {  
  59   3                              if(I2C_num>0)
  60   3                  {  
  61   4                                      I2DAT = *I2C_buf++;
  62   4                      SI=0;  
  63   4                      I2C_num--;
  64   4                   }
  65   3                   else
  66   3                   {  
  67   4                                      I2CON = I2CON|0x10;  // 无数据发送,结束总线
  68   4                      SI=0; 
  69   4                      I2C_end = 1;      // 设置总线操作结束标志
  70   4                    }
  71   3                   break;
  72   3              }
  73   2              if(1==I2C_suba_en)      // 发送子地址
  74   2              { 
  75   3                              I2DAT = I2C_suba;
  76   3                  SI=0; 
  77   3              }
  78   2              if(2==I2C_suba_en)
  79   2              {  
  80   3                              I2DAT = I2C_suba;
  81   3                              STA=0;
  82   3                              STO=0;
  83   3                  SI=0; 
  84   3                  I2C_suba_en = 0;     // 子地址己处理
  85   3                      }
  86   2              break;
  87   2                      case  0x28:
  88   2                      case  0x30: 
  89   2                      if(0==I2C_suba_en)      // 无子地址,则直接发送数据
  90   2              {  
  91   3                              if(I2C_num>0)
  92   3                  {  
  93   4                                      I2DAT = *I2C_buf++;
  94   4                      STA=0;
  95   4                                      STO=0;
  96   4                      SI=0;  
  97   4                      I2C_num--;
  98   4                  }
  99   3                  else
 100   3                  {  
 101   4                                      STA=0;    // 无数据发送,结束总线
 102   4                                      STO=1;
 103   4                                      SI=0;
 104   4                      I2C_end = 1; 
 105   4                  }
 106   3                  break;
 107   3              }
 108   2              if(1==I2C_suba_en)      // 若是指定地址读,则重新启动总线
 109   2              {  
 110   3                              I2CON = I2CON|0x20;
 111   3                  I2CON = I2CON&~0x08;
 112   3                  I2C_suba_en = 0;     // 子地址己处理
 113   3               }
 114   2              break;
 115   2                      case  0x38: 
 116   2                      STA=0;
 117   2                      STO=0;
C51 COMPILER V8.02   IIC                                                                   05/15/2008 11:56:36 PAGE 3   

 118   2                      SI=0;
 119   2              break;                    
 120   2            default: break;
 121   2         }
 122   1      }
 123          
 124          //延时子程序
 125          void Delay(uint data DelayTime)   
 126          {       
 127   1              uint data j;
 128   1              for(;DelayTime>0;DelayTime--)
 129   1              for(j=0;j<125;j++)
 130   1              {}      
 131   1      } 
 132          
 133          /****************************************************************************
 134          * 名称:ISendStr()
 135          * 功能:向有子地址器件发送多字节数据。
 136          * 入口参数:sla         器件从机地址
 137          *          suba         器件子地址
 138          *          s            数据发送缓冲区指针
 139          *          no           发送数据个数
 140          * 出口参数:返回值为0时表示出错,为1时表示操作正确。
 141          * 说明:使用前要初始化好I2C引脚功能和I2C中断,并已使能I2C主模式
 142          ****************************************************************************/
 143          void  ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
 144          {  /* 参数设置 */
 145   1         I2C_sla = sla;               // 写操作的器件地址
 146   1         I2C_suba = suba;             // 子地址
 147   1         I2C_buf = s;                 
 148   1         I2C_num = no;        
 149   1         I2C_suba_en = 2;             // 有子地址写
 150   1         I2C_end = 0; 
 151   1         STA=1;
 152   1         Delay(1);       //延时1ms,等待从机完成IIC初始化
 153   1         while(0==I2C_end)
 154   1         {
 155   2                      if(SI==1)
 156   2                      IRQ_I2C();
 157   2         }
 158   1      }


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