模块代码
写数据
void write_24(unsigned char add,dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
读数据
unsigned char read_24(unsigned char add)
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
dat=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return dat;
}
记录开机次数
EA = 0;
if(read_24(39)!=26)
{
write_24(5,0);Delay5ms();//初始数据
write_24(39,26);Delay5ms();
}
cnt=read_24(5) + 1;
EA = 1;
思路介绍:我们知道直接对一个EEPROM的地址进行计数,在下一次开机时仍旧会被初始化0,这时候我们需要用到另一个地址来形成一把锁,在第一次上电时39地址(39可自行更改没有限制)很大概率不等于26,于是进入 i f if if语句初始化计数为0,同时将39地址赋值为26,下次上电就不会进入 i f if if语句重新赋为0了。
需要注意的点
- 可以连续读,不可以连续写
- 连续写入时,相互delay五毫秒
- 需要存入16位数据时,分为高八位和第八位写入
读取数据不对的经验分享
读取数据时建议将:EA = 0;读取后再令 EA = 1;