参照手册写的,两个按键,两个灯,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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>