赞助论坛
  • 3180阅读
  • 0回复

好用的IIC头文件 [复制链接]

楼层直达
wewi  
发帖
7
精华
0
金币
13
威望
0
贡献
0
好评
0
注册
2009-12-14
楼主    wewi 发表于: 2009-12-15 11:19:25 
#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