STC12C5A60S2 单片机如何擦除

如题所述

#include <reg52.h>
#include <lcm12864.h>

sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;

#define ISP_IAP_BYTE_READ 1
#define ISP_IAP_BYTE_PROGRAN 2
#define ISP_IAP_BYTE_ERASE 3
#define WAITE_TIME 1

void Delay(int cnt)
{
int i;
for(i=0;i<cnt;i++);
}

void Sector_Erase(int addr)
{
ISP_ADDRH = addr >> 8;
ISP_ADDRL = addr & 0x0ff;
ISP_CONTR = WAITE_TIME;
ISP_CONTR = 0x80;
ISP_CMD = ISP_IAP_BYTE_ERASE;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
}

void Byte_Program(int addr, unsigned char dat)
{
Sector_Erase(addr);
ISP_DATA = dat;
ISP_ADDRH = addr >> 8;
ISP_ADDRL = addr & 0x00ff;
ISP_CONTR = WAITE_TIME;
ISP_CONTR = 0x80;
ISP_CMD = ISP_IAP_BYTE_PROGRAN;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
ISP_CMD = 0x7F;

}

unsigned char Byte_Read(int addr)
{
unsigned char dat;

ISP_ADDRH = addr >> 8;
ISP_ADDRL = addr & 0x00ff;
ISP_CONTR = WAITE_TIME;
ISP_CONTR = 0X80;
ISP_CMD = ISP_IAP_BYTE_READ;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
dat = ISP_DATA;
ISP_CMD = 0x00;
return dat;
}

void main(void)
{
unsigned char dat1=0;
Init_12864Word();
Byte_Program(0x2001,0x11);
dat1 = Byte_Read(0x2001);
LCM12864_wr_Cmd(0x80);
LCM12864_wr_Dat(dat1/100+0x30);
LCM12864_wr_Dat(dat1%100/10+0x30);
LCM12864_wr_Dat(dat1%10+0x30);
while(1);
}

不记得是STC12C5A60S2还是89C52的了,你看以下datasheet,主要是寄存器名称不一样,还有ISP_TRIG赋值不一样,其他的都一样。

注意:!!!!!不能字节擦除,只能扇区擦除!!!!!!
字节编程:只能将“1”改为“0” ,对“0”用字节编程是无用的。如果该字节是“1111,1111B” ,
则可将其中的“1 ”编程为“0 ” ,如果该字节中有位为“0 ” ,要将其改为“1 ” ,则须先将整个扇
区擦除,因为只有“扇区擦除”才可以将“0 ”变为“1 ” 。
扇区擦除:只有“扇区擦除”才可能将“0 ”擦除为“1 ” 。
所以写之前先将扇区擦除在写
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-14
没有单独擦除成为空白的功能,
第2个回答  2011-12-14
下次下载,自行擦出