下面把程序贴上来
/**************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define CMD_IDLE 0 //空闲模式
#define CMD_READ 1 //IAP字节读命令
#define CMD_PROGRAM 2 //IAP字节编程命令
#define CMD_ERASE 3 //IAP扇区擦除命令
#define ENABLE_IAP 0x82
#define IAP_ADDRESS 0x00
sbit led0=P3^4;
sbit led1=P3^5;
sbit add=P3^3;
sbit wsw=P3^2;
sbit doc=P3^1;
sbit footsw=P3^0;
uchar bright;
uchar flag=0;
uint i=0;
/****************关闭IAP********************************/
void IAPIdle()
{
IAP_CONTR =0; //关闭IAP功能
IAP_CMD =0; //清除命令寄存器
IAP_TRIG =0; //清除触发寄存器
IAP_ADDRH =0x80; //将地址设置到非IAP区域
IAP_ADDRL =0; //
}
/****************从EEPROM读一字节**************************/
uchar IAPReadByte(uchar addr)
{
uchar dat; //数据缓冲区
IAP_CONTR =ENABLE_IAP; //使能IAP
IAP_CMD =CMD_READ; //设置IAP命令
IAP_ADDRL =addr; //设置IAP底地址
IAP_ADDRH =addr>>8; //设置IAP高地址
IAP_TRIG =0x5a; //写触发命令0x5a
IAP_TRIG =0xa5; //写触发命令0xa5
_nop_(); //等待EEPROM操作完成
dat=IAP_DATA; //读EEPROM数据
IAPIdle(); //关闭IAP
return dat; //返回数据
}
/***************写一字节到EEPROM**************************/
void IAPProgramByte(uchar addr,uchar dat)
{
IAP_CONTR =ENABLE_IAP; //使能IAP
IAP_CMD =CMD_PROGRAM; //设置IAP命令
IAP_ADDRL =addr; //设置IAP底地址
IAP_ADDRH =addr>>8; //设置IAP高地址
IAP_DATA=dat; //写EEPROM数据
IAP_TRIG =0x5a; //写触发命令0x5a
IAP_TRIG =0xa5; //写触发命令0xa5
_nop_(); //等待EEPROM操作完成
IAPIdle(); //关闭IAP
}
/**************扇区擦除**********************************/
void IAPEraseSector(uint addr)
{
IAP_CONTR =ENABLE_IAP; //使能IAP
IAP_CMD =CMD_ERASE; //设置IAP命令
IAP_ADDRL =addr; //设置IAP底地址
IAP_ADDRH =addr>>8; //设置IAP高地址
IAP_TRIG =0x5a; //写触发命令0x5a
IAP_TRIG =0xa5; //写触发命令0xa5
_nop_(); //等待EEPROM操作完成
IAPIdle(); //关闭IAP
}
/*******************延时程序1ms********************
void delay1ms(uint a){
uchar i;
while(--a !=0){
for(i=0;i<600;i++);
}
}
/*************************************************/
void delay(uchar z)
{
TMOD=0x02; //定时器0工作方式2,8位自动重装
TH0=256-60;
AUXR |= (1<<7); //T0设为1T
EA=1;
ET0=1;
TR0=1;
while(i
i = 0;
}
/*******************驱动程序**********************/
void drive (void){
uchar a;
if(footsw==0){
a=0x10;
}
else{
a=bright;
}
switch(flag){
case 0:
led0=led1=0;
delay(a);
a=~a;
led0=led1=1;
delay(a);
a=~a;
break;
case 1:
led0=1;
led1=0;
delay(a);
a=~a;
led0=led1=1;
delay(a);
a=~a;
break;
case 2:
led0=0;
led1=1;
delay(a);
a=~a;
led0=led1=1;
delay(a);
a=~a;
break;
}
}
/*******************亮度加程序********************/
void Add (void){
if(add==0){
bright++;
if(bright>0xfe){
bright=0xfe;
}
IAPProgramByte(IAP_ADDRESS,bright); //掉电保存标志
}
}
/*******************亮度减程序*********************/
void Doc (void){
if(doc==0){
bright--;
if(bright<0x05){
bright=0x05;
}
IAPProgramByte(IAP_ADDRESS,bright); //掉电保存标志
}
}
/*******************主程序**************************/
void main (void){
PCON = PCON & ~(1<<5); //低压检测标志清0
ELVD = 1; //低压监测中断允许
PLVD = 1; //低压中断 优先级高
EA = 1;
IE=0x81;
IT0=1;
bright= IAPReadByte(IAP_ADDRESS);
IAPEraseSector(IAP_ADDRESS);
add=1;
while(1){
drive();
Add();
Doc();
// IAPProgramByte(IAP_ADDRESS,bright); //掉电保存值
}
}
/****************************************************/
void timer0() interrupt 1
{
i++;
}
/***************************************************/
void INT0() interrupt 0
{
EX0=0;
flag++;
if(flag>=3){
flag=0 ;
}
EX0=1;
}
/****************掉电检测服务程序*******************/
void LVD_Routine(void) interrupt 6
{
IAPProgramByte(IAP_ADDRESS,bright); //掉电保存值
while(PCON & (1<<5)) //检测是否仍然低电压
{
PCON = PCON & ~(1<<5); //低压检测标志清0
for(i=0; i<100; i++) ; //延时一下
}
}
/*************************************************/
请大侠指点,程序哪里有问题,小菜感激不尽。。。。。。