I2C總線C語言源程序
#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個函數(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 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 data0=rdbyt( );
qq[l]=data0;
mack( );
}
data0=rdbyt( );
qq[l]=data0;
mnack( );
stop( );
}
#include
#include
#define
#define
#define
void
void
void
void
void
void
void
void
uchar
void
源程序由9個函數(shù)組成,程序清單如下:
voidsta(
{
SDA=1;
SCL=1;
NOP;
SDA=0;
NOP;
SCL=0;
}
void
*/
{
SDA=0;
SCL=1;
NOP;
SDA=1;
NOP;
SCL=0;
}
void
{
SDA=0;
SCL=1;
NOP;
SCL=0;
SDA=1;
}
void
{
SDA=1;
SCL=1;
NOP;
SCL=0;
SDA=0;
}
void
{
SDA=1;
SCL=1;
F0=0;
if(SDA==1)
F0=1;
SCL=0;
nop(
}
/*向虛擬I2C總線上發(fā)送1個數(shù)據(jù)字節(jié)*/
void
{
uchar
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
{
uchar
uchar
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
{
do{
sta(
wrbyt(slaw);
cack(
}while(F0==1);
wrbyt(gg[n]);
cack(
}
/*向虛擬I2C總線上發(fā)送n個字節(jié)的數(shù)據(jù)*/
void
{
uchar
do{
sta(
wrbyt(slaw);
?cack(
}while(F0==1);
for(k=0;k
cack(
while(F0==1)
wrnbyta(slaw,ff,k);
}
stop(
}
/*從虛擬I2C總線上讀取n個字節(jié)的數(shù)據(jù)*/
void
{
uchar
do{
sta(
wrbyt(slar);
cack(
}while(F0==1);?
for(l=0;l
qq[l]=data0;
mack(
}
data0=rdbyt(
qq[l]=data0;
mnack(
stop(
}
評論