|
|
最近寫一個(gè)需要保存參數(shù)的程序,IC用STC15W408AS,10個(gè)扇區(qū)都用到了,實(shí)測(cè)時(shí)經(jīng)常出現(xiàn)數(shù)據(jù)丟失的現(xiàn)象,請(qǐng)問有沒有什么辦法可以保證數(shù)據(jù)的準(zhǔn)確性
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;
}
大概就是按鍵設(shè)置參數(shù)然后保存這樣,連續(xù)對(duì)多個(gè)參數(shù)進(jìn)行調(diào)整后保存會(huì)出現(xiàn)數(shù)據(jù)丟失或者數(shù)據(jù)錯(cuò)誤 的情況,網(wǎng)上說在每次寫入后都校驗(yàn)一次,不過在實(shí)際使用中不同參數(shù)的讀寫保存之間的操作間隔非常小,11.059的晶振不知道能不能在這樣極短的間隔內(nèi)跑完這一系列的語句,不知道大佬們有沒有什么好的EEPROM讀寫過程可以分享分享,虛心請(qǐng)教,謝謝
|
|