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

📄 viic.lst

📁 isl1208 program using c for clock
💻 LST
字号:
C51 COMPILER V7.04   VIIC                                                                  03/05/2006 15:42:57 PAGE 1   


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

stmt level    source

   1          /********************************************************************
   2                                 VIIC_C51.C
   3            此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
   4          及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
   5          与用户程序连接并扩展.....  
   6            
   7              注意:函数是采用软件延时的方法产生PIN_SCL脉冲,固对高晶振频率要作 
   8          一定的修改....
   9              目前选用晶振荡器22.1184M, _nop_ 时间大约为0.5uS
  10          
  11          ********************************************************************/
  12          #include "p89c66x.h"
  13          #include "viic.h"      
  14          #include <intrins.h>
  15          
  16          #define IIC_SLOW_MODE
  17                                                           /*端口位定义*/
  18          #ifdef IIC_SLOW_MODE    //100K  PIN_SCL=10uS周期
  19                  #define SomeNopForIic()    _nop_();_nop_();_nop_();_nop_()//;_nop_();_nop_();_nop_();_nop_()
  20          #else                                   //400K  PIN_SCL=2.5uS周期
                      #define SomeNopForIic()    _nop_();_nop_();_nop_()//;_nop_();_nop_();_nop_()
              #endif
  23          
  24          /////////////////////////////////////////////
  25          //在主程序中定义            
  26          //sbit PIN_SDA=P3^4;    //模拟I2C数据传送位 890c
  27          //sbit PIN_SCL=P3^5;    //模拟I2C时钟控制位
  28                                             
  29          sbit PIN_SDA=P1^5;      //模拟I2C数据传送位  69x30
  30          sbit PIN_SCL=P1^4;      //模拟I2C时钟控制位
  31          
  32                                                           
  33          bit b_AckForIIC;                 
  34             
  35          
  36          /*******************************************************************
  37                               起动总线函数               
  38          函数原型: void  I2c_Start();  
  39          功能:       启动I2C总线,即发送I2C起始条件.
  40            
  41          ********************************************************************/
  42          void I2c_Start()
  43          {
  44   1        PIN_SDA=1;                            //发送起始条件的数据信号
  45   1        SomeNopForIic();
  46   1        PIN_SCL=1;  
  47   1        SomeNopForIic();      //起始条件建立时间大于4.7us,延时    
  48   1        PIN_SDA=0;                            //发送起始信号
  49   1        SomeNopForIic();      //起始条件锁定时间大于4μs  
  50   1        
  51   1      }
  52          
  53          
  54          /*******************************************************************
  55                                结束总线函数               
C51 COMPILER V7.04   VIIC                                                                  03/05/2006 15:42:57 PAGE 2   

  56          函数原型: void  I2c_Stop();  
  57          功能:       结束I2C总线,即发送I2C结束条件.
  58            
  59          ********************************************************************/
  60          void I2c_Stop()
  61          {
  62   1        PIN_SDA=0;                            //发送结束条件的数据信号
  63   1        SomeNopForIic();      //发送结束条件的时钟信号
  64   1      //  PIN_SDA=0; 
  65   1      //  SomeNopForIic();
  66   1      //  PIN_SDA=0; 
  67   1      //  SomeNopForIic();
  68   1      //  PIN_SDA=0; 
  69   1      //  SomeNopForIic();
  70   1      
  71   1        PIN_SCL=1;                            //结束条件建立时间大于4μs    
  72   1        SomeNopForIic();
  73   1      //  PIN_SCL=1;
  74   1      //  SomeNopForIic();
  75   1      
  76   1      
  77   1        PIN_SDA=1;                            //发送I2C总线结束信号
  78   1        SomeNopForIic();
  79   1      }
  80          
  81          
  82          
  83          
  84          /*******************************************************************
  85                           字节数据传送函数               
  86          函数原型: void  I2c_SendByte(uchar c);
  87          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  88               此状态位进行操作.(不应答或非应答都使b_AckForIIC=0 假)     
  89               发送数据正常,b_AckForIIC=1; b_AckForIIC=0表示被控器无应答或损坏。
  90          ********************************************************************/
  91          void  I2c_SendByte(uchar c)
  92          {
  93   1              uchar BitCnt;
  94   1       
  95   1              PIN_SCL=0;
  96   1              SomeNopForIic();
  97   1      
  98   1              for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
  99   1          {
 100   2              if((c<<BitCnt)&0x80)PIN_SDA=1;   //判断发送位
 101   2              else  PIN_SDA=0;                
 102   2      
 103   2              SomeNopForIic();
 104   2              PIN_SCL=1;                              //置时钟线为高,通知被控器开始接收数据位
 105   2              
 106   2              SomeNopForIic();            //保证时钟高电平周期大于4μs
 107   2            
 108   2              PIN_SCL=0; 
 109   2                      SomeNopForIic(); 
 110   2          }    
 111   1         
 112   1          PIN_SDA=1;                                  //8位发送完后释放数据线,准备接收应答位
 113   1          SomeNopForIic();    
 114   1          PIN_SCL=0;
 115   1      
 116   1          SomeNopForIic();
 117   1              PIN_SCL=1;
C51 COMPILER V7.04   VIIC                                                                  03/05/2006 15:42:57 PAGE 3   

 118   1              SomeNopForIic();
 119   1      
 120   1          if(PIN_SDA==1)b_AckForIIC=0;     
 121   1             else b_AckForIIC=1;              //判断是否接收到应答信号
 122   1          PIN_SCL=0;
 123   1          SomeNopForIic();
 124   1      }
 125          
 126          
 127          
 128          
 129          
 130          
 131          /*******************************************************************
 132                           字节数据传送函数               
 133          函数原型: uchar  I2c_RcvByte();
 134          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 135               发完后请用应答函数。  
 136          ********************************************************************/   
 137          uchar  I2c_RcvByte()
 138          {
 139   1        uchar retc;
 140   1        uchar BitCnt;
 141   1        
 142   1        retc=0; 
 143   1        PIN_SDA=1;                                            //置数据线为输入方式
 144   1        SomeNopForIic();           
 145   1        PIN_SCL=0;                                    //置时钟线为低,准备接收数据位
 146   1        SomeNopForIic();              //时钟低电平周期大于4.7μs
 147   1      
 148   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 149   1        {        
 150   2      
 151   2              PIN_SCL=1;                                      //置时钟线为高使数据线上数据有效                
 152   2              retc=retc<<1;
 153   2      
 154   2              if(PIN_SDA==1)retc=retc+1;              //读数据位,接收的数据位放入retc中 
 155   2              SomeNopForIic();
 156   2      
 157   2                      PIN_SCL=0;  
 158   2                  SomeNopForIic();         
 159   2        }    
 160   1        
 161   1        return(retc);
 162   1      }
 163          
 164          
 165          
 166          
 167          /********************************************************************
 168                               应答子函数
 169          原型:  void I2c_Ack(bit a);
 170           
 171          功能:主控器进行应答信号,(可以是应答或非应答信号)
 172          ********************************************************************/
 173          void I2c_Ack(bit a)
 174          {
 175   1        
 176   1              if(a==0)PIN_SDA=0;      //在此发出应答或非应答信号 
 177   1              else PIN_SDA=1;
 178   1        
 179   1              SomeNopForIic();      
C51 COMPILER V7.04   VIIC                                                                  03/05/2006 15:42:57 PAGE 4   

 180   1              PIN_SCL=0;
 181   1        
 182   1          SomeNopForIic();    //时钟低电平周期大于4μs    
 183   1              PIN_SCL=1;              //清时钟线,钳住I2C总线以便继续接收
 184   1          SomeNopForIic();
 185   1          if(PIN_SDA==1)PIN_SDA=1;
 186   1              SomeNopForIic();      
 187   1              PIN_SCL=0;
 188   1              SomeNopForIic();      
 189   1              PIN_SDA=1;
 190   1              SomeNopForIic();      
 191   1              
 192   1      
 193   1      }
 194          
 195          
 196          /*******************************************************************
 197                              向有子地址器件发送多字节数据函数               
 198          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 199          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 200                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 201                     如果返回1表示操作成功,否则操作有误。
 202          注意:    使用前必须已结束总线。
 203          ********************************************************************/
 204          bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
 205          {
 206   1         uchar i;
 207   1      
 208   1         I2c_Start();                         //启动总线
 209   1         I2c_SendByte(sla);                   //发送器件地址
 210   1      
 211   1              if(b_AckForIIC==0)return(0);
 212   1         I2c_SendByte(suba);                  //发送器件子地址
 213   1          if(b_AckForIIC==0)return(0);
 214   1      
 215   1         for(i=0;i<no;i++)
 216   1         {   
 217   2           I2c_SendByte(*s);              //发送数据
 218   2           if(b_AckForIIC==0)return(0);
 219   2           s++;
 220   2         }
 221   1       
 222   1              I2c_Stop();                     //结束总线 
 223   1              return(1);
 224   1      }
 225          
 226          
 227          /*******************************************************************
 228                              向有子地址器件读取多字节数据函数               
 229          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 230          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 231                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 232                     如果返回1表示操作成功,否则操作有误。
 233          注意:    使用前必须已结束总线。
 234          ********************************************************************/
 235          bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 236          {
 237   1         uchar i;
 238   1      
 239   1         I2c_Start();                     //启动总线
 240   1         I2c_SendByte(sla);                   //发送器件地址
 241   1           if(b_AckForIIC==0)return(0);
C51 COMPILER V7.04   VIIC                                                                  03/05/2006 15:42:57 PAGE 5   

 242   1         I2c_SendByte(suba);                  //发送器件子地址
 243   1           if(b_AckForIIC==0)return(0);
 244   1      
 245   1         I2c_Start();
 246   1         I2c_SendByte(sla+1);
 247   1           if(b_AckForIIC==0)return(0);
 248   1      
 249   1         for(i=0;i<no-1;i++)
 250   1         {   
 251   2           *s=I2c_RcvByte();               //发送数据
 252   2            I2c_Ack(0);                       //发送就答位  
 253   2           s++;
 254   2         } 
 255   1         
 256   1         *s=I2c_RcvByte();
 257   1         I2c_Ack(1);                          //发送非应位
 258   1              
 259   1         I2c_Stop();                          //结束总线 
 260   1         return(1);
 261   1      }
 262          
 263          
 264          


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