uchar xdata timercode[30][4];
按键改写数组4个元素后写入 page_write((addr*0x04),&timercode[addr][0],4);//24c16页写入函数
开机整体读出
E2_BitRead(0x00,&timercode[0],80);//24c16读数据函数
主函数调用上面两个,想开机读取数组存到数组里,然后改变数组后写入,掉电可以不丢数据,为什么老不对呢?
哪位好心的大神给看看呗!
下面的应该没问题,之前用过这个驱动的!
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
sbit SDA=P2^0;
sbit SCL=P2^1;
void E2_delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void E2_start()
{
SDA=1;
SCL=1;
E2_delay();
SDA=0;
E2_delay();
SCL=0;
}
void E2_stop()
{
SDA=0;
SCL=0;
E2_delay();
SCL=1;
E2_delay();
SDA=1;
}
uchar E2_write(uchar dat)
{
uchar mask;
uchar ack;
for(mask=0x80;mask>0;mask>>=1)
{
SCL=0;
E2_delay();
SDA=(dat&mask);
E2_delay();
SCL=1;
E2_delay();
}
SCL=0;
SDA=1;
E2_delay();
SCL=1;
ack=SDA;
E2_delay();
SCL=0;
return (~ack)&0x01;
}
void E2_read_ack()
{
SCL=0;
E2_delay();
SDA=0;
E2_delay();
SCL=1;
E2_delay();
SCL=0;
}
void E2_read_Nack()
{
SCL=0;
E2_delay();
SDA=1;
E2_delay();
SCL=1;
E2_delay();
SCL=0;
}
void E2_BitRead(uchar addr,uchar *dat,uchar len)
{
uchar i;
do
{
E2_start();
if(E2_write(0xa0))
break;
}while(1);
E2_write(addr);
E2_start();
E2_write(0xa1);
while(len)
{
SDA=1;
for(i=0x80;i>0;i>>=1)
{
SCL=1;
if(SDA)
*dat|=i;
else
*dat&=~i;
E2_delay();
SCL=0;
E2_delay();
}
E2_read_ack();
dat++;
len--;
if(len==0)
{
for(i=0x80;i>0;i>>=1)
{
SCL=1;
if(SDA)
*dat|=i;
else
*dat&=~i;
E2_delay();
SCL=0;
E2_delay();
}
E2_read_Nack();
E2_stop();
break;
}
}
}
void page_write(uchar addr,uchar *dat,uchar len)
{
while(len>0)
{
do
{
E2_start();
if(E2_write(0xa0))
break;
}while(1);
E2_write(addr);
while(len--)
{
E2_write(*dat++);
addr++;
if((addr&0x07)==0)
break;
}
E2_stop();
}
}
|