IIC總線(xiàn)使用方法
#define uchar unsigned char
uchar a;
sbit sda=P2^0;
sbit scl=P2^1;
void delay1(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y==100;y>0;y--);
}
void delay()//延時(shí)5微秒左右
{ ;; }
void start()//起始函數,scl高電平時(shí)sda下降沿觸發(fā)起始信號
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()//停止信號,scl高電平時(shí)sda下降沿觸發(fā)停止信號
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons()//應答信號
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))//scl=1時(shí)候,判斷sda是否=1。sda=1時(shí),沒(méi)有應答,sda=0時(shí),while內部為假,退出while語(yǔ)句。當sda總=1時(shí),延時(shí)255時(shí)間,如果超出255時(shí)間,則while語(yǔ)句為假。退while循環(huán),默認應答了。
i++;
scl=0;//應答后,將scl變成低電平,因為是第九個(gè)時(shí)鐘信號,時(shí)鐘完了要將電平拉低
delay();//scl=0,持續一會(huì )
}
void init()//初始化函數
{
scl=1;//總線(xiàn)釋放(空閑)是高電平
sda=1;
}
void write_byte(uchar date)//寫(xiě)字節,一位一位的寫(xiě),數據左移一位,一位一位的傳送最高位
{
uchar i,temp;
temp=date;//要寫(xiě)入的值給temp
scl=0;//scl=0時(shí)候數據可以不穩定,隨便變化
delay();
for(i=0;i<8;i++)
{
temp=temp<<1;//temp左移一位,將要最高位放入CY,CY就是PSW.7,來(lái)源于最近一次數據軟件改寫(xiě)的位存儲區
sda=CY;//數據線(xiàn)上的第一幀位為temp的最高位,也就是CY當中的一位,此時(shí)數據在sda中保持穩定的0或1
scl=1;//scl=1準備開(kāi)始傳送數據
delay();//在這個(gè)延時(shí)過(guò)程中將要temp的最高位,CY的值傳送完畢
scl=0;//傳送完畢后scl=0,此時(shí)傳送數據可以不穩定
delay();
}
sda=1;//將總線(xiàn)釋放
delay();
}
uchar read_byte()//讀函數
{
uchar i,j,k;
scl=0;//scl先底電平,準備高電平時(shí)候讀取數據
delay();
sda=1;//釋放數據總線(xiàn),因為此時(shí)不知道sda上是高電平還是低電平
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
j=sda;//將傳輸的數據的第一個(gè)位傳送給j
k=(k<<1)|j;//k是讀出數據,將要k與上j(傳輸的位),傳輸什么得到什么,然后再左移,最終8次后將要一個(gè)字節傳送給k
scl=0;
delay();
}
return k;
}
void main()
{
init();
start();//起始信號
write_byte(0xa0);//寫(xiě)器件地址,首次寫(xiě)從機地址1010 0000,前四位固定,后三位是外接口低電平,最后一位是寫(xiě)的意思
respons();//應答信號,A
write_byte(3);//寫(xiě)入首地址,隨便寫(xiě)個(gè)3
respons();//應答信號,A
write_byte(0x55);//寫(xiě)進(jìn)去一個(gè)數據
respons();//應答信號
stop();//結束信號,寫(xiě)入完畢
delay1(200);
start();//準備讀出的開(kāi)始信號
write_byte(0xa0);//首先寫(xiě)進(jìn)去器件地址
respons();//應答信號,A
write_byte(3);//寫(xiě)入器件首地址
respons();//應答信號,A
start();
write_byte(0xa1);//準備讀出數據,給器件地址1010 0001的意思是要讀出數據
respons();//應答信號,A
a=read_byte();
stop();
P1=a;
while(1);
}
評論