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

📄 viic_c51.lst

📁 此程序是I2C操作平台的底层的C子程序,如发送数据及接收数据,应答位发送。E2PROM的读写程序。
💻 LST
📖 第 1 页 / 共 2 页
字号:
 174   2              _Nop();
 175   2              retc=retc<<1;
 176   2              if(SDA==1)retc=retc+1;     /*读数据位,接收的数据位放入retc中 */
 177   2              _Nop();
 178   2              _Nop(); 
 179   2            }
C51 COMPILER V7.50   VIIC_C51                                                              03/23/2009 22:19:43 PAGE 4   

 180   1        SCL=0;    
 181   1        _Nop();
 182   1        _Nop();
 183   1        return(retc);
 184   1      }
 185          
 186          
 187          
 188          
 189          /********************************************************************
 190                               应答子函数
 191          原型:  void Ack_I2c(bit a);
 192           
 193          功能:主控器进行应答信号,(可以是应答或非应答信号)
 194          ********************************************************************/
 195          void Ack_I2c(bit a)
 196          {
 197   1        
 198   1        if(a==0)SDA=0;                 /*在此发出应答或非应答信号 */
 199   1              else SDA=1;
 200   1        _Nop();
 201   1        _Nop();
 202   1        _Nop();      
 203   1        SCL=1;
 204   1          _Nop();
 205   1          _Nop();                      /*时钟低电平周期大于4μs*/
 206   1          _Nop();
 207   1          _Nop();
 208   1          _Nop();  
 209   1       SCL=0;                          /*清时钟线,钳住I2C总线以便继续接收*/
 210   1          _Nop();
 211   1          _Nop();    
 212   1      }
 213          
 214          
 215          
 216          
 217          
 218          
 219          /*******************************************************************
 220                              向无子地址器件发送字节数据函数               
 221          函数原型: bit  ISendByte(uchar sla,ucahr c);  
 222          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 223                     如果返回1表示操作成功,否则操作有误。
 224          注意:    使用前必须已结束总线。
 225          ********************************************************************/
 226          bit ISendByte(uchar sla,uchar c)
 227          {
 228   1         Start_I2c();                 /*启动总线*/
 229   1         SendByte(sla);               /*发送器件地址*/
 230   1           if(ack==0)return(0);
 231   1         SendByte(c);                 /*发送数据*/
 232   1           if(ack==0)return(0);
 233   1        Stop_I2c();                   /*结束总线*/ 
 234   1        return(1);
 235   1      }
 236          
 237          
 238          
 239          
 240          /*******************************************************************
 241                              向有子地址器件发送多字节数据函数               
C51 COMPILER V7.50   VIIC_C51                                                              03/23/2009 22:19:43 PAGE 5   

 242          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 243          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 244                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 245                     如果返回1表示操作成功,否则操作有误。
 246          注意:    使用前必须已结束总线。
 247          ********************************************************************/
 248          bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
 249          {
 250   1         uchar i;
 251   1      
 252   1         Start_I2c();               /*启动总线*/
 253   1         SendByte(sla);             /*发送器件地址*/
 254   1           if(ack==0)return(0);
 255   1         SendByte(suba);            /*发送器件子地址*/
 256   1           if(ack==0)return(0);
 257   1      
 258   1         for(i=0;i<no;i++)
 259   1          {   
 260   2           SendByte(*s);            /*发送数据*/
 261   2             if(ack==0)return(0);
 262   2           s++;
 263   2          } 
 264   1       Stop_I2c();                  /*结束总线*/ 
 265   1        return(1);
 266   1      }
 267          
 268          
 269          
 270          
 271          
 272          
 273          /*******************************************************************
 274                              向无子地址器件读字节数据函数               
 275          函数原型: bit  IRcvByte(uchar sla,ucahr *c);  
 276          功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
 277                    址sla,返回值在c.
 278                     如果返回1表示操作成功,否则操作有误。
 279          注意:    使用前必须已结束总线。
 280          ********************************************************************/
 281          bit IRcvByte(uchar sla,uchar *c)
 282          {
 283   1         Start_I2c();                /*启动总线*/
 284   1         SendByte(sla+1);            /*发送器件地址*/
 285   1           if(ack==0)return(0);
 286   1         *c=RcvByte();               /*读取数据*/
 287   1           Ack_I2c(1);               /*发送非就答位*/
 288   1        Stop_I2c();                  /*结束总线*/ 
 289   1        return(1);
 290   1      }
 291          
 292          
 293          
 294          /*******************************************************************
 295                              向有子地址器件读取多字节数据函数               
 296          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 297          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 298                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 299                     如果返回1表示操作成功,否则操作有误。
 300          注意:    使用前必须已结束总线。
 301          ********************************************************************/
 302          bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 303          {
C51 COMPILER V7.50   VIIC_C51                                                              03/23/2009 22:19:43 PAGE 6   

 304   1         uchar i;
 305   1      
 306   1         Start_I2c();               /*启动总线*/
 307   1         SendByte(sla);             /*发送器件地址*/
 308   1           if(ack==0)return(0);
 309   1         SendByte(suba);            /*发送器件子地址*/
 310   1           if(ack==0)return(0);
 311   1      
 312   1         Start_I2c();
 313   1         SendByte(sla+1);
 314   1            if(ack==0)return(0);
 315   1      
 316   1         for(i=0;i<no-1;i++)
 317   1          {   
 318   2           *s=RcvByte();            /*发送数据*/
 319   2            Ack_I2c(0);             /*发送就答位*/  
 320   2           s++;
 321   2          } 
 322   1         *s=RcvByte();
 323   1          Ack_I2c(1);               /*发送非应位*/
 324   1       Stop_I2c();                  /*结束总线*/ 
 325   1        return(1);
 326   1      }
 327          
 328          
 329          
 330          
 331          
 332          
 333                                  /*    完毕      */
 334          
 335          
 336          
 337          


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