本人小白,初學單片機
測試數(shù)據(jù)根據(jù)菜單設置保存,上電后數(shù)據(jù)為上次菜單所保存的,
現(xiàn)遇到此問題,運行時候數(shù)據(jù)設置沒有問題,掉電重新上電后發(fā)現(xiàn)數(shù)據(jù)取出后第一個數(shù)據(jù)是第三個地址上面的,第二個數(shù)據(jù)是第一個地址上面的,第三個數(shù)據(jù)是第二個地址上面的。單獨存取一個地址的就沒問題,疑惑中?????
部分代碼
擦除、讀、寫等函數(shù)
void cachu(uchar addrH,uchar addrL) //擦除指令
{
IAP_ADDRL = addrL; // ISP/IAP操作時的地址寄存器低八位,
IAP_ADDRH = addrH; // ISP/IAP操作時的地址寄存器高八位
IAP_CONTR = 0x84;
IAP_CMD = 0x03; // 用戶可以對"Data Flash/EEPROM區(qū)"進行扇區(qū)擦除
EA =0;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
EA = 1;
guanbi_IAP(); // 關閉ISP/IAP
}
/////////////////////////////////////////////////////////////////////////////////
void xie(uchar addrH,uchar addrL, xxx) //寫
{
IAP_ADDRL = addrL;
IAP_ADDRH = addrH;
IAP_CONTR = 0x84;
IAP_CMD = 0x02; // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)編程
EA = 0;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
IAP_DATA = xxx; // 數(shù)據(jù)進ISP_DATA
_nop_();
EA = 1;
guanbi_IAP(); // 關閉ISP/IAP
}
uchar du(uchar addrH,uchar addrL) //讀
{
IAP_ADDRL = addrL;
IAP_ADDRH = addrH;
IAP_CONTR = 0x84;
IAP_CMD = 0x01; // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)讀
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
guanbi_IAP(); // 關閉ISP/IAP
return IAP_DATA;
}
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
void guanbi_IAP()
{
IAP_CONTR = 0; //關閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
IAP_TRIG = 0; //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
菜單設置函數(shù)
if(open==0)
{
if(anjianxiaodou<600)
{
mk=3;
if(mk>130){mk=1;}
anjianxiaodou=700;
}
cachu(0,0); // 擦除第1個扇區(qū)
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 對EEPROM區(qū)寫入
}
if(close==0)
{
if(anjianxiaodou<600)
{
mk=3;
if(mk<1){mk=130;}
anjianxiaodou=700;
}
cachu(0,0); // 擦除第1個扇區(qū)
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 對EEPROM區(qū)2002h寫入
}
}
break;
}
case 2:
{ if(xiajibiaozhi==0)
{
qian=15;
bai=19;
shi=0;
ge=1;
shumaguanxianshi();
}
if(caidan==0&&anjianxiaodou>500&&anjianxiaodou<600)
{
xiajibiaozhi=~xiajibiaozhi;
anjianxiaodou=700;
}
if(xiajibiaozhi==1)
{
qian=tjs/1000;
bai=((tjs%1000)/100);
shi=(((tjs%1000)%100)/10);
ge=((((tjs%1000)%100)%10)/1);
shumaguanxianshi();
if(open==0)
{
if(anjianxiaodou<600)
{
tjs=6;
if(tjs>15){tjs=1;}
anjianxiaodou=700;
}
cachu(0,1); // 擦除第1個扇區(qū)
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 對EEPROM區(qū)寫入
}
if(close==0)
{
if(anjianxiaodou<600)
{
tjs=6;
if(tjs<1){tjs=15;}
anjianxiaodou=700;
}
cachu(0,1); // 擦除第1個扇區(qū)
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 對EEPROM區(qū)寫入
}
}
break;
}
case 3:
{
if(xiajibiaozhi==0)
{
qian=15;
bai=19;
shi=0;
ge=2;
shumaguanxianshi();
}
if(caidan==0&&anjianxiaodou>500&&anjianxiaodou<600)
{
xiajibiaozhi=~xiajibiaozhi;
anjianxiaodou=700;
}
if(xiajibiaozhi==1)
{
qian=wjs/1000;
bai=((wjs%1000)/100);
shi=(((wjs%1000)%100)/10);
ge=((((wjs%1000)%100)%10)/1);
shumaguanxianshi();
if(open==0)
{
if(anjianxiaodou<600)
{
wjs=9;
if(wjs>15){wjs=1;}
anjianxiaodou=700;
}
cachu(0,2); // 擦除第1個扇區(qū)
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 對EEPROM區(qū)寫入
}
if(close==0)
{
if(anjianxiaodou<600)
{
wjs=9;
if(wjs<1){wjs=15;}
anjianxiaodou=700;
}
cachu(0,2); // 擦除第1個扇區(qū)
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 對EEPROM區(qū)寫入
}
}
break;
上電main函數(shù)直接根據(jù)地址讀出
void main()
{ i=0;y=0;
led=0;
hrzhi= P0 & 0x07 ;
hezhi1=hrzhi;
mk=du(0,0);
tjs=du(0,1);
wjs=du(0,2);
maichong=0;
//////////////////////
讀出來的三個數(shù)據(jù)是相互錯的,數(shù)值不錯,位置錯。
|