STC12C5A16S2内部Flash读写
扫描二维码
随时随地手机看文章
一、扇区经擦除后,扇区内的各字节均为oxff,可以进行写操作,即字节编程,若扇区的某一字节不是0xff,则无法将字节中为0的位写成1。所以保险的方法是先进行扇区擦除,即只有扇区擦除才能将扇区的0变成1。
二、如果在一个扇区中存放了大量的数据,某次只需要修改其中的一个字节或一部分字节时,则另外的不需要修改的数据须先读出放在STC单片机的RAM中,然后擦除整个扇区,再将需要保留的数据和需修改的数据按字节逐字节写回该扇区中(只有字节写命令,无连续字节写命令)。这时每个扇区使用的字节数是使用的越少越方便(不需读出一大堆需保留数据)。
三、扇区中进行多字节写入时,首先进行扇区擦除,然后进行字节编程,地址是次扇区内的首地址和末地址中的任何一个地址
////////////////////内部flash操作函数
sfr IAP_DATA=0x0c2;
sfr IAP_ADDRH=0xc3;
sfr IAP_ADDRL=0xc4;
sfr IAP_CMD=0xc5;
sfr IAP_TRIG=0xc6;
sfr IAP_CONTR=0xc7;
//扇区字节读
unsigned char read(unsigned char adder_h,unsigned char adder_l)
{
unsigned char dat;
IAP_ADDRH=adder_h;
IAP_ADDRL=adder_l;
IAP_CONTR=0x82;
IAP_CMD=0x01;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
//nop;
dat=IAP_DATA;
return dat;
}
//扇区字节写
void write(unsigned char adder_h,unsigned char adder_l,unsigned char dat)
{
IAP_DATA=dat;
IAP_ADDRH=adder_h;
IAP_ADDRL=adder_l;
IAP_CONTR=0x82;
IAP_CMD=0x02;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
//nop;
}
void del(unsigned char adder_h,unsigned char adder_l)
{
IAP_ADDRH=adder_h;
IAP_ADDRL=adder_l;
IAP_CONTR=0x82;
IAP_CMD=0x03;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
}
//把设置的闹钟值存进单片机内部flash函数
void restore(unsigned char hour,unsigned char min)
{
del(0x00,0x00);//将扇区内的每个字节都变成0xff
delay_5ms();
write(0x00,0x00,hour);//第一个扇区的第一个地址存放设置的小时值
delay_5ms();
write(0x02,0x00,min);//第二个扇区的第一个地址存放设置的fen值
}