#include <REG52.H>
#include <stdio.h>
sbit escl=P0^3;
sbit esda=P0^2;
void w24c512(uchar pageadr,uchar wdataadr,uchar wdata);//一个字节写入24C512子程序,入口:uchar pageadr,uchar wdataadr,uchar wdata
uchar r24c512(uchar pageadr,uchar wdataadr);//从24C512中读取一个字节,入口uchar pageadr,uchar wdataadr,有返回值
void delay_10us(void);
//==================//写24C512子程序单字节//==================
//============//入口:uchar pageadr,uchar wdataadr,uchar wdata========
void w24c512(usigned char device,unsigned int wdataadr,uchar wdata)
{
uchar i,msb,lsb;
uchar deviceadr;
escl=0;
delay_10us();
esda=1;
delay_10us();
escl=1;
delay_10us();
esda=0;
delay_10us();
escl=0;
//开始时序
if (device==0)
{
deviceadr=0xa0;
}
else
{
deviceadr=0xa2;
}
order=deviceadr;
for(i=0;i<8;i++)
{
esda=order7;
delay_10us();
escl=1;
delay_10us();
escl=0;
delay_10us();
order=order<<1;
}
delay_10us();
escl=1;
delay_10us();
escl=0;
//page adr sequ
msb=wdataadr/256;
lsb=wdataadr % 256;
order=msb;
for(i=0;i<8;i++)
{
esda=order7;
delay_10us();
escl=1;
delay_10us();
escl=0;
delay_10us();
order=order<<1;
}
delay_10us();
escl=1;
delay_10us();
escl=0;
//msb高字节
order=lsb;
for(i=0;i<8;i++)
{
esda=order7;
delay_10us();
escl=1;
delay_10us();
escl=0;
delay_10us();
order=order<<1;
}
delay_10us();
escl=1;
delay_10us();
escl=0;
//lsb低字节
order=wdata;
for(i=0;i<8;i++)
{
esda=order7;
delay_10us();
escl=1;
delay_10us();
escl=0;
delay_10us();
order=order<<1;
}
delay_10us();
escl=1;
delay_10us();
escl=0;
//want to write a byte
esda=0;
delay_10us();
escl=1;
delay_10us();
esda=1;
delay_10us();
escl=0;
delay_10us();
delay_10us();
delay_10us();
}
//stop
//==================//读24C512子程序单字节//==================
//==================//入口:uchar pageadr,uchar wdataadr,有返回值======
uchar r24c16(usigned char device,unsigned int wdataadr,uchar wdata){
uchar i,msb,lsb,deviceadr;
escl=0;
delay_10us();
esda=1;
delay_10us();
escl=1;
delay_10us();
esda=0;
delay_10us();
escl=0;
//start sequ
if (device==0)
{
deviceadr=0xa0;
}
else
{
deviceadr=0xa2;
}
order=deviceadr;
for(i=0;i<8;i++)
{
esda=order7;
delay_10us();
escl=1;
delay_10us();
escl=0;
delay_10us();
order=order<<1;
}
delay_10us();
escl=1;
delay_10us();
escl=0;
//page adr sequ
msb=wdataadr/256;
lsb=wdataadr % 256;
order=msb;
for(i=0;i<8;i++)
{
esda=order7;
delay_10us();
escl=1;
delay_10us();
escl=0;
delay_10us();
order=order<<1;
}
delay_10us();
escl=1;
delay_10us();
escl=0;
//unit adr sequ
order=lsb;
for(i=0;i<8;i++)
{
esda=order7;
delay_10us();
escl=1;
delay_10us();
escl=0;
delay_10us();
order=order<<1;
}
delay_10us();
escl=1;
delay_10us();
escl=0;
//unit adr sequ
escl=0;
delay_10us();
esda=1;
delay_10us();
escl=1;
delay_10us();
esda=0;
delay_10us();
escl=0;
//restart
if (device==0)
{
deviceadr=0xa1;
}
else
{
deviceadr=0xa3;
}
order=deviceadr;
for(i=0;i<8;i++)
{
esda=order7;
delay_10us();
escl=1;
delay_10us();
escl=0;
delay_10us();
order=order<<1;
}
delay_10us();
escl=1;
delay_10us();
escl=0;
//page adr sequ
order=0x00;
esda=1;
for(i=0;i<8;i++)
{
order=order<<1;
escl=1;
delay_10us();
order0=esda;
delay_10us();
escl=0;
delay_10us();
}
//read data
esda=1;
escl=1;
delay_10us();
escl=0;
//ack
esda=0;
delay_10us();
escl=1;
delay_10us();
esda=1;
delay_10us();
escl=0;
delay_10us();
delay_10us();
delay_10us();
wdataadr=order;
return(wdataadr);
}
//stop
void delay_10us(void)
{
unsigned int i;
for(i=0;i<600;i++)
{
}
}