内部晶振22.1184M,想实现启动计数器,保存在EEPROM中(0x0000和0x0001中),测试数据初始值为605,通过szx变量保存,使用了共同体切分两字节。
首次运行带赋值时,TB灯亮,证明变量szx是正常的610以下值(应该为604).再重新写入程序后(去除赋值部分,直接读取EEPROM)TB灯灭,证明数值有错误,请问程序中哪个部分出了问题呢?难道还没写进EEPROM?
#define WT_24M 0x81 //EEPROM 24M晶振延时
sbit RR = P2^1;
sbit GG = P2^2;
sbit BB = P2^3;
sbit TA = P2^4;
sbit TB = P2^5;
sbit TC = P2^6;
unsigned int szx; //EEPROM的计数器变量
void IapIdle() //EEPROM 结束复位
{
IAP_CONTR = 0; //EEPROM 关闭IAP功能
IAP_CMD = 0; //EEPROM 清除命令寄存器
IAP_TRIG = 0; //EEPROM 清除触发寄存器
IAP_ADDRH = 0x80; //EEPROM 将地址设置到非IAP区域
IAP_ADDRL = 0; //EEPROM
}
char IapRead(unsigned int addr) //EEPROM 读取EEPROM数据 返回整个IapRead函数
{
unsigned char dat;
IAP_CONTR = WT_24M; //EEPROM 设定延时
IAP_CMD = 1; //EEPROM 设定1读取命令
IAP_ADDRL = addr; //EEPROM 指定要读取的低地址
IAP_ADDRH = addr>>8; //EEPROM 指定要读取的高地址
IAP_TRIG = 0x5a; //EEPROM 执行的触发命令
IAP_TRIG = 0xa5; //EEPROM 执行的触发命令
_nop_();
dat = IAP_DATA; //EEPROM 读取IAP赋值
IapIdle(); //EEPROM 关闭IAP功能
return dat; //EEPROM 返回整个IapRead函数
}
void IapProgram(unsigned int addr, unsigned char dat) //EEPROM 把addr地址的资料写成dat的内
{
IAP_CONTR = WT_24M; //EEPROM 设定延时
IAP_CMD = 2; //EEPROM 设定2写命令
IAP_ADDRL = addr; //EEPROM 指定要写的低地址
IAP_ADDRH = addr>>8; //EEPROM 指定要写的高地址
IAP_DATA = dat; //EEPROM 写IAP数据
IAP_TRIG = 0x5a; //EEPROM 执行的触发命令
IAP_TRIG = 0xa5; //EEPROM 执行的触发命令
_nop_();
IapIdle(); //EEPROM 关闭IAP功能
}
void IapErase(unsigned int addr) //EEPROM 擦除EEPROM数据
{
IAP_CONTR = WT_24M; //EEPROM 设定延时
IAP_CMD = 3; //EEPROM 设定3擦除命令
IAP_ADDRL = addr; //EEPROM 指定要擦除的低地址
IAP_ADDRH = addr>>8; //EEPROM 指定要擦除的高地址
IAP_TRIG = 0x5a; //EEPROM 执行的触发命令
IAP_TRIG = 0xa5; //EEPROM 执行的触发命令
_nop_();
IapIdle(); //EEPROM 关闭IAP功能
}
void main()
{
union hecheng //EEPROM 定义一个共同体
{
unsigned char qw[2]; //EEPROM qw有2个char 加入了unsigned
unsigned int er; //EEPROM er是无字符整型
}hc; //EEPROM 共同体名称为hc
hc.qw[0]=IapRead(0x0000); //EEPROM 读0x0000到hc[0]
hc.qw[1]=IapRead(0x0001); //EEPROM 读0x0002到hc[1]
szx = hc.er;
// szx = 605; //首次编译预赋值,保存在EEPROM中,下次重新编译去除,并且不清除EEPROM中数据
if(szx <= 585)
{
TC = 0x0; //EEPROM R38(LED)
while(1); //EEPROM 判断次数为,停止操作
}
szx--;
hc.er = szx;
IapErase(0x0000); //EEPROM 先擦除0x0000扇区
IapProgram(0x0000,hc.qw[0]); //EEPROM 写hc[0]到0x0000
IapProgram(0x0001,hc.qw[1]); //EEPROM 写hc[1]到0x0002
hc.qw[0]=IapRead(0x0000); //EEPROM 读0x0000到hc[0]
hc.qw[1]=IapRead(0x0001); //EEPROM 读0x0002到hc[1]
if(szx == hc.er)
{
TA = 0x0; //EEPROM R34(LED) }
if(szx >= 610)
{
TB = 0x0; //EEPROM R36(LED) }
}
|