问题
第三届蓝桥杯单片机设计与开发项目省赛有这一部分
EEPROM是一种掉电后数据不丢失的存储芯片
本文在此探讨以下几个问题:
1.写完可以立刻读吗?
2.读完可以立刻写吗?
3.写完可以立刻写吗?
4.读完可以立刻读吗?
解决思路
使用延时几乎可以解决所有问题
以下是延时函数
void Delay(unsigned int t)
{
while(t--);
}
1.写完可以立刻读吗?
可以用这两句代码验证(用数码管显示dat1)
EEPROM_write(0x01,28);
dat1 = EEPROM_read(0x01);
现象如下,可以看到该现象不正常:
(读别的地址也一样,可以自己尝试)
接下来把第一句注释,查询是否顺利写入
// EEPROM_write(0x01,28);
dat1 = EEPROM_read(0x01);
现象如下,说明已经顺利写入数据,但是没有顺利读出来:
解决方法:延时一段时间再读
EEPROM_write(0x01,32);
Delay(1000);
dat1 = EEPROM_read(0x01);
现象如下,一切正常:
结论:写完不能立刻读
2.读完可以立刻写吗?
dat1 = EEPROM_read(0x00);
EEPROM_write(0x02,55);
用以下代码验证:
dat1 = EEPROM_read(0x02);
现象如下,一切正常:
结论:读完可以立刻写
3.读完可以立刻读吗?
前提:笔者已经把48(十进制)写入0x01,把12(十进制)写入0x00
验证代码:
dat1 = EEPROM_read(0x00);
dat2 = EEPROM_read(0x01);
现象如下,一切正常:
结论:读完可以立刻读
4.写完可以立刻写吗?
EEPROM_write(0x00,41);
EEPROM_write(0x01,39);
EEPROM_write(0x02,70);
验证代码:
dat1 = EEPROM_read(0x00);
dat2 = EEPROM_read(0x01);
dat3 = EEPROM_read(0x02);
现象如下,可知不能直接连续写:
解决方法:延时一段时间再写
EEPROM_write(0x00,37);
Delay(1000);
EEPROM_write(0x01,20);
Delay(1000);
EEPROM_write(0x02,74);
Delay(1000);
dat1 = EEPROM_read(0x00)