我這里的 if(dat != First_ON) //檢測是否第一次上電 我這個程序無論多少次上電都會觸發條件,求各位大佬指點一下為啥
#define First_ON 0x88
void main()
{
unsigned char dat;
Uart1_Init();
dat = IapRead(0x0200);
sendByte(dat);
sendByte(IapRead(0x0000));
if(dat != First_ON) //檢測是否第一次上電
{
IapProgram(0x0200, 0x88);
sendByte(IapRead(0x0200));
IapProgram(0x0000, 0x0A);
dat = 1;
}
sendByte(dat);
dat = IapRead(0x0000);
sendByte(dat);
IapErase(0x0000);
dat = IapRead(0x0000);
sendByte(dat);
IapProgram(0x0000, 0x05);
dat = IapRead(0x0000);
sendByte(dat);
while(1);
}
void Uart1_Init(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數據,可變波特率
AUXR &= 0xBF; //定時器時鐘12T模式
AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x20; //設置定時器模式
TL1 = 0xFA; //設置定時初始值
TH1 = 0xFA; //設置定時重載值
ET1 = 0; //禁止定時器中斷
TR1 = 1; //定時器1開始計時
}
void IapIdle()
{
IAP_CONTR = 0; //關閉IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除觸發寄存器
IAP_ADDRH = 0x80; //將地址設置到非IAP區域
IAP_ADDRL = 0;
}
char IapRead(int addr) //扇區讀取函數 讀一個字節
{
char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 11; //設置等待參數12MHz
IAP_CMD = 1; //設置IAP讀命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_();
dat = IAP_DATA; //讀IAP數據
IapIdle(); //關閉IAP功能
return dat;
}
void IapProgram(int addr, char dat) //寫一個字節
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 11; //設置等待參數12MHz
IAP_CMD = 2; //設置IAP寫命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_DATA = dat; //寫IAP數據
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_();
IapIdle(); //關閉IAP功能
}
void IapErase(int addr) //扇區擦除函數
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 11; //設置等待參數12MHz
IAP_CMD = 3; //設置IAP擦除命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //
IapIdle(); //關閉IAP功能
}
|