下面把程序貼上來
/**************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define CMD_IDLE 0 //空閑模式
#define CMD_READ 1 //IAP字節(jié)讀命令
#define CMD_PROGRAM 2 //IAP字節(jié)編程命令
#define CMD_ERASE 3 //IAP扇區(qū)擦除命令
#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;
/****************關(guān)閉IAP********************************/
void IAPIdle()
{
IAP_CONTR =0; //關(guān)閉IAP功能
IAP_CMD =0; //清除命令寄存器
IAP_TRIG =0; //清除觸發(fā)寄存器
IAP_ADDRH =0x80; //將地址設置到非IAP區(qū)域
IAP_ADDRL =0; //
}
/****************從EEPROM讀一字節(jié)**************************/
uchar IAPReadByte(uchar addr)
{
uchar dat; //數(shù)據(jù)緩沖區(qū)
IAP_CONTR =ENABLE_IAP; //使能IAP
IAP_CMD =CMD_READ; //設置IAP命令
IAP_ADDRL =addr; //設置IAP底地址
IAP_ADDRH =addr>>8; //設置IAP高地址
IAP_TRIG =0x5a; //寫觸發(fā)命令0x5a
IAP_TRIG =0xa5; //寫觸發(fā)命令0xa5
_nop_(); //等待EEPROM操作完成
dat=IAP_DATA; //讀EEPROM數(shù)據(jù)
IAPIdle(); //關(guān)閉IAP
return dat; //返回數(shù)據(jù)
}
/***************寫一字節(jié)到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數(shù)據(jù)
IAP_TRIG =0x5a; //寫觸發(fā)命令0x5a
IAP_TRIG =0xa5; //寫觸發(fā)命令0xa5
_nop_(); //等待EEPROM操作完成
IAPIdle(); //關(guān)閉IAP
}
/**************扇區(qū)擦除**********************************/
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; //寫觸發(fā)命令0x5a
IAP_TRIG =0xa5; //寫觸發(fā)命令0xa5
_nop_(); //等待EEPROM操作完成
IAPIdle(); //關(guān)閉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;
}
/*******************驅(qū)動程序**********************/
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; //低壓監(jiān)測中斷允許
PLVD = 1; //低壓中斷 優(yōu)先級高
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++) ; //延時一下
}
}
/*************************************************/
請大俠指點,程序哪里有問題,小菜感激不盡。。。。。。