单片机EEPROM存储灯状态开机后读取显示不正确

2019-11-22 14:38发布

参照手册写的,两个按键,两个灯,LED3是测试的,按键1灯1亮,然后存储到EEPROM,重新上电后读取EEPROM,然后显示关机前状态,但是现在情况是不显示,重新上电后灯是全灭的。
程序如下:
#include <STC12C5A60S2.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3=P2^2;
sbit K1 = P3^2; //按钮1
sbit K2 = P3^3; //按钮2
void cc(uint addr);
void xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void Q0();
uchar V;
void delay(uint time)
{
        uint i,j;
        for(i=0;i<time;i++)
        for(j=0;j<121;j++);
}
void main(void)//主函数
{


        V = dcx(0x0000); //开机时读取EEPROM区0000数据,还原关电前LED的亮灭状态
        IF(V == 0x01)
        {
                LED1=0;LED2=1;
                if (V == 0x02)
                {
                        LED1=1;LED2=0;
                }
        }
        while(1)
                {
                        if(K1==0)
                                {
                                        delay(20);
                                        if(K1==0)
                                                {
                                                        LED1=0;
                                                        LED2=1;
                                                        cc(0x0000); //擦除扇区
                                                        xcx(0x0000,0x01); //对EEPROM区0000写入0x01
                                                       
                                                }       
                                        }
                        else if(K2==0)
                                {
                                        delay(20);
                                        if(K2==0)
                                        {
                                                LED1=1;
                                                LED2=0;
                                                cc(0x0000); //擦除扇区
                                                xcx(0x0000,0x02); //对EEPROM区0000写入0x10
                                        }
                                }
                }
}
                       


void cc(uint addr)//擦除扇区   入口:addr=某一扇区首地址
{
                  
IAP_CONTR = 0x83; // 打开IAP功能(IAPEN(IAP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间
IAP_CMD = 0x11; //用户可以对"Data Flash/EEPROM?"进行扇区擦除
IAP_ADDRL = addr; // IAP/IAP操作时的地址寄存器2赴宋?
IAP_ADDRH = addr>>8; // IAP/IAP操作时的地址寄存器高八位
IAP_TRIG = 0x5A; //在IAPEN(IAP_CONTR.7)=1时,对IAP_TRIG先写入5a
IAP_TRIG = 0xA5; //再写入a5,IAP/IAP命令才会生效
_nop_();
_nop_();
_nop_();
Q0(); //关闭IAP/IAP
}


void xcx(uint addr,uchar dat)//写1字节   入口:addr=扇区单元地址,dat=待写入数据
{
IAP_CONTR = 0x83;
IAP_CMD =0x10; // 用户可以对"Data Flash/EEPROM区"进行字节编程
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_DATA = dat; //数据进IAP_DATA
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
_nop_();
_nop_();
Q0(); // 关闭IAP/IAP
}


uchar dcx(uint addr)//读1字节    入口:addr=扇区单元地址   出口:dat=读出的数据
{
uchar dat;
IAP_CONTR = 0x83;
IAP_CMD = 0x01; //用户可以对“Data Flash/EEPROM区”进行字节读取
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
_nop_();
_nop_();
dat = IAP_DATA; // 读出数据
Q0(); // 关闭IAP/IAP
return dat;
}


void Q0()//关闭IAP/IAP
{
IAP_CONTR = 0; // 关闭IAP
IAP_CMD = 0; // 待机模式,无IAP操作
IAP_TRIG = 0; // 关闭IAP功能,清除与IAP有关的特殊功能寄存器
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。