|
关键字:430 IIC(I2C)模拟驱动程序,如何模拟IIC驱动,I2C模拟组件
#include
//作者:代码客(卢益贵) QQ:48092788
#define SCL 0x04 /* P2.1 */
#define SDA 0x02 /* P2.2 */
#define ADDR_I2CWRITE 0x64
#define ADDR_I2CREAD 0X65
#define ADDR_I2CSECOND 0X00
void InitCLK(void)
{
P2SEL &= ~(SCL | SDA);
P2DIR |= SCL;
P2DIR &= ~SDA;
P2OUT |= SCL;
CLKInit();
}
void Delay(unsigned char bLong)
{
while(bLong)
bLong--;
}
void I2CStart( void )
{
Delay( 0 );
P2OUT |= SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2OUT &=~ SDA;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
}
void I2CStop( void )
{
Delay( 0 );
P2OUT &=~ SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2OUT |= SDA;
Delay( 0 );
}
void I2CAck( void )
{
Delay( 0 );
P2OUT &=~ SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
}
void I2CNoAck( void )
{
Delay( 0 );
P2OUT |= SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
}
void I2CTestAck( void )
{
Delay( 0 );
P2DIR &=~SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2DIR |=SDA;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
}
void I2CWrite( unsigned char Data )
{
auto unsigned char i;
for( i = 8 ; i != 0 ; i--)
{
if ( Data & 0x80 )
P2OUT |= SDA;
else
P2OUT &=~ SDA;
P2OUT |= SCL;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
Data = Data << 1;
}
}
unsigned char I2CRead( void )
{
auto unsigned char i , Result = 0;
P2DIR &=~SDA;
for( i = 8 ; i != 0 ; i-- )
{
P2OUT |= SCL;
Result = Result << 1;
Delay( 0 );
if ( ( P2IN & SDA ) == SDA )
Result = Result | 0X01;
P2OUT &=~ SCL;
Delay( 0 );
}
P2DIR |= SDA;
return( Result );
}
本文来自eeworld博客,转载请标明出处:http://blog.eeworld.net/GuestCode/archive/2009/08/05/4411671.aspx
|
|