[an error occurred while processing this directive]
|
data TByte _Dat;
bit _Ack;#define SDA0 P0.0=0;
#define SDA1 P0.0=1;
#define sSDA(v) P0.0=(v);
#define SCL0 P0.1=0;
#define SCL1 P0.1=1;
#define gSDA ( P0.0 )
#define gSCL ( P0.1 )void i2c_delay() { data TByte _cc;
for (_cc=3; _cc--;); }#define i2cInit { SDA1; SCL1; }
#define SetC0 { SCL0; i2c_delay(); }
#define SetC1 { SCL1; while (!gSCL); i2c_delay(); }
#define SetD0 { SDA0; i2c_delay(); }
#define SetD1 { SDA1; i2c_delay(); }
#define SetD(v) { sSDA(v); i2c_delay(); }#define Start { SetD1; SetC1; SetD0; SetC0; }
#define Stop { SetC0; SetD0; SetC1; SetD1; }
#define Out(v) { SetD(v); SetC1; SetC0; }
#define In(v) { SetC1; v=gSDA; SetC0; }
void dOut() { B=_Dat;
Out(B.7); Out(B.6); Out(B.5); Out(B.4);
Out(B.3); Out(B.2); Out(B.1); Out(B.0);
SetD1; In(_Ack);
}
void dIn() { SetD1;
In(B.7); In(B.6); In(B.5); In(B.4);
In(B.3); In(B.2); In(B.1); In(B.0);
_Dat=B; Out(_Ack);
}void ic_Work (bit ToStart,
bit ToPut,
bit ToStop)
{
if (ToStart) { i2cInit; Start; }
if (ToPut) dOut(); else dIn();
if (ToStop) { Stop; i2cInit; }
}bit ic_Put (data TByte aDat,
bit ToStart,
bit ToStop)
{
_Dat=aDat; ic_Work (ToStart, 1, ToStop); return (!_Ack);
}TByte ic_Get (bit Last)
{
_Ack=Last; ic_Work (0, 0, _Ack); return (_Dat);
}
E-mail: info@telesys.ru