📄 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 + -