找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求一段STC8單片機系列的EEPROM的程序參考學習

[復制鏈接]
跳轉到指定樓層
樓主
ID:476909 發(fā)表于 2019-8-19 15:13 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
新手初學單片機,前期進度正常,但到了EEPROM時瞬間卡殼了,網上找資料找教程始終不得要領。冒昧來此求助。
如遇大家?guī)椭,不勝感激?/font>

想求一段單獨的EEPROM的讀寫及保存的C程序來參考學習。
如下
STC8F2K16S2這個芯片為例吧(手頭上有這個片子)。
一個共陰的數碼管,一位或者四位都行,這個不重要
不去考慮硬件電路,比如上拉或者限流電阻等,。
就簡單的將數碼管管腳接到某段IO上,比如P2端口。
外部EEPROM的各種操作簡單通過三個或四個按鍵來實現吧,比如:一個設置鍵、一個增加鍵、一個移位鍵吧。這幾個鍵隨便接某幾個IO即可。
通過設置鍵進EEPROM讀,增加配合移位健來寫操作,最后設置鍵保存修改后的數據即可。
比如設置兩個需要讀寫的參數AAABBB,令AAA初始值為1,BBB初始值為2AAABBB的范圍都是0~9即可

不知道有沒有師傅能耽誤些時間給一段參考學習的程序。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:476909 發(fā)表于 2019-8-19 15:30 | 只看該作者
忘了一點,最好是用STC的內部EEPROM
回復

使用道具 舉報

板凳
ID:401564 發(fā)表于 2019-8-20 08:15 | 只看該作者
單片機的數據手冊都是有例程的,你可以看一下數據手冊的,C和匯編都有,但如果你說你看不明白,那就沒有辦法了
回復

使用道具 舉報

地板
ID:213173 發(fā)表于 2019-8-20 09:34 | 只看該作者
一時 發(fā)表于 2019-8-19 15:30
忘了一點,最好是用STC的內部EEPROM

基于STC官方示例給你寫了一個內置EEPROM鍵控單字節(jié)測試程序,0~9共陰單數碼管靜態(tài)顯示。初始值5,每次操作后保存數據,斷電后重啟顯示最后的操作數據。端口定義根據實際電路自行修改。
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. //本測試工作頻率為11.0592MHz

  4. /***********聲明特殊功能寄存器地址*************/
  5. sfr     IAP_DATA    =   0xC2;
  6. sfr     IAP_ADDRH   =   0xC3;
  7. sfr     IAP_ADDRL   =   0xC4;
  8. sfr     IAP_CMD     =   0xC5;
  9. sfr     IAP_TRIG    =   0xC6;
  10. sfr     IAP_CONTR   =   0xC7;

  11. /******CPU的等待時間 按晶振頻率選用************/
  12. #define WT_30M          0x80
  13. #define WT_24M          0x81
  14. #define WT_20M          0x82
  15. #define WT_12M          0x83
  16. #define WT_6M           0x84
  17. #define WT_3M           0x85
  18. #define WT_2M           0x86
  19. #define WT_1M           0x87

  20. sbit key1=P1^0;
  21. sbit key2=P1^1;

  22. unsigned char code table[]={                                        //共陰數碼管段碼
  23.         0x3f,0x06,0x5b,0x4f,0x66,
  24.         0x6d,0x7d,0x07,0x7f,0x6f};
  25. //unsigned char table1[10];                                                //數據緩存數組

  26. char num;                                                                           //定義一個操作變量

  27. /*----------------------------
  28.         關閉IAP功能
  29. ----------------------------*/
  30. void IapIdle()
  31. {
  32.     IAP_CONTR = 0;                              //關閉IAP功能
  33.     IAP_CMD = 0;                                //清除命令寄存器
  34.     IAP_TRIG = 0;                               //清除觸發(fā)寄存器
  35.     IAP_ADDRH = 0x80;                           //將地址設置到非IAP區(qū)域
  36.     IAP_ADDRL = 0;
  37. }
  38. /*----------------------------
  39. 從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
  40. ----------------------------*/
  41. char IapRead(int addr)
  42. {
  43.     char dat;

  44.     IAP_CONTR = WT_12M;                         //使能IAP
  45.     IAP_CMD = 1;                                //設置IAP讀命令
  46.     IAP_ADDRL = addr;                           //設置IAP低地址
  47.     IAP_ADDRH = addr >> 8;                      //設置IAP高地址
  48.     IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
  49.     IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
  50.     _nop_();
  51.     dat = IAP_DATA;                             //讀IAP數據
  52.     IapIdle();                                  //關閉IAP功能

  53.     return dat;
  54. }
  55. /*-------------------------------
  56. 寫一字節(jié)數據到ISP/IAP/EEPROM區(qū)域
  57. -------------------------------*/
  58. void IapProgram(int addr, char dat)
  59. {
  60.     IAP_CONTR = WT_12M;                         //使能IAP
  61.     IAP_CMD = 2;                                //設置IAP寫命令
  62.     IAP_ADDRL = addr;                           //設置IAP低地址
  63.     IAP_ADDRH = addr >> 8;                      //設置IAP高地址
  64.     IAP_DATA = dat;                             //寫IAP數據
  65.     IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
  66.     IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
  67.     _nop_();
  68.     IapIdle();                                  //關閉IAP功能
  69. }
  70. /*----------------------------
  71. ISP/IAP/EEPROM扇區(qū)擦除
  72. ----------------------------*/
  73. void IapErase(int addr)
  74. {
  75.     IAP_CONTR = WT_12M;                         //使能IAP
  76.     IAP_CMD = 3;                                //設置IAP擦除命令
  77.     IAP_ADDRL = addr;                           //設置IAP低地址
  78.     IAP_ADDRH = addr >> 8;                      //設置IAP高地址
  79.     IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
  80.     IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
  81.     _nop_();                                    //
  82.     IapIdle();                                  //關閉IAP功能
  83. }

  84. void keyscan()                                                                        //按鍵掃描程序
  85. {
  86.         static bit key1_sign=0;                                                //按鍵1自鎖標志
  87.         static bit key2_sign=0;                                                //按鍵2自鎖標志
  88.         static unsigned char count1=0;                                //計數變量1                       
  89.         static unsigned char count2=0;                                //計數變量2
  90.         if(!key1)                                                                        //檢測按鍵1如果為0
  91.         {
  92.                 if((count1++>=250)&&(key1_sign==0))
  93.                 {                       
  94.                         key1_sign=1;                                                //按鍵自鎖標志1置1
  95.                         if(num<10)
  96.                                 num++;
  97.                         IapErase(0x0400);                                        //扇區(qū)擦除(扇區(qū)首地址)
  98.                         IapProgram(0x0400, num);                        //寫入一字節(jié)(地址,數據)
  99.                 }
  100.         }
  101.         else                                                                                //按鍵抬起
  102.         {
  103.                 key1_sign=0;                                                        //按鍵自鎖標志1清0
  104.                 count1=0;                                                                //消抖計數1清0
  105.         }
  106.         if(!key2)                                                                        //檢測按鍵2如果為0
  107.         {
  108.                 if((count2++>=250)&&(key2_sign==0))
  109.                 {                       
  110.                         key2_sign=1;                                                //按鍵自鎖標志2置1
  111.                         if(num>0)
  112.                         {
  113.                                 num--;
  114.                                 IapErase(0x0400);                                //扇區(qū)擦除(扇區(qū)首地址)
  115.                                 IapProgram(0x0400, num);                //寫入一字節(jié)(地址,數據)
  116.                         }
  117.                 }
  118.         }
  119.         else                                                                                //按鍵抬起
  120.         {
  121.                 key2_sign=0;                                                        //按鍵自鎖標志2清0
  122.                 count2=0;                                                                //消抖計數2清0
  123.         }
  124. }

  125. void main()
  126. {
  127. //        unsigned char i;
  128.         num=IapRead(0x0400);                                                 //讀取一字節(jié)
  129.         if((num<0)||(num>9))                                                //超出范圍表示沒有存儲數據
  130.         {
  131.                 num=5;                                                                        //賦初值
  132.                 IapErase(0x0400);                                                //扇區(qū)擦除(扇區(qū)首地址自動增量),擦除數據后全部復位是0xff
  133.                 IapProgram(0x0400, num);                                //寫入一字節(jié)(地址,數據)
  134. //                連續(xù)讀寫最多512個字節(jié)
  135. //                for(i=0;i<10;i++)
  136. //                {
  137. //                        IapProgram(0x0400+i,table1[i]);                //連續(xù)寫10個字節(jié)數據
  138. //                }
  139.         }
  140.         while(1)
  141.         {
  142.                 keyscan();                                                                //按鍵掃描
  143.                 P0=table[num];                                                        //數碼管顯示
  144.         }
  145. }

復制代碼

回復

使用道具 舉報

5#
ID:388197 發(fā)表于 2019-8-20 22:31 | 只看該作者
手冊里有例程的,就算看不明白,先照著葫蘆畫瓢,直接復制,運行.然后慢慢琢磨修改,自然就明白了.
回復

使用道具 舉報

6#
ID:476909 發(fā)表于 2019-8-28 16:01 | 只看該作者
wulin 發(fā)表于 2019-8-20 09:34
基于STC官方示例給你寫了一個內置EEPROM鍵控單字節(jié)測試程序,0~9共陰單數碼管靜態(tài)顯示。初始值5,每次操 ...

謝謝您
回復

使用道具 舉報

7#
ID:602448 發(fā)表于 2019-9-17 09:19 | 只看該作者
Y_G_G 發(fā)表于 2019-8-20 08:15
單片機的數據手冊都是有例程的,你可以看一下數據手冊的,C和匯編都有,但如果你說你看不明白,那就沒有辦法了

請問數據手冊在哪下載
回復

使用道具 舉報

8#
ID:155507 發(fā)表于 2019-9-17 23:26 | 只看該作者
回復

使用道具 舉報

9#
ID:878287 發(fā)表于 2021-4-18 22:04 | 只看該作者
wulin 發(fā)表于 2019-8-20 09:34
基于STC官方示例給你寫了一個內置EEPROM鍵控單字節(jié)測試程序,0~9共陰單數碼管靜態(tài)顯示。初始值5,每次操 ...

謝謝!
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表