|
I2C總線C語言源程序是什么? |
|
|
/*VIICC.H*/ #pragma db cd small #include <intrins.h> #include <reg52.h> #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個函數(shù)組成,程序清單如下: 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( )/*發(fā)送應(yīng)答位*/ { SDA=0; SCL=1; NOP; SCL=0; SDA=1; }
void mnack( )/*發(fā)送非應(yīng)答位*/ { SDA=1; SCL=1; NOP; SCL=0; SDA=0; }
void cack( )/*應(yīng)答位檢查*/ { SDA=1; SCL=1; F0=0; if(SDA==1) F0=1; SCL=0; nop( ); } /*向虛擬I2C總線上發(fā)送1個數(shù)據(jù)字節(jié)*/ 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個數(shù)據(jù)字節(jié)*/ 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總線上發(fā)送n個字節(jié)的數(shù)據(jù)*/ void wrnbyt(uchar slaw,uchar ff[],uchar number) { uchar idata k; do{ sta( ); wrbyt(slaw); ?cack( ); }while(F0==1); for(k=0;k<number;k++){。 wrbyt(ff[k]); cack( ); while(F0==1) wrnbyta(slaw,ff,k); } stop( ); } /*從虛擬I2C總線上讀取n個字節(jié)的數(shù)據(jù)*/ void rdnbyt(uchar slar,uchar qq[],uchar number) { uchar idata data0,l; do{ sta( ); wrbyt(slar); cack( ); }while(F0==1);? for(l=0;l<number-1;l++){ data0=rdbyt( ); qq[l]=data0; mack( ); } data0=rdbyt( ); qq[l]=data0; mnack( ); stop( ); }

|
|
|