51单片机模拟IIC

发布时间 2024-01-08 11:54:44作者: 阡陌奈何

void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

void Init()
{
SCL_OUT;
SDA_OUT;
SCL=1;
delay1();
SDA=1;
delay1();
}

void start()
{
SCL_OUT;
SDA_OUT;
SDA=1;
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
}

void respons()
{
uchar i=0;

SCL_OUT;
SDA_IN;
SCL=1;
delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}

void stop()
{
SCL_OUT;
SDA_OUT;
SDA=0;
SCL=1;
delay();
SDA=1;
SCL=1;
delay();
}

void write_byte(uchar date)
{
uchar i,temp;

SCL_OUT;
SDA_OUT;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}

uchar read_byte()
{
uchar i,k;

SCL_OUT;
SDA_IN;
for(i=0;i<8;i++)
{
SCL=0;
delay();
SCL=1;
k=(k<<1)|SDA;
delay();
}
delay();
SCL_OUT;
SDA_OUT;
SCL=0;
SDA=1;
delay();
SCL=1;
delay();
SCL=0;
return k;
}

void write_data(uchar address,uchar date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}

uchar read_data(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();

stop();
delay();
return date;
}