//--------------------------------------------------------------------------
9.4 Flash擦除函数
void EraseFlash()
{
uint16 data page;
char xdata * data pwrite; // FLASH write pointer
SFRPAGE = LEGACY_PAGE;
FLSCL |= 0x01; // enable FLASH writes/erases
PSCTL |= 0x03; // PSWE = 1; PSEE = 1;
RSTSRC = 0x02; // enable VDDMON as reset source
for (page=0;page<1024*40;page+=1024)
{
pwrite=(char xdata *)page;
*pwrite = 0; // 擦除一个扇区
}
PSCTL &= ~0x03; // PSWE = 0; PSEE = 0;
FLSCL &= ~0x01; // disable FLASH writes/erases
}
//--------------------------------------------------------------------------
9.5 Flash编程函数
void ProgramFlash(uint8 * buf,uint16 length,uint16 StartAddress)
{
uint16 i;
uint8 xdata * data pwrite; // FLASH write pointer
uint8 data temp;
for (i=0;i<length;i++)
{
pwrite=(uint8 xdata *) (StartAddress+i); //存储新数据
temp=buf;
FLSCL |= 0x01;
PSCTL |= 0x01; //允许写,MOVX指向FLASH
*pwrite=temp;
PSCTL &= ~0x01; //禁止写,MOVX指向外部RAM
FLSCL &= ~0x01;
}
}
//--------------------------------------------------------------------------
9.6 校验数据发送函数
void SendCheckData(uint16 length)
{
uint8 code * data pread=0;
uint16 i,j;
uint8 xdata buf[1024];
buf[0]=0x13;
buf[1]=0x7E;
SendBuf(buf,2);
for (i=0;i<length;)
{
buf[0]=0x13;
buf[1]=0x3C;
for (j=2;j<1000 && i<length;)
{
if (*pread==0x13)
{
buf[j]=0x13;
buf[j+1]=0x13;
j+=2;
}
else
{
buf[j]=*pread;
j++;
}
i++;
pread++;
}
buf[j]=0x13;
buf[j+1]=0xC3;
SendBuf(buf,j+2);
}
buf[0]=0x13;
buf[1]=0x81;
SendBuf(buf,2);
}
//--------------------------------------------------------------------------
10 结论
以上程序在Keil C51 8.08上编译通过,并经过长时间的运行证明其稳定可靠。