最近写一个需要保存参数的程序,IC用STC15W408AS,10个扇区都用到了,实测时经常出现数据丢失的现象,请问有没有什么办法可以保证数据的准确性
void key_handle()
{
uchar t,e1,e2,limit;
e1 = dcx(0x0020);
e2 = dcx(0x0220);
while(1)
{
if(KEY_1 == 0)
{
Delay(2);
if(KEY_1 == 0)
{
while(KEY_1 == 0);
if(limit<++e1) e1 = 0;
}
}
if(KEY_2 == 0)
{
Delay(2);
if(KEY_2 == 0)
{
while(KEY_2 == 0);
if(limit<--e1) e1 = limit;
}
}
display1(e1);
}
uchar dcx(uint addr)
{
uchar dat;
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_READ;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_();
_nop_();
dat = IAP_DATA;
Q0();
return dat;
}
void cc(uint addr)
{
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_();
_nop_();
Q0();
}
void xcx(uint addr,uchar dat)
{
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM;
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_DATA = dat;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_();
_nop_();
Q0();
}
void Q0()
{
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0x80;
IAP_ADDRL = 0;
}
大概就是按键设置参数然后保存这样,连续对多个参数进行调整后保存会出现数据丢失或者数据错误 的情况,网上说在每次写入后都校验一次,不过在实际使用中不同参数的读写保存之间的操作间隔非常小,11.059的晶振不知道能不能在这样极短的间隔内跑完这一系列的语句,不知道大佬们有没有什么好的EEPROM读写过程可以分享分享,虚心请教,谢谢
|