/*VIICC.H*/ #pragma db cd small #include #include #define NOP nop ( ); nop ( ); nop ( ); nop ( ) #define SDA P1^7 #define SCL P1^6 void sta( ); void cack( ); void stop( ); void mnack( ); void mack( ); void wrbyt(uchar shu); void wrnbyta(uchar slaw,uchar gg[],uchar n); void wrnbyt(uchar slaw,uchar ff[],uchar number); uchar rdbyt( ); void rdnbyt(uchar slar,uchar qq[],uchar number); 源程序由9个函数组成,程序清单如下: voidsta( )/*启动I2C总线*/ { SDA=1; SCL=1; NOP; SDA=0; NOP; SCL=0; } void stop( )/*停止I2C总线 */ { SDA=0; SCL=1; NOP; SDA=1; NOP; SCL=0; } void mack( )/*发送应答位*/ { SDA=0; SCL=1; NOP; SCL=0; SDA=1; } void mnack( )/*发送非应答位*/ { SDA=1; SCL=1; NOP; SCL=0; SDA=0; } void cack( )/*应答位检查*/ { SDA=1; SCL=1; F0=0; if(SDA==1) F0=1; SCL=0; nop( ); } /*向虚拟I2C总线上发送1个数据字节*/ void wrbyt(uchar shu) { uchar i; for(i=0;i<8;i++){ if((shu&0x80)>0){ SDA=1; SCL=1; NOP; SCL=0; SDA=0; } else{ SDA=0; SCL=1; NOP; SCL=0; } shu=shu<<1; } } /*从I2C总线上读取1个数据字节*/ uchar rdbyt( ) { uchar nn=0xff,mm=0x80,uu=0x7f; uchar j; for(j=0;j<8;j++){ SDA=1; SCL=1; if(SDA==0) nn=(nn&uu); else nn=(nn|mm);。 nn=crol(nn,1); SCL=0; } return(nn); } void wrnbyta(uchar slaw,uchar gg[],uchar n) { do{ sta( ); wrbyt(slaw); cack( ); }while(F0==1); wrbyt(gg[n]); cack( ); } /*向虚拟I2C总线上发送n个字节的数据*/ void wrnbyt(uchar slaw,uchar ff[],uchar number) { uchar idata k; do{ sta( ); wrbyt(slaw); ?cack( ); }while(F0==1); for(k=0;k