本人小白,初学单片机
测试数据根据菜单设置保存,上电后数据为上次菜单所保存的,
现遇到此问题,运行时候数据设置没有问题,掉电重新上电后发现数据取出后第一个数据是第三个地址上面的,第二个数据是第一个地址上面的,第三个数据是第二个地址上面的。单独存取一个地址的就没问题,疑惑中?????
部分代码
擦除、读、写等函数
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区"进行扇区擦除
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区"进行字节编程
EA = 0;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
IAP_DATA = xxx; // 数据进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区"进行字节读
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; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
菜单设置函数
if(open==0)
{
if(anjianxiaodou<600)
{
mk=3;
if(mk>130){mk=1;}
anjianxiaodou=700;
}
cachu(0,0); // 擦除第1个扇区
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 对EEPROM区写入
}
if(close==0)
{
if(anjianxiaodou<600)
{
mk=3;
if(mk<1){mk=130;}
anjianxiaodou=700;
}
cachu(0,0); // 擦除第1个扇区
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 对EEPROM区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个扇区
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 对EEPROM区写入
}
if(close==0)
{
if(anjianxiaodou<600)
{
tjs=6;
if(tjs<1){tjs=15;}
anjianxiaodou=700;
}
cachu(0,1); // 擦除第1个扇区
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 对EEPROM区写入
}
}
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个扇区
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 对EEPROM区写入
}
if(close==0)
{
if(anjianxiaodou<600)
{
wjs=9;
if(wjs<1){wjs=15;}
anjianxiaodou=700;
}
cachu(0,2); // 擦除第1个扇区
xxx=mk;
xie(0,0,xxx);
xxx=tjs;
xie(0,1,xxx);
xxx=wjs;
xie(0,2,xxx); // 对EEPROM区写入
}
}
break;
上电main函数直接根据地址读出
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;
//////////////////////
读出来的三个数据是相互错的,数值不错,位置错。
|