/* 用io口模拟i2c 子程序
51 单片机
Inter IC Bus
frequency="12Mhz",T=1us
*************************************************************/
void sta(void)
{SDA=1;
_nop_();
SCL="1";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA="0";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL="0";
_nop_();
_nop_();
}
//******************************
void stop(void)
{
SDA="0";
_nop_();
SCL="1";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA="1";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL="1";
}
//****************************
void mack(void)
{SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL="1";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL="0";
_nop_();
SDA="1";
}
//***************************** 非应答信号
void mnack(void)
{SDA=1;
_nop_();
SCL="1";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL="0";
_nop_();
SDA="0";
}
//******************************* 检查是否有应答信号,有i2c_flag=1,否i2c_flag=0;
cack(void)
{uchar i2c_flag=0;
SDA="1";
SCL="1";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if (SDA==1)
{i2c_flag=1;}
SCL="0";
}
//****************************读一字节,返回一字节。
uchar rdbyt(void)
{uchar i2c_r0=8,i2c_w=0;
do{ SDA="1";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL="1";
_nop_();
_nop_();
if (SDA)
{i2c_w<<=1;
i2c_w++;
}
else
{i2c_w<<=1;
}
SCL="0";
i2c_r0--;
}while(i2c_r0!=0);
SCL="0";
_nop_();
_nop_();
return(i2c_w);
}
//******************************************
void wrbyt(uchar w)
{uchar i;
i="0x08";
do{ SCL="0";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
// SDA= (bit)(w&0x80);
if((w&0x80)==0x80)/* 如果最高位是1*/
{SDA=1;
}
else
{SDA=0;
}
w="w"<<1;
_nop_();
SCL="1";
_nop_();
_nop_();
_nop_();
_nop_();
SCL="0";
i--;
}while(i!=0);
}
//****************************************************
文章评论(0条评论)
登录后参与讨论