|
STC8A8K64D4
11.0592
设置用户EEPROM大小:0.5K
以下是我从手册上摘抄的代码,上电运行,可以读出正确值,单独写入EEPROM(地址0x0000),断电,修改代码再单独读EEPROM(地址0x0000),读出的数值为0xFFFF,IAP读写模式,代码参考如下:
//----------------------------------------------------------------------------
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
//----------------------------------------------------------------------------
char IapRead(int addr)
{ //EEPROM读字节数据
char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS=11;
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5A; //写触发命令(0x5A)
IAP_TRIG = 0xA5; //写触发命令(0xA5)
_nop_();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
//----------------------------------------------------------------------------
void IapProgram(int addr, char dat)
{ //EEPROM写字节数据
IAP_CONTR = 0x80; //使能IAP
IAP_TPS=11;
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr>>8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5A; //写触发命令(0x5A)
IAP_TRIG = 0xA5; //写触发命令(0xA5)
_nop_();
IapIdle(); //关闭IAP功能
}
//----------------------------------------------------------------------------
void IapErase(int addr)
{ //EEPROM扇区擦除
IAP_CONTR =0x80; //使能IAP
IAP_TPS=11;
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr>>8; //设置IAP高地址
IAP_TRIG = 0x5A; //写触发命令(0x5A)
IAP_TRIG = 0xA5; //写触发命令(0xA5)
_nop_(); //
IapIdle(); //关闭IAP功能
}
sbit LED_OPEN = P3^5; //开门LED
char aa,bb;
void main(void)
{
//◆=====主循环控制流程(开始)====
while (1)
{
// 第一次去掉注释,让它写入0x0000处数值为0x03,第二次注释掉本段代码,单独执行后面读程序
// IapErase(0x0000);
// IapProgram(0x0000,0x03);
//
LED_OPEN=0;
bb = IapRead(0x0000);
bb = IapRead(0x0000);
//判断数据对错
if(bb==0xFFFF) //第一次(bb==0x03),就可以进入判断,第二次就就不行了,只能执行(bb==0xFFFF),说明读出的数值为0XFFFF
{
delay_ms(1000);
LED_OPEN=1;
}
delay_ms(1000);
} //=====End of "while(1)"=====
//◎=====主循环控制流程(结束)====
}
期间我关过中断,也不行,谁遇到过能给我思路?谢谢
|
|