?? i2c.c
字號:
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define x 1
#if (x > 0)
#define y 1
#else
#define y 4
#endif
sbit scl=P1^0;
sbit sda=P1^1;
unsigned char AD,AD1,AD2,AD3;
void delay1(uchar count)
{
uchar i,j;
for(i=count;i>0;i--)
for(j=110;j>0;j--);
}
void delay()
{
_nop_();
_nop_();
}
void init()
{
sda=1;
delay();
scl=1;
delay();
}
void send_ack(bit i) //發送應答信號
{
sda = i;
delay();
scl = 1;
delay();
scl = 0;
}
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
scl=0; //退出時為SCL為低電平,允許下一步SDA數據(寫或讀數據)發生變化
}
void stop()
{
sda=0;
delay();
scl=1; //退出時為高電平,釋放SCL總線
delay();
sda=1; //退出時為高電平,釋放SDA總線
// delay();
}
bit write_dat(uchar dat) //寫一個字節
{
uchar temp,i;
bit j;
temp=dat;
sda=1; //可以不要
for(i=8;i>0;i--)
{
dat=_crol_(dat,1);
if(dat&0x01)
sda=1;
else
sda=0;
scl=1;
delay();
scl=0; //退出時為SCL為低電平,允許下一步SDA數據(循環內部)發生變化
delay();
}
sda=1; //等待應答信號
delay();
scl=1;
delay();
j=sda;
scl=0; //退出時為SCL為低電平,允許下一步SDA數據發生變化
delay();
return j;
}
uchar read_dat()
{
uchar temp=0;
uchar j;
for(j=0;j<8;j++)
{
scl=1; //放TEMP之后也可以
delay();
temp<<=1;
if(sda) temp|=0x01;
scl=0;
delay();
}
return temp;
}
void i2cbyte_write(uchar device ,uchar ctrl,uchar dat)
{
uchar i; //循環變量
bit ack;
for(i=0;i<10;i++) //循環次數
{
start();
ack=write_dat(device);
if(ack)
{
stop();
continue;
}
ack=write_dat(ctrl);
if(ack==1)
{
stop();
continue;
}
ack=write_dat(dat);
if(ack)
{
stop();
continue;
}
stop(); //傳送成功,最后發送停止信號
if (ack==0) break; //傳送成功則退出循環
}
delay1(10);
}
uchar i2cbyte_read(uchar device)
{
uchar dat;
uchar i,ack;
for(i=0;i<10;i++)
{
ack=write_dat(device);
if(ack)
{
stop();
continue;
}
dat=read_dat();
send_ack(1);
stop();
}
return dat;
}
void main()
{
bit test;
init();
while(1)
{
/* i2cbyte_write(0x90,0x40,AD);
start();
write_dat(0x91);
AD=read_dat();
P0 = AD;
*/
start();
test = write_dat(0x91);
if(!test) //8591應答
{
AD=read_dat();
}
P0 = AD;
i2cbyte_write(0x90,0x40,AD);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -