后面三种状态都能写入,掉电后正常读取,为啥第一种状态死活写不进去呢,返回的一直都是FF。我把数据全部加1后测试,上电后默认第一种状态点亮,也能掉电存储了,其它几种状态都正常。当num从0或1开始就无法正常写入,第一种状态上电默认关闭,手动点亮后掉电无法存储。只有num从2开始才正常。
单片机源程序如下:
#include <STC15F2K60S2.H>
#include <intrins.h>
#include "eeprom.h"
sbit K1=P3^2;
sbit K2=P3^3;
sbit l1=P1^4;
sbit l2=P1^5;
sbit l3=P1^6;
static unsigned char num=0;
void Delay30ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 2;
j = 67;
k = 183;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void init()//中断初始化
{
IT0=1;//外部中断0 跳变触发
EX0=1;//外部中断0 p32
EA=1;
}
void init0() interrupt 0//中断程序 K1
{
if(K1==0)
{
Delay30ms();
if(K1==0)
num=num+1;
if(num>4){num=1;}
while(!K1);}
}
void lsd0()
{
while(1)
{
if(num!=1){return;}
P1=0xfe;
}
}
void lsd1()
{
while(1)
{ l3=0;
if(num!=2){return;}
P1=0xfd;}
}
void lsd2()
{
while(1)
{ l2=0;
if(num!=3){return;}
P1=0xfb;}
}
void lsd3()
{
while(1)
{
P1=0xf7;
if(num!=4)
{return;}
}
}
void main()
{ char v;
init();
v=IapReadByte(IAP_ADDRESS);
num=v+1;
while(1)
{
switch(num)
{
case 1:lsd0();
P1=0xfe;
if(IapReadByte(IAP_ADDRESS)!=1)
{IapEraseSector(IAP_ADDRESS); // 擦除扇区
IapProgramByte(IAP_ADDRESS,1);}
break;
case 2:lsd1();
P1=0xfd;
if(IapReadByte(IAP_ADDRESS)!=2)
{IapEraseSector(IAP_ADDRESS); // 擦除扇区
IapProgramByte(IAP_ADDRESS,2);}
break;
case 3:lsd2();
P1=0xfb;
if(IapReadByte(IAP_ADDRESS)!=3)
{IapEraseSector(IAP_ADDRESS); // 擦除扇区
IapProgramByte(IAP_ADDRESS,3); }
break;//num++;
case 4:lsd3();
P1=0xf7;
if(IapReadByte(IAP_ADDRESS)!=4)
{IapEraseSector(IAP_ADDRESS); // 擦除扇区
IapProgramByte(IAP_ADDRESS,4);}
break;
default:break;
}
}
}
|