I2C總線AT24C02芯片應(yīng)用
code:
本文引用地址:http://www.ex-cimer.com/article/201612/324161.htm
/*
通訊中 SDA 口通訊雙方都可為輸出,如果一方輸出低,
另一方則如果輸出高也不能使SDA為高,相當(dāng)于,輸出低的一方占住了SDA口。
兩個口,一個出高一個出低,則線上電平是低的。
這是由于,出高的驅(qū)動能力不及出低拉電流的能力。
所以SDA=1為釋放數(shù)據(jù)線
*/
#include
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
void delay()//執(zhí)行空語句,微秒級延時函數(shù)
{;;}
void delay1ms(uint z)//延時1ms
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<=110;y++)
{
}
}
}
void init()//初始化狀態(tài)下SCL和SDA都為高電平
{
scl=1;
delay();
sda=1;
delay();
}
void start()//在SCL為高電平時SDA由高電平到低電平
{
sda=1;
delay();
scl=1;
delay();
sda=0;
}
void respons()
/*
應(yīng)答信號,SCL在高電平期間,SDA被從設(shè)備拉為低電平表示應(yīng)答。
(sda==1)和i<255相與,表示若在一段時間內(nèi)沒有從器件的應(yīng)答則主器件
默認從器件已經(jīng)收到數(shù)據(jù)而不再等待應(yīng)答信號
*/
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))
{
i++;
}
scl=0;
delay();
}
void stop()//SCL在高電平期間,SDA一個上升沿停止信號
{
sda=0;
delay();
scl=1;
delay();
sda=1;
}
void write_byte(uchar date)//寫一個字節(jié)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;//只有在SCL為0期間才允許SDA數(shù)據(jù)線上的狀態(tài)才允許變化
delay();
sda=CY;//PSW的寄存器的CY進位標志位
delay();
scl=1; //SCL時鐘信號為高電平期間數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定
delay();
}
scl=0;
delay();
sda=1;//釋放總線
delay();
}
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();
}
//delay();here is a bug
return k;
}
評論