模拟IIC通讯
//__delay_us __delay_ms使用的是单片机自带的延迟
//模拟IIC必须带延迟否则无法正常工作
void BS8116A_Start()
{
BS_SDA_SetHigh();
BS_SCL_SetHigh();
__delay_us(5);
BS_SDA_SetLow();
__delay_us(5);
// Delay_5_us(1);
BS_SCL_SetLow();
}
void BS8116A_Stop()
{
BS_SDA_SetLow();
BS_SCL_SetHigh();
__delay_us(5);
BS_SDA_SetHigh();
BS_SCL_SetLow();
__delay_us(5);
}
//0---ACK,1---NACK
void BS8116A_SendACK()
{
BS_SDA_SetLow();
BS_SCL_SetHigh();
__delay_us(5);
BS_SCL_SetLow();
__delay_us(5);
}
void BS8116A_SendNACK()
{
BS_SDA_SetHigh();
BS_SCL_SetHigh();
__delay_us(5);
BS_SCL_SetLow();
__delay_us(5);
}
void BS8116A_SendByte(unsigned char dat)
{
unsigned int i;
BS_SCL_SetLow(); //时钟无效
for(i = 0; i < 8; i++) //写8位字节数据
{
if((dat & 0x80) == 0x80) //读最高位数据
{
BS_SDA_SetHigh();
}
else
{
BS_SDA_SetLow();
}
BS_SCL_SetHigh(); //时钟有效
dat <<= 1; //数据左移一位
__delay_us(5);
BS_SCL_SetLow();
}
BS_SDA_SetDigitalInput(); //数据线设置为输入模式
BS_SDA_SetHigh(); //拉高数据线
__delay_us(5);
BS_SCL_SetHigh(); //时钟有效
__delay_us(5);
BS_SCL_SetLow();
BS_SDA_SetDigitalOutput(); //数据线设置回输出模式
}
unsigned char BS8116A_RecvByte()
{
unsigned char i,data=0;
BS_SDA_SetDigitalInput(); //数据线设置为输入模式
BS_SDA_SetHigh(); //数据线拉高
BS_SCL_SetLow();
for(i = 0; i < 8; i++) //读8位数据
{
BS_SCL_SetHigh();
data <<= 1;
data |= BS_SDA_PORT;
BS_SCL_SetLow();
__delay_us(5);
}
BS_SDA