#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
void start();
void stop();
void write(uchar);
void response();
uchar read();
void write_addr(uchar,uchar);
void read_addr(uchar);
void delay();
void delay1(uint);
void main(){
start();
write_addr(3,0xfe);
write(0xaa);
stop();
delay1(200);
start();
read_addr(3);
P1=read();
stop();
while(1);
}
void start(){
sda=1;
scl=1;
delay();
sda=0;
delay();
}
void stop(){
sda=0;
scl=1;
delay();
sda=1;
delay();
}
void write(uchar dat){
uchar temp=dat;
uint x;
for(x=0;x<8;x++){
scl=0;
delay();
temp=temp<<1;
sda=CY;
delay();
scl=1;
delay();
}
//每写完一个字节就要把sda拉高,方便接受应答信号
scl=0;
delay();
sda=1;
delay();
}
void response(){
uint i=0;
scl=1;
delay();
while((sda==1)&&(i<255)){
i++;
delay();
}
scl=0;
delay();
}
uchar read(){
uint ret=0;
uint x=0;
for(x=0;x<8;x++){
scl=0;
delay();
ret=(ret<<1)|sda;
scl=1;
delay();
}
return(ret);
}
void write_addr(uchar addr,uchar dat){
//0xa0是E2PROM的设备地址
//为什么数据必须在这里写入,否则会出错?
write(0xa0);
response();
write(addr);
response();
//write(dat);
//response();
}
void read_addr(uchar addr){
write(0xa0);
response();
write(addr);
response();
start();
write(0xa1);
response();
}
void delay(){
nop();
nop();
}
void delay1(uint z){
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}