找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 167|回复: 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. }
复制代码



回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表