單片機(jī)I2C驅(qū)動(dòng)程序
void delay()
{; ;}
void delay1ms ( uint z )
{
uint x, y;
for ( x = z; x > 0; x -- )
for ( y = 110; y > 0; y -- );
}
I2C啟動(dòng):在SCL為高電平期間,SDA出現(xiàn)下降沿
void start_I2C ( ) /
{
sda = 1;
delay ();
scl= 1;
delay ();
sda = 0;
delay ();
}
I2C停止:在SCL高電平期間,SDA上產(chǎn)生一上升沿
void stop_I2C () //停止
{
sda = 0;
delay ();
scl = 1;
delay ();
sda = 1;
delay ();
}
總線初始化:將總線拉高以釋放總線
void init_I2C ()
{
sda = 1;
delay ();
scl = 1;
delay ();
}
應(yīng)答信號(hào):在SCL高電平期間,SDA被從設(shè)備拉低表示應(yīng)答
void response ()//應(yīng)答
{
uchar i;
scl = 1;
delay ();
while ( ( sda == 1 ) && ( i < 250 ) ) i ++; // i < 255這里只是表示沒有應(yīng)答時(shí),若i > 255就直接退出,才不至于死循環(huán)。
scl = 0;
delay ();
}
寫一個(gè)字節(jié):只有在SCL低電平期間,SDA上的高電平或低電平才可以變化
void write_byte ( uchar date )
{
uchar i, temp;
temp = date;
for ( i = 0; i < 8; i ++ )
{
temp = temp << 1; //將最高位移入CY里面
scl = 0;
delay ();
sda = CY;
delay ();
scl = 1;
delay ();
}
scl = 0;
delay ();
sda = 1;
delay ();
}
讀一個(gè)字節(jié):
uchar read_byte ()
{
uchar i, k;
scl = 0;
delay ();
sda = 1;
delay ();
for ( i = 0; i < 8; i ++ )
{
scl = 1;
delay ();
k = ( k << 1 ) " sda; //也是從最高位開始讀
scl = 0;
delay ();
}
return k;
}