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