#include<reg52.h>
#include<intrins.h>
#define _nop() _nop_()
#define uchar unsigned char
sbit sda=P2^2;
sbit scl=P2^3;
bit ack;
void delayus(uchar t);
void delayms(uchar t);
void delayus(uchar t)
{
while(--t);
}
void delayms(uchar t)
{
while(t--)
{
delayus(245);
delayus(245);
}
}
void start()
{
sda=1;
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
sda=0;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
_nop();
_nop();
}
void stop()
{
sda=0;
_nop();
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
sda=1;
_nop();
_nop();
_nop();
_nop();
_nop();
}
void ACK_T(void)
{
sda=0;
_nop();
_nop();
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
_nop();
_nop();
}
void NOACK(void)
{
sda=1;
_nop();
_nop();
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
_nop();
_nop();
}
void write(uchar c)
{
uchar i,temp;
temp=c;
scl=0;
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
}
_nop();
_nop();
sda=1;
_nop();
_nop();
scl=1;
_nop();
_nop();
_nop();
if(sda==0)ack=0;
else ack=1;
scl=0;
_nop();
_nop();
}
unsigned char read()
{
unsigned char i;
uchar j;
uchar k;
scl=0;
for(i=0;i<8;i++)
{
j=sda;
k=(k<<1)|j;
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
_nop();
_nop();
}
scl=0;
_nop();
_nop();
return (k);
}
bit write_string(uchar duxie,uchar dizhi,uchar *s,uchar geshu )
{
uchar b;
start();
write(duxie);
if(ack==0)return(0);
write(dizhi);
if(ack==0)return(0);
for(b=0;b<geshu;b++)
{
write(*s);
if(ack==0)return(0);
s++;
}
stop();
return(1);
}
bit read_string(uchar duxie,uchar dizhi,uchar *s,uchar geshu )
{
uchar b;
start();
write(duxie);
if(ack==0)return(0);
write(dizhi);
if(ack==0)return(0);
for(b=0;b<geshu;b++)
{
*s=read();
ACK_T();
s++;
}
*s=read();
NOACK();
stop();
return(1);
}
void main()
{
uchar a;
a=0xaa;
write_string(0xae,80,&a,1);
delayus(1000);
read_string(0xaf,80,&a,1);
while(1)
{
P1=a;
}
}
|