久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2479|回復: 13
打印 上一主題 下一主題
收起左側

STC8F單片機eeprom可以連繼讀寫int數據嗎?拆分再寫還是怎么樣

[復制鏈接]
跳轉到指定樓層
樓主
ID:734017 發表于 2021-11-12 11:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有一個int 數據190~280
拆分再寫還是怎么樣
請教有沒好方法
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 2021-11-12 13:53 | 只看該作者
首先,STC8 是8位機, 所以,即使在C代碼表面上看你是讀寫一個16位數據,實際操作時候,還是分開讀寫2個8位的。
然后,寫得時候,一個蘿卜一個坑, 一個 IAP_ADDRH + IAP_ADDRL 對應一個地址 寫入一個8位數據。你可以做一個子函數,不牽涉到跨頁的前提下,函數里通過直接 IAP_ADDRL++; 然后 IAP_DATA = xx 可以比較快速的寫入下一個。
讀的時候相對簡單一些,可以用 unsigned short code 指針直接讀出來,(至少代碼上看,是這樣)
回復

使用道具 舉報

板凳
ID:879348 發表于 2021-11-12 13:56 | 只看該作者
STC的是假EEPROM,本質是一塊flash,可以允許連續寫入一頁數據,但是寫入前必須整塊擦除
回復

使用道具 舉報

地板
ID:734017 發表于 2021-11-12 14:42 | 只看該作者
188610329 發表于 2021-11-12 13:53
首先,STC8 是8位機, 所以,即使在C代碼表面上看你是讀寫一個16位數據,實際操作時候,還是分開讀寫2個8位 ...

void IapProgram(int addr, unsigned char dat)       
{
    IAP_CONTR = WT_24M;                
    IAP_CMD = 2;                                
    IAP_ADDRL = addr;              
    IAP_ADDRH = addr >> 8;         
    IAP_DATA = dat;               
    IAP_TRIG = 0x5a;               
    IAP_TRIG = 0xa5;               
    _nop_();                        
    IapIdle();      
}

void IapIdle()
{
        IAP_CONTR        =0;                       
        IAP_CMD                =0;                       
        IAP_TRIG         =0;                       
        IAP_ADDRH        =0x80;               
        IAP_ADDRL        =0;                       
}
IapErase(0x0000); //擦除
IapProgram(0x0000,XXX);               
IapProgram(0x0001,XXX);
IapProgram(0x0002,XXX);

連續寫可以這樣干吧,IapIdle();   是不是要從寫函數拿出來放在最后


回復

使用道具 舉報

5#
ID:624769 發表于 2021-11-12 14:56 | 只看該作者
void IapIdle() 沒有任何實際意義,完全不需要用。

把一個 16位 變量存入 Eeprom:
void WriteWord(unsigned short addr, unsigned short dat)        
{
    IAP_CONTR = WT_24M;                 
    IAP_CMD = 2;                                 
    IAP_ADDRL = addr;              
    IAP_ADDRH = addr >> 8;         
    IAP_DATA = dat >>8 ;               
    IAP_TRIG = 0x5a;               
    IAP_TRIG = 0xa5;               
    _nop_();
    if(++IAP_ADDRL == 0)   IAP_ADDRH++
    IAP_DATA = dat;               
    IAP_TRIG = 0x5a;               
    IAP_TRIG = 0xa5;               
}
回復

使用道具 舉報

6#
ID:734017 發表于 2021-11-12 15:14 | 只看該作者
188610329 發表于 2021-11-12 14:56
void IapIdle() 沒有任何實際意義,完全不需要用。

把一個 16位 變量存入 Eeprom:

if(++IAP_ADDRL == 0)   IAP_ADDRH++
地址不是0x0000,0x0001........
加高位嗎??
上次那個比較器,我弄好了,謝謝你
回復

使用道具 舉報

7#
ID:624769 發表于 2021-11-12 15:24 | 只看該作者
如果,你給的地址,正好是  0x00FF 的話, 那么, ADDRL+1 之后,需要進位,這句IF主要是判斷,是否ADDRL +1 之后 為0,是的話 就 給ADDRH +1 不是的話 ADDRH 維持原狀
回復

使用道具 舉報

8#
ID:57657 發表于 2021-11-12 15:27 | 只看該作者
16位變量請移位拆分儲存,32位、浮點數請用union結構轉換。
回復

使用道具 舉報

9#
ID:734017 發表于 2021-11-12 17:04 | 只看該作者
188610329 發表于 2021-11-12 15:24
如果,你給的地址,正好是  0x00FF 的話, 那么, ADDRL+1 之后,需要進位,這句IF主要是判斷,是否ADDRL + ...

地址是硬件自動加的嗎,還是程序加ADDRL +1
回復

使用道具 舉報

10#
ID:624769 發表于 2021-11-12 17:33 來自觸屏版 | 只看該作者
happy2058 發表于 2021-11-12 17:04
地址是硬件自動加的嗎,還是程序加ADDRL +1

當然手動加啊,沒看到++IAP_ADDRL 么?
回復

使用道具 舉報

11#
ID:734017 發表于 2021-11-12 18:15 | 只看該作者
188610329 發表于 2021-11-12 17:33
當然手動加啊,沒看到++IAP_ADDRL 么?

unsigned int IapRead_two(unsigned int addr)
{
    unsigned int dat;

    IAP_CONTR = WT_24M;
    IAP_CMD = 1;  
    IAP_ADDRL = addr;
    IAP_ADDRH = addr >> 8;
    IAP_TRIG = 0x5a;  
    IAP_TRIG = 0xa5;
    _nop_();   
    dat = IAP_DATA;  
        dat=dat<<8;
        if(++IAP_ADDRL == 0)  
                IAP_ADDRH++;
    IAP_TRIG = 0x5a;               
    IAP_TRIG = 0xa5;
        _nop_();        
        dat |= IAP_DATA;  
   // IapIdle();   
    return dat;   
}

讀兩個可以這個干嗎
下面這個程序,燒錄后第一次上電,讀了一個521,不知道為什么,還沒寫數據

SK_Data_KHz_switch        =        IapRead(0x0000);    //讀頻率8位
SK_Data_KHz        =        IapRead_two(0x0100);    //讀強度 16位
if(SK_Data_KHz!=0)                                          
{
SK_HZ_satar(SK_PWM[SK_Data_KHz_switch]);          //加載頻率                                                               
}
else
{
        SK_Data_KHz_switch=50;                    //eerporm 為什么,加載默認初值
        SK_Data_KHz=250;
}

回復

使用道具 舉報

12#
ID:624769 發表于 2021-11-12 21:39 | 只看該作者
確認一下,SK_Data_KHz  是unsigned short 么?

另外,你的 Eeprom 0x0100 處存的數據,你能確認么? 一般,為了安全起見,會在燒錄的時候,燒入指定的Eeprom數據,下載其那里可以直接輸入16進制燒錄,來確保,“讀”這個動作,是否正常的檢驗沒有其他因素干擾。
回復

使用道具 舉報

13#
ID:734017 發表于 2021-11-12 21:52 | 只看該作者
188610329 發表于 2021-11-12 21:39
確認一下,SK_Data_KHz  是unsigned short 么?

另外,你的 Eeprom 0x0100 處存的數據,你能確認么? 一 ...

unsigned short和unsigned int 是不是都是16位,我找了很多資文章都是16位。
我試一下在燒錄那個先寫入
回復

使用道具 舉報

14#
ID:734017 發表于 2021-11-13 01:22 | 只看該作者
188610329 發表于 2021-11-12 21:39
確認一下,SK_Data_KHz  是unsigned short 么?

另外,你的 Eeprom 0x0100 處存的數據,你能確認么? 一 ...

原因找到了 eeprom第一次上電時未寫入時。里部是0xff  ,我以為是0x00;
讀出來16位 存在char 數據顯示523
現在已經讀寫正常,今天非常感謝謝你。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕a√ | 国产精品一区二区免费看 | 国产精品一区二区欧美黑人喷潮水 | 亚洲毛片在线观看 | 亚洲精品一区二区三区蜜桃久 | 国产精品免费大片 | 国产成人久久久 | 色姑娘av| 欧美亚洲高清 | 成人国产一区二区三区精品麻豆 | 日韩欧美一区二区三区四区 | 久久久久国产精品人 | 免费成人高清在线视频 | 逼逼网 | 国产精品欧美大片 | 精品国产一区探花在线观看 | 伊色综合久久之综合久久 | 日本精a在线观看 | 中文字幕在线免费视频 | 精品国产一区二区三区观看不卡 | 中文字幕视频在线观看 | 久久久国产精品视频 | 99精品视频在线 | 天天操天天摸天天干 | 国产精品av久久久久久久久久 | 噜噜噜噜狠狠狠7777视频 | 欧美 日韩 中文 | 91av大全| 免费黄篇| 天天综合久久网 | 午夜小影院 | 亚洲国产一区二区三区 | 日韩欧美在线一区二区 | 日韩久久成人 | 毛片片| 福利视频网站 | 久久久久久久久久久久久久久久久久久久 | 人人玩人人干 | 日韩欧美在线观看 | 亚洲色欲色欲www | 黄色在线网站 |