data unsigned char elech;
data unsigned char elecl;
data unsigned char mcp_busy;
//data unsigned char wr_data;
bit mcp_wrong;
sbit SDA=P0^1;
sbit SCL=P0^0;
#define somenop() do{nop;nop;nop;nop;}while(0);
#define true 1
#define flase 0
#define byte unsigned char
void I2CStart(void)
{
EA=0;
SDA=1;
somenop()
SCL=1;
somenop();
SDA=0;
somenop();
SCL=0;
}
void I2CStop(void)
{
SCL=0;
somenop()
SDA=0;
somenop();
SCL=1;
somenop();
SDA=1;
EA=1;
}
void WaitAck(void)
{
unsigned char i=20;
SDA=1;
somenop();
SCL=1;
while(i--){
if(SDA==1)
{
SCL=0;
somenop();
SCL=1;
}
else
goto loop;
}
loop:
SCL=0;
return;
}
void SendAck(void)
{
SDA=0;
somenop();
SCL=1;
somenop();
SCL=0;
}
void SendNotAck(void)
{
SDA=1;
somenop();
SCL=1;
somenop();
SCL=0;
}
void I2CSendbyte(byte ch)
{
unsigned char i=8;
while(i--)
{
SCL=0;
somenop();
SDA=(bit)(ch&0x80);
ch<<=1;
somenop();
SCL=1;
somenop();
}
SCL=0;
}
byte I2CRecebyte(void)
{
unsigned char i=8;
byte ddata=0;
SDA=1;
while(i--){
ddata<<=1;
SCL=0;
somenop();
SCL=1;
somenop();
ddata|=SDA;
}
SCL=0;
return ddata;
}
void WRITE_MCP3421(unsigned char wr_data)
{
I2CStart();
I2CSendbyte(0xd0);
WaitAck();
I2CSendbyte(wr_data);
WaitAck();
I2CStop();
}
void READ_MCP3421(void)
{
I2CStart();
I2CSendbyte(0xd1);
WaitAck();
elech=I2CRecebyte();
SendAck();
elecl=I2CRecebyte();
SendAck();
mcp_busy=I2CRecebyte();
SendNotAck();
I2CStop();
}
/******************************************************************************/
评论1