|
uchar xdata timercode[30][4];
按鍵改寫數(shù)組4個(gè)元素后寫入 page_write((addr*0x04),&timercode[addr][0],4);//24c16頁寫入函數(shù)
開機(jī)整體讀出
E2_BitRead(0x00,&timercode[0],80);//24c16讀數(shù)據(jù)函數(shù)
主函數(shù)調(diào)用上面兩個(gè),想開機(jī)讀取數(shù)組存到數(shù)組里,然后改變數(shù)組后寫入,掉電可以不丟數(shù)據(jù),為什么老不對(duì)呢?
哪位好心的大神給看看唄!
下面的應(yīng)該沒問題,之前用過這個(gè)驅(qū)動(dòng)的!
#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();
}
}
|
|