我也來湊個熱鬧:
#define ReadRomString_CALL
#define WriteRomString_CALL
//*************************************
// 函數名稱:ReadRomByte
// 函數功能:從ROM的某一地址讀數據
// 入口參數:所讀數據的地址
// 出口參數:所讀地址的數據
//***************************************
uint8 ReadRomByte(uint8 addr)
{
uint8 num;
while(RD==1);//等待讀完成
EEADR=addr;//寫入要讀的址址
EEPGD=0;//操作EEPROM
RD=1;//執行讀操作
while(RD==1);//等待讀完成
num=EEDATA;
return num;//返回讀取的數據
}
//*************************************
// 函數名稱:WriteRomByte
// 函數功能:從RAM的某一地址寫數據
// 入口參數:所寫數據的地址及數據
// 出口參數:無
//***************************************
void WriteRomByte(uint8 addr,uint8 data)
{
uint8 Tmp ;
uint8 i ;
Tmp = ReadRomByte(addr) ;
if(Tmp == data) return ; //如果讀出數據與要寫的數一樣 直接返回
for(i=3;i>0;i--)//最多寫三次
{
while(WR==1);//等待寫完成
EEADR=addr;//寫入地址信息
EEDATA=data;//寫入數據信息
EEPGD=0;//操作EEPROM
WREN=1; //寫EEPROM允許
EECON2=0x55;//寫入特定時序
EECON2=0xaa;
WR=1; //執行寫操作
while(WR==1);//等待寫完成
WREN=0;//禁止寫入EEPROM
Tmp = ReadRomByte(addr) ;
if(Tmp == data)
{
break ;
}
}
}
//*************************************
// 函數名稱:ReadRomString
// 函數功能:從RAM讀一連串的數據
// 入口參數:所讀數據的首地址 讀得的數據的存放首地址 讀數據 長度
// 出口參數:所讀地址的數據
/***************************************/
#ifdef ReadRomString_CALL
void ReadRomString(uint8 InAddr,uint8 *OutAddr,uint8 DataLong)
{
uint8 i ;
for(i=DataLong;i>0;i--)
{
while(RD==1);//等待讀完成
EEADR = InAddr;//寫入要讀的址址
EEPGD = 0;//操作EEPROM
RD = 1;//執行讀操作
while(RD==1);//等待讀完成
*OutAddr = EEDATA;
InAddr ++ ; //存儲地址加1
OutAddr ++ ; //數據地址加1
}
}
#endif //ReadRomString_CALL
//*************************************
// 函數名稱:WriteRomString
// 函數功能:從RAM寫一連串的數據
// 入口參數:要寫進RAM的首地址 要寫的數據 寫數據的長度
// 出口參數:無
/***************************************/
#ifdef WriteRomString_CALL
void WriteRomString(uint8 InAddr,uint8 *InData,uint8 DataLong)
{
uint8 i,j;
uint8 Tmp ;
for(i=DataLong;i>0;i--)
{
//讀出的和要寫的數據一致 直接寫下一個數據
Tmp = ReadRomByte(InAddr) ;
if(Tmp != (*InData)) //讀數據與要寫數據不一至 進行寫 操作
{
for(j=3;j>0;j--)//最多寫三次
{
while(WR==1);//等待寫完成
EEADR = InAddr;//寫入地址信息
EEDATA = *InData;//寫入數據信息
EEPGD = 0;//操作EEPROM
WREN = 1; //寫EEPROM允許
EECON2 = 0x55;//寫入特定時序
EECON2 = 0xaa;
WR = 1; //執行寫操作
while(WR==1);//等待寫完成
WREN = 0;//禁止寫入EEPROM
Tmp = ReadRomByte(InAddr) ;
if(Tmp == (*InData))
{
break ;
}
}
}
InAddr ++ ; //存儲地址加1
InData ++ ; //數據地址加1
}
}
#endif //WriteRomString_CALL
// 結束 本文源自 http://blog.csdn.net/libiaojs/article/details/9418357
|