#ifndef __I2C_H__
#define __I2C_H__
#define I2C_SCL_0 I2C_SCL = 0
#define I2C_SCL_1 I2C_SCL = 1
#define I2C_SDA_0 I2C_SDA = 0
#define I2C_SDA_1 I2C_SDA = 1
//********************管脚定义***********************************
sbit I2C_SCL = P3^6; // I2C总线的时钟信号
sbit I2C_SDA = P3^7; // I2C总线的数据信号
//***************************************************************
#define TRUE 1
#define FALSE 0
#define I2C_DelayTime 60 // 不要小于50,否则可能造成时序混乱
//***********************************************************************
// 函数名称:I2C_Delay()
// 功 能:I2C总线软件延时
// 入口参数:count 延时参数,值越大,延时越长
// 出口参数:无
//***********************************************************************
void I2C_Delay(unsigned char t)
{
while( t** );
}
//***********************************************************************
// 函数名称:I2C_Start()
// 功 能:启动I2C总线
// 入口参数:无
// 出口参数:无
//***********************************************************************
void I2C_Start(void)
{
I2C_SDA_1;
I2C_SCL_1;
I2C_Delay(I2C_DelayTime);
I2C_SDA_0;
I2C_Delay(I2C_DelayTime);
I2C_SCL_0;
I2C_Delay(I2C_DelayTime);
}
//***********************************************************************
// 函数名称:I2C_Stop()
// 功 能:终止I2C总线
// 入口参数:无
// 出口参数:无
//***********************************************************************
void I2C_Stop(void)
{
I2C_SDA_0;
I2C_SCL_1;
I2C_Delay(I2C_DelayTime);
I2C_SDA_1;
I2C_Delay(I2C_DelayTime);
I2C_SCL_0;
I2C_Delay(I2C_DelayTime);
}
//***********************************************************************
// 函数名称:I2C_Send_Bit_0()
// 功 能:发送比特0
// 入口参数:无
// 出口参数:无
//***********************************************************************
void I2C_Send_Bit_0(void)
{
I2C_SDA_0;
I2C_SCL_1;
I2C_Delay(I2C_DelayTime);
I2C_SCL_0;
I2C_Delay(I2C_DelayTime);
}
//***********************************************************************
// 函数名称:I2C_Send_Bit_1()
// 功 能:发送比特1
// 入口参数:无
// 出口参数:无
//***********************************************************************
void I2C_Send_Bit_1(void)
{
I2C_SDA_1;
I2C_SCL_1;
I2C_Delay(I2C_DelayTime);
I2C_SCL_0;
I2C_Delay(I2C_DelayTime);
}
//***********************************************************************
// 函数名称:I2C_Check_Ack()
// 功 能:发送完一个字节后检验设备的应答信号
// 入口参数:无
// 出口参数:返回值为True,成功
// 返回值为False,失败
//***********************************************************************
unsigned char I2C_Check_Ack(void)
{
I2C_SDA_1;
I2C_SCL_1;
I2C_Delay(30);
F0 = I2C_SDA;
I2C_Delay(30);
I2C_SCL_0;
I2C_Delay(60);
if( F0 == 1 ) return FALSE;
else return TRUE;
}
//***********************************************************************
// 函数名称:I2C_Write8Bit()
// 功 能:向I2C总线写入8bit数据
// 入口参数:I2C_data 将要写入I2C总线的8bit数据
// 出口参数:无
//***********************************************************************
void I2C_Write8Bit(unsigned char I2C_data) reentrant
{
unsigned char i;
for(i = 0;i < 8;i ++)
{
if( (I2C_data << i) & 0x80 )
I2C_Send_Bit_1();
else
I2C_Send_Bit_0();
}
}
//***********************************************************************
// 函数名称:I2C_Read8Bit()
// 功 能:从I2C总线接收8bit数据
// 入口参数:无
// 出口参数:返回值为从I2C总线上接收到的8bit数据
//***********************************************************************
unsigned char I2C_Read8Bit(void) reentrant
{
unsigned I2C_data = 0,i;
for( i = 0; i < 8; i++ )
{
I2C_SDA_1;
I2C_SCL_1;
I2C_Delay(10);
F0 = I2C_SDA;
I2C_Delay(10);
I2C_SCL_0;
if( F0 == 1 )
{
I2C_data = I2C_data << 1;
I2C_data = I2C_data | 0x01;
}
else
I2C_data = I2C_data << 1;
}
return I2C_data;
}
#endif