標(biāo)題:
向各位大佬學(xué)習(xí):這個(gè)單片機(jī)EEPROMD的例子無法保存數(shù)據(jù)?
[打印本頁]
作者:
木示
時(shí)間:
2023-2-28 22:04
標(biāo)題:
向各位大佬學(xué)習(xí):這個(gè)單片機(jī)EEPROMD的例子無法保存數(shù)據(jù)?
這個(gè)是論壇的例子,在開發(fā)板將這個(gè)EEPROMD的例子進(jìn)行驗(yàn)證,發(fā)現(xiàn)無法保存關(guān)機(jī)前的LED 燈的狀態(tài)!不知道問題出在哪里?懇請(qǐng)高手指點(diǎn)一二!
單片機(jī)源程序如下:
/***************************************************************
作品:EEPROM實(shí)驗(yàn),開機(jī)還原關(guān)電前LED的亮滅狀況
單片機(jī):STC89C52RC
晶振:12M
編譯環(huán)境:Keil uVision4 V9.00
***************************************************************/
//#include <STC89C52RC.H>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/****************特殊功能寄存器聲明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit K1 = P3^2; //按鈕1
sbit K2 = P3^3; //按鈕2
void cc(uint addr);
void xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void Q0();
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
uchar V;
V = dcx(0x2002); // 開機(jī)讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前LED的亮滅狀況
if(V == 2) {LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
LED1=0;LED2=1;
cc(0x2000); // 擦除第1個(gè)扇區(qū)(2000h~21FFh)
xcx(0x2002,2); // 對(duì)EEPROM區(qū)2002h寫入2
}
if(!K2)
{
while(!K2);
LED1=0;LED2=0;
cc(0x2000); // 擦除第1個(gè)扇區(qū)(2000h~21FFh)
xcx(0x2002,6); // 對(duì)EEPROM區(qū)2002h寫入6
}
}
}
復(fù)制代碼
作者:
wulin
時(shí)間:
2023-3-1 07:34
/***************************************************************
作品:EEPROM實(shí)驗(yàn),開機(jī)還原關(guān)電前LED的亮滅狀況
單片機(jī):STC89C52RC
晶振:12M
編譯環(huán)境:Keil uVision4 V9.00
***************************************************************/
//#include <STC89C52RC.H>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//定義ISP的操作命令
#define RdCommand 0x01 //讀命令
#define PrgCommand 0x02 //寫命令
#define EraseCommand 0x03 //擦除命令
#define WaitTime 0x01 //定義CPU的等待時(shí)間,寫入硬件延時(shí)
/****************特殊功能寄存器聲明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit K1 = P3^2; //按鈕1
sbit K2 = P3^3; //按鈕2
/* ================ 打開 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
EA = 0; /* 關(guān)中斷 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時(shí) */
ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */
}
/* =============== 關(guān)閉 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA = 1; /* 開中斷 */
}
/* ================ 公用的觸發(fā)代碼 ==================== */
void ISPgoon(void)
{
ISP_IAP_enable(); /* 打開 ISP,IAP 功能 */
ISP_TRIG = 0x46; /* 觸發(fā)ISP_IAP命令字節(jié)1 */
ISP_TRIG = 0xb9; /* 觸發(fā)ISP_IAP命令字節(jié)2 */
_nop_();
}
/* ==================== 字節(jié)讀 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址賦值 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */
ISP_CMD = ISP_CMD | RdCommand; /* 寫入讀命令 */
ISPgoon(); /* 觸發(fā)執(zhí)行 */
ISP_IAP_disable(); /* 關(guān)閉ISP,IAP功能 */
return (ISP_DATA); /* 返回讀到的數(shù)據(jù) */
}
/* ================== 扇區(qū)擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇區(qū)地址 */
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */
ISPgoon(); /* 觸發(fā)執(zhí)行 */
ISP_IAP_disable(); /* 關(guān)閉ISP,IAP功能 */
}
/* ==================== 字節(jié)寫 ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
ISP_CMD = ISP_CMD | PrgCommand; /* 寫命令2 */
ISP_DATA = original_data; /* 寫入數(shù)據(jù)準(zhǔn)備 */
ISPgoon(); /* 觸發(fā)執(zhí)行 */
ISP_IAP_disable(); /* 關(guān)閉IAP功能 */
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
uchar V;
V = byte_read(0x2002); // 開機(jī)讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前LED的亮滅狀況
if(V == 2){LED1=0;LED2=1;}
else if(V == 6){LED1=1;LED2=0;}
else {LED1=0;LED2=0;}//首次上電EEPROM的默認(rèn)數(shù)據(jù)是0xff
while(1)
{
if(!K1)
{
delayms(10);
if(!K1)
{
LED1=0;LED2=1;
while(!K1);//等待松手
SectorErase(0x2000); // 擦除第1個(gè)扇區(qū)(2000h~21FFh)
byte_write(0x2002,2); // 對(duì)EEPROM區(qū)2002h寫入2
}
}
if(!K2)
{
delayms(10);
if(!K2)
{
LED1=1;LED2=0;
while(!K2);//等待松手
SectorErase(0x2000); // 擦除第1個(gè)扇區(qū)(2000h~21FFh)
byte_write(0x2002,6); // 對(duì)EEPROM區(qū)2002h寫入6
}
}
}
}
復(fù)制代碼
作者:
lkc8210
時(shí)間:
2023-3-1 09:10
代碼不全,請(qǐng)重貼
作者:
hi等你
時(shí)間:
2023-3-1 15:39
c語言怎么這么長,測試eeprom不要整這些按鈕啥的,直接寫個(gè)八位數(shù)據(jù)存到2000H,
下次通電直接讀取出來發(fā)送到p0口八個(gè)指示燈看看就行了,新手寫程序一個(gè)按鈕延時(shí)
就可能把擦除過程給攪黃了。
作者:
木示
時(shí)間:
2023-3-4 10:44
wulin 發(fā)表于 2023-3-1 07:34
這個(gè)例子,開機(jī)也總是回到默認(rèn)的狀態(tài)。LED1,LED2同時(shí)亮
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1