STC90/89系列內(nèi)部 EEPROM 放數(shù)據(jù)(C語(yǔ)言)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
STC90/89系列內(nèi)部EEPROM放數(shù)據(jù)(C語(yǔ)言)
#include
#include
//sfr16DPTR=0x82;
/*新增特殊功能寄存器定義*/
sfrISP_DATA=0xe2;
sfrISP_ADDRH=0xe3;
sfrISP_ADDRL=0xe4;
sfrISP_CMD=0xe5;
sfrISP_TRIG=0xe6;
sfrISP_CONTR=0xe7;
/*定義命令*/
#defineREAD_AP_and_Data_Memory_Command0x01/*字節(jié)讀數(shù)據(jù)存儲(chǔ)區(qū)*/
#definePROGRAM_AP_and_Data_Memory_Command0x02/*字節(jié)編程數(shù)據(jù)存儲(chǔ)區(qū)*/
#defineSECTOR_ERASE_AP_and_Data_Memory_Command0x03/*扇區(qū)擦除數(shù)據(jù)存儲(chǔ)區(qū)*/
typedefunsignedcharINT8U;/*8bit無(wú)符號(hào)整型*/
typedefunsignedintINT16U;/*16bit無(wú)符號(hào)整型*/
#defineDELAY_CONST60000
/*定義常量*/
#defineERROR0
#defineOK1
sbitBegin_LED=P1^0;
sbitERROR_LED=P1^3;
sbitOK_LED=P1^7;
/*定義Flash操作等待時(shí)間*/
#defineMCU_CLOCK_40MHz
//#defineMCU_CLOCK_20MHz
//#defineMCU_CLOCK_10MHz
//#defineMCU_CLOCK_5MHz
#ifdefMCU_CLOCK_40MHz
#defineWAIT_TIME0x00
#endif
#ifdefMCU_CLOCK_20MHz
#defineWAIT_TIME0x01
#endif
#ifdefMCU_CLOCK_10MHz
#defineWAIT_TIME0x02
#endif
#ifdefMCU_CLOCK_5MHz
#defineWAIT_TIME0x03
#endif
/*調(diào)試控制項(xiàng)*/
//#defineDEBUG_STC89C_LE58RD+
#defineDEBUG_STC89C_LE52RC
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR1
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR2
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR4
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR8
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR16
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR32
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR64
#defineUSED_BYTE_QTY_IN_ONE_SECTOR128
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR256
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR512
INT8Uxdataprotect_buffer[USED_BYTE_QTY_IN_ONE_SECTOR];
#ifdefDEBUG_STC89C_LE58RD+//STC89C58RD+,89LE58RD+
#defineDEBUG_AP_Memory_Begin_Sector_addr0x0000
#defineDEBUG_AP_Memory_End_Sector_addr0x7e00
#defineDEBUG_AP_Memory_End_Byte_addr0x7fff
#defineDEBUG_Data_Memory_Begin_Sector_addr0x8000
#endif
#ifdefDEBUG_STC89C_LE52RC//STC89C52RC,89LE52RC
#defineDEBUG_AP_Memory_Begin_Sector_addr0x0000
#defineDEBUG_AP_Memory_End_Sector_addr0x1e00
#defineDEBUG_AP_Memory_End_Byte_addr0x1fff
#defineDEBUG_Data_Memory_Begin_Sector_addr0x2000
#endif
/*打開(kāi)ISP,IAP功能*/
voidISP_IAP_enable(void)
{
EA=0;/*關(guān)中斷*/
ISP_CONTR=ISP_CONTR&0x18;/*0001,1000*/
ISP_CONTR=ISP_CONTR|WAIT_TIME;
ISP_CONTR=ISP_CONTR|0x80;/*1000,0000*/
}
/*關(guān)閉ISP,IAP功能*/
voidISP_IAP_dISAble(void)
{
ISP_CONTR=ISP_CONTR&0x7f;/*0111,1111*/
ISP_TRIG=0x00;
EA=1;/*開(kāi)中斷*/
}
/*字節(jié)讀*/
INT8Ubyte_read(INT16Ubyte_addr)
{
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/
ISP_IAP_enable();
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_IAP_disable();
return(ISP_DATA);
}
/*扇區(qū)擦除*/
INT8Usector_erase(INT16Usector_addr)
{
INT16Uget_sector_addr=0;
get_sector_addr=(sector_addr&0xfe00);/*1111,1110,0000,0000;取扇區(qū)地址*/
ISP_ADDRH=(INT8U)(get_sector_addr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;/*0000,0011*/
ISP_IAP_enable();
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
ISP_IAP_disable();
returnOK;
}
/*字節(jié)編程*/
INT8Ubyte_program(INT16Ubyte_addr,INT8Uoriginal_data)
{
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;/*0000,0010*/
ISP_DATA=original_data;
ISP_IAP_enable();
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
ISP_IAP_disable();
returnOK;
}
/*字節(jié)編程并校驗(yàn)*/
INT8Ubyte_program_and_verify(INT16Ubyte_addr,INT8Uoriginal_data)
{
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;/*0000,0010*/
ISP_DATA=original_data;
ISP_IAP_enable();
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_DATA=0x00;
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
ISP_IAP_disable();
if(ISP_DATA==original_data)
returnOK;
else
returnERROR;
}
/*寫(xiě)數(shù)據(jù)進(jìn)數(shù)據(jù)Flash存儲(chǔ)器,只在同一個(gè)扇區(qū)內(nèi)寫(xiě),不保留原有數(shù)據(jù)*/
/*begin_addr,被寫(xiě)數(shù)據(jù)Flash開(kāi)始地址;counter,連續(xù)寫(xiě)多少個(gè)字節(jié);array[],數(shù)據(jù)來(lái)源*/
INT8Usequential_write_flash_in_one_sector(INT16Ubegin_addr,INT16Ucounter,INT8Uarray[])
{
INT16Ui=0;
INT16Uin_sector_begin_addr=0;
INT16Usector_addr=0;
/*判是否是有效范圍,此函數(shù)不允許跨扇區(qū)操作*/
if(counter>USED_BYTE_QTY_IN_ONE_SECTOR)
returnERROR;
in_sector_begin_addr=begin_addr&0x01ff;/*0000,0001,1111,1111*/
if((in_sector_begin_addr+counter)>USED_BYTE_QTY_IN_ONE_SECTOR)
returnERROR;
/*擦除要修改/寫(xiě)入的扇區(qū)*/
sector_addr=(begin_addr&0xfe00);/*1111,1110,0000,0000;取扇區(qū)地址*/
ISP_ADDRH=(INT8U)(sector_addr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;/*0000,0011*/
ISP_IAP_enable();
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
for(i=0;i
/*寫(xiě)一個(gè)字節(jié)*/
ISP_ADDRH=(INT8U)(begin_addr>>8);
ISP_ADDRL=(INT8U)(begin_addr&0x00ff);
ISP_DATA=array[i];
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;/*0000,0010*/
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
/*讀回來(lái)*/
ISP_DATA=0x00;
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
/*比較對(duì)錯(cuò)*/
if(ISP_DATA!=array[i])
{
ISP_IAP_disable();
returnERROR;
}
begin_addr++;
}
ISP_IAP_disable();
returnOK;
}
/*寫(xiě)數(shù)據(jù)進(jìn)數(shù)據(jù)Flash存儲(chǔ)器(EEPROM),只在同一個(gè)扇區(qū)內(nèi)寫(xiě),保留同一扇區(qū)中不需修改的數(shù)據(jù)*/
/*begin_addr,被寫(xiě)數(shù)據(jù)Flash開(kāi)始地址;counter,連續(xù)寫(xiě)多少個(gè)字節(jié);array[],數(shù)據(jù)來(lái)源*/
INT8Uwrite_flash_with_protect_in_one_sector(INT16Ubegin_addr,INT16Ucounter,INT8Uarray[])
{
INT16Ui=0;
INT16Uin_sector_begin_addr=0;
INT16Usector_addr=0;
INT16Ubyte_addr=0;
/*判是否是有效范圍,此函數(shù)不允許跨扇區(qū)操作*/
if(counter>USED_BYTE_QTY_IN_ONE_SECTOR)
returnERROR;
in_sector_begin_addr=begin_addr&0x01ff;/*0000,0001,1111,1111*/
/*假定從扇區(qū)的第0個(gè)字節(jié)開(kāi)始,到USED_BYTE_QTY_IN_ONE_SECTOR-1個(gè)字節(jié)結(jié)束,后面部分不用,程序易編寫(xiě)*/
if((in_sector_begin_addr+counter)>USED_BYTE_QTY_IN_ONE_SECTOR)
returnERROR;
/*將該扇區(qū)數(shù)據(jù)0-(USED_BYTE_QTY_IN_ONE_SECTOR-1)字節(jié)數(shù)據(jù)讀入緩沖區(qū)保護(hù)*/
sector_addr=(begin_addr&0xfe00);/*1111,1110,0000,0000;取扇區(qū)地址*/
byte_addr=sector_addr;/*扇區(qū)地址為扇區(qū)首字節(jié)地址*/
ISP_IAP_enable();
for(i=0;i
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
protect_buffer[i]=ISP_DATA;
byte_addr++;
}
/*將要寫(xiě)入的數(shù)據(jù)寫(xiě)入保護(hù)緩沖區(qū)的相應(yīng)區(qū)域,其余部分保留*/
for(i=0;i
protect_buffer[in_sector_begin_addr]=array[i];
in_sector_begin_addr++;
}
/*擦除要修改/寫(xiě)入的扇區(qū)*/
ISP_ADDRH=(INT8U)(sector_addr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;/*0000,0011*/
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
/*將保護(hù)緩沖區(qū)的數(shù)據(jù)寫(xiě)入DataFlash,EEPROM*/
byte_addr=sector_addr;/*扇區(qū)地址為扇區(qū)首字節(jié)地址*/
for(i=0;i
/*寫(xiě)一個(gè)字節(jié)*/
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);
ISP_DATA=protect_buffer[i];
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;/*0000,0010*/
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
/*讀回來(lái)*/
ISP_DATA=0x00;
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/
ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令*/
ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令*/
_nop_();
/*比較對(duì)錯(cuò)*/
if(ISP_DATA!=protect_buffer[i])
{
ISP_IAP_disable();
returnERROR;
}
byte_addr++;
}
ISP_IAP_disable();
returnOK;
}
/*測(cè)試常量數(shù)組*/
INT8UcodeTest_array_total[512]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,
0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
0xc8,0xc9,0xca,0xcb,0xCC,0xcd,0xce,0xcf,
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,
0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,
0xef,0xee,0xed,0xec,0xeb,0xea,0xe9,0xe8,
0xe7,0xe6,0xe5,0xe4,0xe3,0xe2,0xe1,0xe0,
0xdf,0xde,0xdd,0xdc,0xdb,0xda,0xd9,0xd8,
0xd7,0xd6,0xd5,0xd4,0xd3,0xd2,0xd1,0xd0,
0xcf,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,
0xc7,0xc6,0xc5,0xc4,0xc3,0xc2,0xc1,0xc0,
0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,
0xb7,0xb6,0xb5,0xb4,0xb3,0xb2,0xb1,0xb0,
0xaf,0xae,0xad,0xac,0xab,0xaa,0xa9,0xa8,
0xa7,0xa6,0xa5,0xa4,0xa3,0xa2,0xa1,0xa0,
0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x99,0x98,
0x97,0x96,0x95,0x94,0x93,0x92,0x91,0x90,
0x8f,0x8e,0x8d,0x8c,0x8b,0x8a,0x89,0x88,
0x87,0x86,0x85,0x84,0x83,0x82,0x81,0x80,
0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,
0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,
0x6f,0x6e,0x6d,0x6c,0x6b,0x6a,0x69,0x68,
0x67,0x66,0x65,0x64,0x63,0x62,0x61,0x60,
0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x58,
0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,
0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,
0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,
0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,
0x33,0x36,0x35,0x34,0x33,0x32,0x31,0x30,
0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,
0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,
0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,
0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,
0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,
0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00
};
voiddisplay_Begin_LED(void)
{
Begin_LED=0;/*Begin_LEDon*/
}
voidoff_Begin_LED(void)
{
Begin_LED=1;/*Begin_LEDoff*/
}
voiddisplay_OK_LED(void)
{
OK_LED=0;/*OK_LEDon*/
}
voidoff_OK_LED(void)
{
OK_LED=1;/*OK_LEDoff*/
}
voiddisplay_ERROR_LED(void)
{
ERROR_LED=0;/*ERROR_LEDon*/
}
voidoff_ERROR_LED(void)
{
ERROR_LED=1;/*ERROR_LEDoff*/
}
voiddelay(INT16Ucounter)
{
INT16Utemp=0;
for(temp=counter;temp>0;temp--)
{
_nop_();
_nop_();
_nop_();
}
}
voidmain()
{
//sbitBegin_LED=P1^0;
//sbitERROR_LED=P1^3;
//sbitOK_LED=P1^7;
display_Begin_LED();
delay(DELAY_CONST);
sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);
if(byte_program_and_verify(DEBUG_Data_Memory_Begin_Sector_addr,0x55)==OK)
display_OK_LED();
else
display_ERROR_LED();
/*
if(sequential_write_flash_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr,USED_BYTE_QTY_IN_ONE_SECTOR,Test_array_total))
display_OK_LED();
else
display_ERROR_LED();
*/
/*
if(write_flash_with_protect_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr+0x3,USED_BYTE_QTY_IN_ONE_SECTOR-0x30,Test_array_total))
display_OK_LED();
else
display_ERROR_LED();
*/
while(1);
}