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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8G1K08單片機片內EEPROM讀寫數組問題請教

[復制鏈接]
跳轉到指定樓層
樓主
ID:76027 發表于 2024-5-11 21:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大佬幫忙看看,下面的單片機代碼讀寫操作數組,讀出來的數據是4個0xff.

  1. #include "STC8.h"
  2. #include "intrins.h"
  3. #include "stdio.h"

  4. /*************  本程序功能說明  **************

  5. 對STC內部自帶的EEPROM(FLASH)進行讀寫測試。

  6. 對FLASH做扇區擦除、寫入、讀出的操作。

  7. 通過串口打印讀取EEPROM結果。

  8. 注意:下載時,下載界面"硬件選項"中設置用戶EEPROM大小,

  9. 并確保擦除、寫入、讀出的地址在EEPROM設置的大小范圍之內。

  10. 下載時, 選擇時鐘 11.0592MHz (用戶可自行修改頻率)。

  11. ******************************************/

  12. #define     MAIN_Fosc       11059200L   //定義主時鐘參數
  13. #define     BAUD            115200
  14. #define     TM              (65536 -(MAIN_Fosc/BAUD/4))

  15. typedef     unsigned char   u8;
  16. typedef     unsigned int    u16;
  17. typedef     unsigned long   u32;

  18. /*sfr     TH2     =   0xD6;
  19. sfr     TL2     =   0xD7;
  20. sfr     AUXR    =   0x8E;
  21. sfr     P_SW2   =   0xBA;

  22. sfr     P0M1    =   0x93;
  23. sfr     P0M0    =   0x94;
  24. sfr     P1M1    =   0x91;
  25. sfr     P1M0    =   0x92;
  26. sfr     P2M1    =   0x95;
  27. sfr     P2M0    =   0x96;
  28. sfr     P3M1    =   0xb1;
  29. sfr     P3M0    =   0xb2;
  30. sfr     P4M1    =   0xb3;
  31. sfr     P4M0    =   0xb4;
  32. sfr     P5M1    =   0xc9;
  33. sfr     P5M0    =   0xca;

  34. sfr     IAP_DATA    =   0xC2;
  35. sfr     IAP_ADDRH   =   0xC3;
  36. sfr     IAP_ADDRL   =   0xC4;
  37. sfr     IAP_CMD     =   0xC5;
  38. sfr     IAP_TRIG    =   0xC6;
  39. sfr     IAP_CONTR   =   0xC7;
  40. sfr     IAP_TPS     =   0xF5;*/

  41. void PrintfInit(void)
  42. {
  43.         SCON = (SCON & 0x3f) | 0x40;
  44.         AUXR |= 0x40;                //定時器時鐘1T模式
  45.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  46.         TL1  = TM;
  47.         TH1  = TM>>8;
  48.         TR1 = 1;                                //定時器1開始計時

  49. //        SCON = (SCON & 0x3f) | 0x40;
  50. //        T2L  = TM;
  51. //        T2H  = TM>>8;
  52. //        AUXR |= 0x15;   //串口1選擇定時器2為波特率發生器
  53. }

  54. void UartPutc(unsigned char dat)
  55. {
  56.         SBUF = dat;
  57.         while(TI == 0);
  58.         TI = 0;
  59. }

  60. char putchar(char c)
  61. {
  62.         UartPutc(c);
  63.         return c;
  64. }

  65. void IapIdle()
  66. {
  67.     IAP_CONTR = 0;                              //關閉IAP功能
  68.     IAP_CMD = 0;                                //清除命令寄存器
  69.     IAP_TRIG = 0;                               //清除觸發寄存器
  70.     IAP_ADDRH = 0x80;                           //將地址設置到非IAP區域
  71.     IAP_ADDRL = 0;
  72. }

  73. unsigned char IapRead(int addr)
  74. {
  75.     char dat;

  76.     IAP_CONTR = 0x80;                           //使能IAP
  77.     IAP_CMD = 1;                                //設置IAP讀命令
  78.     IAP_ADDRL = addr;                           //設置IAP低地址
  79.     IAP_ADDRH = addr >> 8;                      //設置IAP高地址
  80.     IAP_TRIG = 0x5a;                            //寫觸發命令(0x5a)
  81.     IAP_TRIG = 0xa5;                            //寫觸發命令(0xa5)
  82.     _nop_();
  83.     dat = IAP_DATA;                             //讀IAP數據
  84.     IapIdle();                                  //關閉IAP功能

  85.     return dat;
  86. }

  87. void IapProgram(int addr, unsigned char dat)
  88. {
  89.     IAP_CONTR = 0x80;                           //使能IAP
  90.     IAP_CMD = 2;                                //設置IAP寫命令
  91.     IAP_ADDRL = addr;                           //設置IAP低地址
  92.     IAP_ADDRH = addr >> 8;                      //設置IAP高地址
  93.     IAP_DATA = dat;                             //寫IAP數據
  94.     IAP_TRIG = 0x5a;                            //寫觸發命令(0x5a)
  95.     IAP_TRIG = 0xa5;                            //寫觸發命令(0xa5)
  96.     _nop_();
  97.     IapIdle();                                  //關閉IAP功能
  98. }

  99. void IapErase(int addr)
  100. {
  101.     IAP_CONTR = 0x80;                           //使能IAP
  102.     IAP_CMD = 3;                                //設置IAP擦除命令
  103.     IAP_ADDRL = addr;                           //設置IAP低地址
  104.     IAP_ADDRH = addr >> 8;                      //設置IAP高地址
  105.     IAP_TRIG = 0x5a;                            //寫觸發命令(0x5a)
  106.     IAP_TRIG = 0xa5;                            //寫觸發命令(0xa5)
  107.     _nop_();                                    //
  108.     IapIdle();                                  //關閉IAP功能
  109. }

  110. void main()
  111. {
  112.     unsigned char i;
  113.     unsigned char a[4]={1,2,3,4};

  114.     P0M1 = 0;   P0M0 = 0;   //設置為準雙向口
  115.     P1M1 = 0;   P1M0 = 0;   //設置為準雙向口
  116.     P2M1 = 0;   P2M0 = 0;   //設置為準雙向口
  117.     P3M1 = 0;   P3M0 = 0;   //設置為準雙向口
  118.     P4M1 = 0;   P4M0 = 0;   //設置為準雙向口
  119.     P5M1 = 0;   P5M0 = 0;   //設置為準雙向口

  120.     IAP_TPS = 11;                   //設置EEPROM操作等待參數(11.0592MHz),初始化設置一次即可
  121.     PrintfInit();

  122.     printf("Read1=");   //讀取EEPROM原先的內容
  123.     for(i=0;i<4;i++)
  124.     {
  125.         a[i] = IapRead(0x0000);
  126.         printf("0x%02bx ",a[i]);
  127.         //if(a[i] == 0xff) a[i] = i;  //如果內容為空,則寫入初始化數據
  128.         //else a[i]++;    //如果內容非空,在原先基礎上加1
  129.     }
  130.     printf("\r\n");

  131.     IapErase(0x0000);
  132.     printf("Read2=");   //擦除、重寫后,讀取EEPROM現在的內容
  133.     for(i=0;i<4;i++)
  134.     {
  135.         IapProgram(0x0000+i,a[i]);
  136.         a[i] = IapRead(0x0000);
  137.         printf("0x%02bx ",a[i]);
  138.     }
  139.     printf("\r\n");

  140.     while (1);
  141. }
復制代碼



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

使用道具 舉報

沙發
ID:76027 發表于 2024-5-12 20:38 | 只看該作者
已搞定:
  • printf("Read1=");   //讀取EEPROM原先的內容
  •     for(i=0;i<4;i++)
  •     {
  •         a[4] = IapRead(0x0000+i);
  •         printf("0x%02bx ",a[4]);
  •         //if(a == 0xff) a[ i] = i;  //如果內容為空,則寫入初始化數據
  •         //else a[ i]++;    //如果內容非空,在原先基礎上加1
  •     }
  •     printf("\r\n");

  •     IapErase(0x0000);
  •     printf("Read2=");   //擦除、重寫后,讀取EEPROM現在的內容
  •     for(i=0;i<4;i++)
  •     {
  •         IapProgram(0x0000+i,a[ i]);
  •         a[4] = IapRead(0x0000+i);
  •         printf("0x%02bx ",a[4]);
  •     }
  •     printf("\r\n");

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合精品久久久 | 99亚洲精品视频 | 免费一区 | 免费观看一级毛片视频 | 99久久婷婷国产综合精品电影 | 四虎在线观看 | 国产高清久久久 | 久久久亚洲成人 | 天天躁日日躁狠狠很躁 | 亚洲欧美在线观看 | 国产不卡一区 | 久久久久久久电影 | 亚洲天堂中文字幕 | 国产色婷婷精品综合在线播放 | 久久精品免费观看 | 久久一区二区视频 | 精品久久久久久久久亚洲 | 草久久久| 久久精品中文字幕 | 精品熟人一区二区三区四区 | 中文字幕日韩欧美 | 成人精品视频在线 | 在线视频 中文字幕 | 国产中文一区二区三区 | 99爱在线免费观看 | 久久精品视频一区二区 | 伊人网站在线观看 | 欧美色影院| 欧美日韩免费一区二区三区 | 在线观看国产三级 | 色吊丝2288sds中文字幕 | 91在线视频免费观看 | 成人av大全| 国产在线一区二区三区 | 久久精品a级毛片 | 久久精品视频播放 | 欧美亚洲国产一区二区三区 | 天天射美女 | 成人黄色在线视频 | 精品毛片在线观看 | 久久爱综合 |