|
怎樣把stc15w104單片機(jī)EEPROM的內(nèi)容讀出來?
或者顯示到液晶1602上?
void IAP_Disable()
{
//關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
IAP_CONTR = 0; //關(guān)閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
IAP_TRIG = 0; //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
//讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
unsigned char Byte_Read(unsigned int add)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x01; //IAP/ISP/Eeprom 字節(jié)讀命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
//EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
return (IAP_DATA);
}
//字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
void Byte_Program(unsigned int add, unsigned char ch)
{
IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x02; //IAP/ISP/Eeprom 字節(jié)編程命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_DATA = ch; //要編程的數(shù)據(jù)先送進(jìn)IAP_DATA 寄存器
//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
//EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
}
//擦除扇區(qū), 入口:DPTR = 扇區(qū)地址
void Sector_Erase(unsigned int add)
{
IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x03; //IAP/ISP/Eeprom 扇區(qū)擦除命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
//EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
}
//讀取Eeprom中的運(yùn)行參數(shù)數(shù)據(jù),以便程序調(diào)用
void EepromRead(unsigned int Eeprom_Address, unsigned char MaxPara, unsigned int *P)
{
unsigned char i;
for( i=0; i<MaxPara; i++ )
{
*P =(unsigned int)(Byte_Read(Eeprom_Address+i*2))*0xFF+Byte_Read(Eeprom_Address+1+i*2); //讀Eeprom的值,存到read_Eeprom
P++;
}
}
//存儲(chǔ)系統(tǒng)參數(shù),以便將來應(yīng)用
void EepromSave(unsigned int Eeprom_Address, unsigned char MaxPara, unsigned int *P)
{
unsigned char i;
Sector_Erase(Eeprom_Address);
for( i=0; i<MaxPara; i++ )
{
Byte_Program(Eeprom_Address+i*2,(unsigned char)( *P /0xFF));
Byte_Program(Eeprom_Address+i*2+1,(unsigned char)( *P %0xFF));
P++;
}
}
//Eeprom出廠設(shè)置
void EepromFactory(void)
{
MemorySys[DTime0] = 200; //系統(tǒng)參數(shù)200;,240
MemorySys[DTime1] = 100;
MemorySys[DTime2] = 200;
MemorySys[DTime3] = 200;
MemorySys[DTime4] = 100;
MemorySys[DTime5] = 300; //編碼器方向
EepromSave(0x0000, SysTotal, MemorySys);//保存系統(tǒng)參數(shù)
DelayMS(100);
}
|
|