|
void IapIdle()
{
IAP_CONTR=0; //關(guān)閉IAP功能
IAP_CMD=0; //清除命令寄存器
IAP_TRIG=0; //清除觸發(fā)寄存器
IAP_ADDRH=0X80; //將地址設(shè)置到非IAP區(qū)域
IAP_ADDRL=0;
}
char IapRead(int addr) //讀
{
char dat;
IAP_DATA=0x00;
IAP_CONTR=0x80; //使能IAP
IAP_TPS = 12; //設(shè)置擦出等待參數(shù) 12MHz 以下
IAP_CMD=1; //設(shè)置IAP讀命令
IAP_ADDRL=addr; //設(shè)置IAP低地址
IAP_ADDRH=addr>>8; //設(shè)置IAP高地址
IAP_TRIG=0x5a; //寫(xiě)觸發(fā)命令
IAP_TRIG=0xa5; //寫(xiě)觸發(fā)命令
_nop_();
dat=IAP_DATA; //讀命令數(shù)據(jù)
IapIdle(); //關(guān)閉IAP功能
return dat;
}
void IapProgram(int addr,char dat) //寫(xiě)
{
IAP_CONTR=0x80; //使能IAP
IAP_TPS = 12; //設(shè)置擦出等待參數(shù) 12MHz 以下
IAP_CMD=2; //設(shè)置IAP寫(xiě)命令
IAP_ADDRL=addr; //設(shè)置IAP低地址
IAP_ADDRH=addr>>8; //設(shè)置IAP高地址
IAP_DATA=dat; //寫(xiě)IAP數(shù)據(jù)
IAP_TRIG=0x5a; //寫(xiě)觸發(fā)命令
IAP_TRIG=0xa5; //寫(xiě)觸發(fā)命令
_nop_();
IapIdle(); //關(guān)閉IAP功能
}
void IapErase(int addr) //擦除
{
IAP_CONTR=0x80; //使能IAP
IAP_TPS = 12; //設(shè)置擦出等待參數(shù) 12MHz 以下
IAP_CMD=3; //設(shè)置IAP擦除命令
IAP_ADDRL=addr; //設(shè)置IAP低地址
IAP_ADDRH=addr>>8; //設(shè)置IAP高地址
IAP_TRIG=0x5a; //寫(xiě)觸發(fā)命令
IAP_TRIG=0xa5; //寫(xiě)觸發(fā)命令
_nop_();
IapIdle(); //關(guān)閉IAP功能
}
這部分是官方例程
void WriteDATA_FLASH_START_ADDRESS1()
{
IapErase(0x0000);
IapProgram(0x0000,0);
IapProgram(0x0002,128);
delaynms(30);
IapProgram(0x0010,sc/100);
IapProgram(0x0012,sc%100);
delaynms(30);
IapProgram(0x0020,0);
IapProgram(0x0022,127);
delaynms(30);
}
這是我的寫(xiě)入,數(shù)值我改了方便測(cè)試
void Read_dat1()
{
sw=IapRead(0x0000);
sw=sw*100+IapRead(0x0002);
sc=IapRead(0x0010);
sc=sc*100+IapRead(0x0012);
p =IapRead(0x0020);
p=p*100+IapRead(0x0022);
}
這部分讀,然后再到顯示部分。這里就不放出來(lái)了。實(shí)際顯示SW讀出的值無(wú)限大,P就是正常的127 |
|