<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STC89C5x系列單片機內部EEPROM

STC89C5x系列單片機內部EEPROM

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏
//(c)Copyright2007-2017,GuozhouChen.AllRightsReserved.

/********************************************************************************
*個(gè)人申明:*
*本人在運用STC89C5x系列單片機內部EEPROM時(shí),了解其對非0xff值的存儲空間*
*不能通過(guò)字節編程直接寫(xiě)入。這一約定可能給一些人帶來(lái)應用的麻煩,所以本*
*人決定編寫(xiě)一能夠讓程序員不考慮這一約定的API。經(jīng)過(guò)幾個(gè)小時(shí)的編寫(xiě)和調*
*試,基本能達到本人原本設想的目標。由于時(shí)間倉促及個(gè)人水平有限,不免會(huì )*
*有些算法低效,還望高手指教。Email:chenguozhou1982@yahoo.com.cn。*
**
*本程序通過(guò)改幾個(gè)宏定義可以運用到STC的很多型號MCU上,本人只測試了*
*STC89C5x系列*

*本程序可以任意修改和傳播,修改者請注明修改人、修改時(shí)間,傳播過(guò)程請注*
*明原著(zhù)。不得用于任何商業(yè)目的。*
**
********************************************************************************
*FileName:EEPROM.C,V0.2.0*
*Author:GuozhouChen*
*Date:2007.09.15*
**
********************************************************************************
*使用數據類(lèi)型說(shuō)明:*
*UINT:16位無(wú)符號整形*
*BYTE:8位無(wú)符號字符型*
*BOOL:1位布爾類(lèi)型*
**
********************************************************************************
*直接調用的API說(shuō)明:*
**
*讀函數原形:UINTEEPROM_ReadBytes(UINTaddr,BYTE*buf,UINTsize)*
*函數返回為UINT類(lèi)型的實(shí)際讀出數據字節數。*
*參數說(shuō)明:addr為需要讀取EEPROM區域的第一字節地址,取值范圍為內部*
*EEPROM除最后一扇區外的地址,因最后一扇區被犧牲做為緩存。*
*buf為目的數據區指針,即指向保存讀出數據區域的首地址。*
*size為要求讀出數據的字節數*
**
*寫(xiě)函數原形:UINTEEPROM_WritBytes(UINTaddr,BYTE*buf,UINTsize)*
*函數返回為UINT類(lèi)型的實(shí)際寫(xiě)入數據字節數。*
*參數說(shuō)明:addr為需要寫(xiě)入EEPROM區域的第一字節地址,取值范圍為內部*
*EEPROM除最后一扇區外的地址,因最后一扇區被犧牲做為緩存。*
*buf為源數據區指針,即指向需要寫(xiě)入數據區域的首地址。*
*size為要求寫(xiě)入數據的字節數*
**
********************************************************************************
*使用說(shuō)明:*
*1、根據MCU和編譯器的實(shí)際情況修改幾個(gè)宏定義和數據類(lèi)型定義。宏定義和數據類(lèi)*
*型定義部分可以單獨寫(xiě)成頭文件。*
*2、在需要使用EEPROM_ReadBytes()和EEPROM_WritBytes()函數的文件中做個(gè)*
*原形申明。*
*3、在需要的地方直接添入實(shí)參調用即可。*
**
********************************************************************************/

/********************************************************************************
**
*頭文件*
**
********************************************************************************/
#include"STC89C5x.h"

/********************************************************************************
**
*數據類(lèi)型定義*
**
********************************************************************************/
typedefunsignedintUINT;
typedefunsignedcharBYTE;
typedefbitBOOL;

/********************************************************************************
**
*宏定義*
**
********************************************************************************/
#defineBYTES_EACH_SECTOR512//MCUEEPROM每扇區的字節數

//CPU等待時(shí)間,晶振0-5M設置為3,5-10M為2,10-20M為1,大于20M為0
#defineWAIT_TIME0

#defineUSEING_EACH_SECTOR512//計劃每扇區要用的字節數,用量越小寫(xiě)速度越快

#defineEEPROM_ADDR_START0x2000//EEPROM起始地址
#defineEEPROM_ADDR_END0x2fff//EEPROM結束地址


/********************************************************************************
**
*從指定首地址為addr的EEPROM區域讀出size字節數據到buf指向的區域內,并返回實(shí)際讀*
*出數據的字節數*
**
********************************************************************************/

UINTEEPROM_ReadBytes(UINTaddr,BYTE*buf,constUINTsize)
{
BOOLold_EA;

BYTE*p_buf;
UINTi,current_size;

p_buf=buf;
current_size=0;

ISP_CMD=0x01;
ISP_CONTR=0x80|WAIT_TIME;

for(i=0;i{
//地址越界檢測
if((addrEEPROM_ADDR_END))
{
break;
}

ISP_ADDRH=addr>>8;
ISP_ADDRL=addr&0x00ff;

old_EA=EA;
EA=0;

ISP_TRIG=0x46;
ISP_TRIG=0xB9;

EA=old_EA;

*p_buf=ISP_DATA;

addr++;
p_buf++;
current_size++;

}
ISP_CMD=0x00;
ISP_CONTR=0x00;

returncurrent_size;
}

/********************************************************************************
**
*把buf指向單元內的數據寫(xiě)入地址為addr的EEPROM單元內,成功返回1,或則返回0*
**
********************************************************************************/
BOOLEEPROM_WritByte(UINTaddr,BYTE*buf)
{
BOOLold_EA;

if((addrEEPROM_ADDR_END))
{
return0;
}

ISP_CMD=0x02;
ISP_CONTR=0x80|WAIT_TIME;

ISP_DATA=(*buf);

ISP_ADDRH=addr>>8;
ISP_ADDRL=addr&0x00ff;

old_EA=EA;
EA=0;

ISP_TRIG=0x46;
ISP_TRIG=0xB9;

EA=old_EA;

ISP_CMD=0x00;
ISP_CONTR=0x00;

return1;
}

/********************************************************************************
**
*擦除AddrInSector地址所在的整個(gè)扇區*
**
********************************************************************************/
voidErasureAllSector(UINTAddrInSector)
{
BOOLold_EA;

ISP_CMD=0x03;
ISP_CONTR=0x80|WAIT_TIME;

ISP_ADDRH=AddrInSector>>8;
ISP_ADDRL=AddrInSector&0x00ff;

old_EA=EA;
EA=0;

ISP_TRIG=0x46;
ISP_TRIG=0xB9;

EA=old_EA;

ISP_CMD=0x00;
ISP_CONTR=0x00;
}

/********************************************************************************
**
*從首地址為src扇區單元拷貝連續size字節數據到首地址為des的連續扇區單元內,并返*
*回實(shí)際拷貝的字節數*
**
********************************************************************************/
UINTCopySector(UINTsrc,UINTdes,constUINTsize)
{
BYTEtemp;
UINTcurrent_size,i;

current_size=0;

for(i=0;i{
if(!EEPROM_ReadBytes(src,&temp,1))
{
break;
}

if(!EEPROM_WritByte(des,&temp))
{
break;
}

des++;
src++;
current_size++;
}

returncurrent_size;
}

/********************************************************************************
**
*把buf指向區域內的size字節數據寫(xiě)入首地址為addr的EEPROM連續區域,并返回實(shí)際寫(xiě)入*
*數據的字節數*
**
********************************************************************************/
UINTEEPROM_WritBytes(UINTaddr,BYTE*buf,constUINTsize)
{
BYTE*p_buf,temp,move;

UINTi,bufaddr,current_size,cur_sector_start_addr;

p_buf=buf;

move=0;
current_size=0;

for(i=0;i{
if(!EEPROM_ReadBytes(addr,&temp,1))
{
break;
}

if(temp==0xff)
{
EEPROM_WritByte(addr,p_buf);
}
//發(fā)現第一個(gè)單元不是0xff,要從新寫(xiě)入數據需要做擦除整個(gè)扇區
else
{
//擦除用作緩沖的這個(gè)扇區
ErasureAllSector(EEPROM_ADDR_END);

cur_sector_start_addr=addr&0xfe00;

//把第一個(gè)非0xff單元前的數據拷貝到緩沖扇區
CopySector(cur_sector_start_addr
,(EEPROM_ADDR_END+1-BYTES_EACH_SECTOR)
,(addr-cur_sector_start_addr));

//計算剩余需要存儲的數據需寫(xiě)入緩沖扇區的首個(gè)單元地址
bufaddr=(addr-cur_sector_start_addr)
+(EEPROM_ADDR_END+1-BYTES_EACH_SECTOR);

//把剩余要存儲的數據寫(xiě)入緩沖扇區
for(;i{
EEPROM_WritByte(bufaddr,p_buf);

addr++;
bufaddr++;
p_buf++;
current_size++;
}

//把需要改變區域后的數據寫(xiě)入緩沖扇區
if(addr{
CopySector(addr,bufaddr,USEING_EACH_SECTOR
-(addr-cur_sector_start_addr));
}

//擦除當前扇區
ErasureAllSector(cur_sector_start_addr);
move=1;
break;
}

addr++;
p_buf++;
current_size++;
}

if(move)
{
//把緩沖扇區數據拷貝到當前扇區
CopySector((EEPROM_ADDR_END-BYTES_EACH_SECTOR+1)
,cur_sector_start_addr,USEING_EACH_SECTOR);
}

returncurrent_size;
}
/*****************************Nothingbelowthisline***************************/


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>