久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STC8H單片機里面EEPROM檢查是否第一次上電問題
[打印本頁]
作者:
asdadqw2
時間:
2024-7-4 11:29
標題:
STC8H單片機里面EEPROM檢查是否第一次上電問題
我這里的 if(dat != First_ON) //檢測是否第一次上電 我這個程序無論多少次上電都會觸發條件,求各位大佬指點一下為啥
#define First_ON 0x88
void main()
{
unsigned char dat;
Uart1_Init();
dat = IapRead(0x0200);
sendByte(dat);
sendByte(IapRead(0x0000));
if(dat != First_ON) //檢測是否第一次上電
{
IapProgram(0x0200, 0x88);
sendByte(IapRead(0x0200));
IapProgram(0x0000, 0x0A);
dat = 1;
}
sendByte(dat);
dat = IapRead(0x0000);
sendByte(dat);
IapErase(0x0000);
dat = IapRead(0x0000);
sendByte(dat);
IapProgram(0x0000, 0x05);
dat = IapRead(0x0000);
sendByte(dat);
while(1);
}
void Uart1_Init(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數據,可變波特率
AUXR &= 0xBF; //定時器時鐘12T模式
AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x20; //設置定時器模式
TL1 = 0xFA; //設置定時初始值
TH1 = 0xFA; //設置定時重載值
ET1 = 0; //禁止定時器中斷
TR1 = 1; //定時器1開始計時
}
void IapIdle()
{
IAP_CONTR = 0; //關閉IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除觸發寄存器
IAP_ADDRH = 0x80; //將地址設置到非IAP區域
IAP_ADDRL = 0;
}
char IapRead(int addr) //扇區讀取函數 讀一個字節
{
char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 11; //設置等待參數12MHz
IAP_CMD = 1; //設置IAP讀命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_();
dat = IAP_DATA; //讀IAP數據
IapIdle(); //關閉IAP功能
return dat;
}
void IapProgram(int addr, char dat) //寫一個字節
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 11; //設置等待參數12MHz
IAP_CMD = 2; //設置IAP寫命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_DATA = dat; //寫IAP數據
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_();
IapIdle(); //關閉IAP功能
}
void IapErase(int addr) //扇區擦除函數
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 11; //設置等待參數12MHz
IAP_CMD = 3; //設置IAP擦除命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //
IapIdle(); //關閉IAP功能
}
作者:
asdadqw2
時間:
2024-7-4 11:46
我用串口輸出檢測到第二次上電時,dat已經是等于0x88了,但是還是滿總條件進入IF里面了
作者:
IdeaMing
時間:
2024-7-4 15:36
直接改if(dat != 0x88)試試
沒看出來問題。
作者:
hy47566398
時間:
2024-7-5 05:25
if(dat != First_ON) //檢測是否第一次上電
{
IapErase(0x0200); //
IapProgram(0x0200, 0x88);
sendByte(IapRead(0x0200));
IapErase(0x0000); //
IapProgram(0x0000, 0x0A);
dat = 1;
}
作者:
asdadqw2
時間:
2024-7-5 08:34
IdeaMing 發表于 2024-7-4 15:36
直接改if(dat != 0x88)試試
沒看出來問題。
這樣也不行,這樣也會每次觸發
作者:
devcang
時間:
2024-7-5 10:07
應該是符號(char 和 unsigned char)問題,,,,沒芯片環境測試。
用別的單片機試了一下,和8#說的原因一致。
作者:
123156fsadf
時間:
2024-7-5 10:45
asdadqw2 發表于 2024-7-5 08:34
這樣也不行,這樣也會每次觸發
你要改成if(dat == First_ON)吧?!=感覺不對啊
作者:
123156fsadf
時間:
2024-7-5 10:46
IapProgram(0x0000, 0x0A);你看看這個是不是按頁擦除的,可能是你寫0x0000地址的時候,把0x0200的數據也一起擦除掉了
作者:
cocolala
時間:
2024-7-5 13:55
單片機型號很關鍵,STC8H說的太籠統了。有些出廠是沒有片內EEPROM的,盡可能選擇出廠就帶EEPROM的來測試。
作者:
fosu頑童
時間:
2024-7-10 16:54
燒錄勾選擦除后,初次上電去讀取數據,數據值默認是0XFF,我是參考STC8H EEPROM的例程《EEPROM基本操作》得出的結論。
這樣改判斷語句:如果dat==0XFF 就被認為初次上電,然后賦dat某一個值進行“復位”。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲成人三级
|
brazzers精品成人一区
|
一级片免费播放
|
国产肉体xxxx裸体784大胆
|
国产精品久久久久久久午夜
|
亚洲视频中文字幕
|
国产免费福利
|
日韩一区在线播放
|
精品日韩av
|
国产真实乱人偷精品
|
欧美不卡在线
|
小sao货撅起屁股扒开c微博
|
成人在线观看网址
|
黄色片在线看
|
欧美视频在线观看免费
|
国产福利在线播放
|
久久视频免费在线观看
|
免费看黄视频网站
|
国产九九精品
|
国产成人精品一区二区
|
亚洲一区二区三区在线视频
|
日本加勒比在线观看
|
亚洲视频一区二区三区
|
触手繁殖の地狱3d啪啪
|
午夜视频在线免费观看
|
在线观看二区
|
免费在线小视频
|
欧美一区不卡
|
在线观看黄色小视频
|
中文字幕在线观
|
日韩精品视频在线播放
|
国产午夜视频在线观看
|
免费黄网站
|
91在线视频播放
|
综合久久久
|
99国产精品99久久久久久粉嫩
|
久久久久久久网
|
国产激情一区二区三区
|
狠狠综合网
|
成年人免费在线视频
|
国产在线一区二区三区
|