久久久久久久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久久久久久粉嫩 | 久久久久久久网 | 国产激情一区二区三区 | 狠狠综合网 | 成年人免费在线视频 | 国产在线一区二区三区 |