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

📄 z_i2c.lst

📁 基于i2c总线控制的24c32C程序读写
💻 LST
📖 第 1 页 / 共 2 页
字号:
 173   1               return(recdata);
 174   1       }
 175          /*******************************************************
 176          应答子函数
 177          函数原形:void ack_i2c(bit a);
 178          功能:主控器进行应答信号,可以是应答或非应答信号。
 179          参数:a应答信号
C51 COMPILER V8.02   Z_I2C                                                                 08/07/2008 09:21:33 PAGE 4   

 180          返回值:无
 181          ********************************************************/
 182          void ack_i2c(bit a)
 183          { if(a==0)
 184   1                SDA=0;
 185   1        else    SDA=1;
 186   1          _Nop();
 187   1          _Nop();
 188   1          _Nop();
 189   1          _Nop();
 190   1             SCL=1;
 191   1          wait();
 192   1             SCL=0; // 清除时钟线,以便继续接收
 193   1          _Nop();
 194   1          _Nop();
 195   1          _Nop();
 196   1          _Nop();
 197   1       }
 198          /**********************************************************************************
 199           向有子地址器件发送多字节数据函数
 200           函数原形:
 201           bit  sendstr(uchar subaddress1,uchar subaddress2,uchar *source,uchar num);
 202           功能:
 203           从启动总线到发送地址,子地址,结束总线的过程
 204           参数:
 205           subaddress1:子地址1
 206           subaddress2:子地址2
 207           source:发送内容的指针
 208           num:发送字节个数
 209           返回值: 
 210           如果返回1,表示操作成功;否则操作有误
 211           注意:使用前必须已结束总线
 212          /**********************************************************************************/
 213           bit  sendstr(uchar subaddress1,uchar subaddress2,uchar *source,uchar num)
 214           { 
 215   1         uchar i;
 216   1         start_I2C();                              //启动总线
 217   1         sendbyte(ADDRWR);                          //发送器件地址
 218   1         if(ack==0)  return(0);
 219   1         sendbyte(subaddress1);                     //发送器件高子地址    
 220   1         if(ack==0)  return(0);
 221   1         sendbyte(subaddress2);                     //发送器件低子地址    
 222   1         if(ack==0)  return(0);
 223   1         for(i=0;i<num;i++)
 224   1         {
 225   2           sendbyte(*source);                       //发送数据
 226   2           if(ack==0) return(0);
 227   2           source++;
 228   2               }
 229   1         stop_I2C();                                //结束总线
 230   1         return(1);                         
 231   1       }
 232          /**********************************************************************************
 233           向有子地址器件读多字节数据函数
 234           函数原形:
 235           bit  recstr(uchar subaddress1,uchar subaddress2,uchar *source,uchar num);
 236           功能:
 237           从启动总线到发送地址,子地址,读数据,结束总线的过程
 238           参数:
 239           subaddress1:子地址1,subaddress2:子地址2,source:指向读出的内容放入的存储区的指针,num:读字节个数
 240           返回值: 
 241           如果返回1,表示操作成功;否则操作有误
C51 COMPILER V8.02   Z_I2C                                                                 08/07/2008 09:21:33 PAGE 5   

 242           注意:使用前必须已结束总线
 243          **********************************************************************************/
 244          /*bit  recstr(uchar subaddress1,uchar subaddress2,uchar *source,uchar num)
 245          {   uchar i;                                         
 246                  start_I2C();                      // 启动总线
 247                  sendbyte(ADDRWR);                  //发送器件地址—写
 248                  if(ack==0)return(0);
 249                  sendbyte(subaddress1);          //发送器件高子地址
 250                  if(ack==0)return(0); 
 251                  sendbyte(subaddress2);           //发送器件低子地址
 252                  if(ack==0)return(0);
 253                  start_I2C();                      // 再次启动总线
 254                  sendbyte(ADDRRD);                  //再次发送器件地址—读
 255                  if(ack==0)return(0);
 256              for(i=0;i<num-1;i++)        
 257                    {*source=recbyte();             //接收数据
 258                      ack_i2c(0);                    //发应答位
 259                      source++;
 260                    }
 261                     ack_i2c(1);                    //发非应答位
 262                     stop_I2C();                    //结束总线
 263                 return(1);
 264            }*/
 265          /**********************************************************************************
 266           向有子地址器件读多字节数据函数
 267           函数原形:
 268           bit  recstr(uchar subaddress1,uchar subaddress2,uchar *source,uchar num);
 269           功能:
 270           从启动总线到发送地址,子地址,读数据,结束总线的过程
 271           参数:
 272           subaddress1:子地址1,subaddress2:子地址2,source:指向读出的内容放入的存储区的指针,num:读字节个数
 273           返回值: 
 274           如果返回1,表示操作成功;否则操作有误
 275           注意:使用前必须已结束总线
 276          **********************************************************************************/
 277          bit  recstr(uchar subaddress1,uchar subaddress2)
 278          {                                            
 279   1              start_I2C();                        // 启动总线
 280   1              sendbyte(ADDRWR);                   //发送器件地址—写
 281   1              if(ack==0)return(0);
 282   1              sendbyte(subaddress1);              //发送器件高子地址
 283   1              if(ack==0)return(0); 
 284   1              sendbyte(subaddress2);             //发送器件低子地址
 285   1              if(ack==0)return(0);
 286   1              start_I2C();                       // 再次启动总线
 287   1              sendbyte(ADDRRD);                  //再次发送器件地址—读
 288   1              if(ack==0)return(0);
 289   1              Rshu=recbyte();                    //接收数据
 290   1                 ack_i2c(1);                     //发非应答位
 291   1                 stop_I2C();                     //结束总线
 292   1             return(1);
 293   1        }
 294            void main()
 295            {   
 296   1            uchar *Point1,*Point2;           
 297   1                uchar ADDRWR=0xa0,ADDRRD=0xa1;
 298   1            Point1=Wshujiu; 
 299   1                Point2=Rshujiu;
 300   1                SDA=0;
 301   1            SCL=0;
 302   1                WP=0;
 303   1                _Nop();
C51 COMPILER V8.02   Z_I2C                                                                 08/07/2008 09:21:33 PAGE 6   

 304   1                //sendstr(0x00,0x00,Point1,1);
 305   1            //recstr (0x00,0x00);
 306   1              while(1) 
 307   1              { 
 308   2            sendstr(0x00,0xee,Point1,1);
 309   2                delay (200);
 310   2            recstr (0x00,0xee);                                                                       
 311   2                P0=Rshu;
 312   2                delay (100);
 313   2               }
 314   1        }
 315          
 316          
 317          
 318          
 319          
 320          
 321          
 322          
 323          
 324          
 325          
 326          
 327          
 328          
 329          
 330          
 331          
 332          
 333          
 334          
 335          
 336          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    380    ----
   CONSTANT SIZE    =      2    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3      14
   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 + -