找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4801|回复: 8
打印 上一主题 下一主题
收起左侧

求一段STC8单片机系列的EEPROM的程序参考学习

[复制链接]
跳转到指定楼层
楼主
新手初学单片机,前期进度正常,但到了EEPROM时瞬间卡壳了,网上找资料找教程始终不得要领。冒昧来此求助。
如遇大家帮助,不胜感激。

想求一段单独的EEPROM的读写及保存的C程序来参考学习。
如下
STC8F2K16S2这个芯片为例吧(手头上有这个片子)。
一个共阴的数码管,一位或者四位都行,这个不重要
不去考虑硬件电路,比如上拉或者限流电阻等,。
就简单的将数码管管脚接到某段IO上,比如P2端口。
外部EEPROM的各种操作简单通过三个或四个按键来实现吧,比如:一个设置键、一个增加键、一个移位键吧。这几个键随便接某几个IO即可。
通过设置键进EEPROM读,增加配合移位健来写操作,最后设置键保存修改后的数据即可。
比如设置两个需要读写的参数AAABBB,令AAA初始值为1BBB初始值为2AAABBB的范围都是0~9即可

不知道有没有师傅能耽误些时间给一段参考学习的程序。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:476909 发表于 2019-8-19 15:30 | 只看该作者
忘了一点,最好是用STC的内部EEPROM
回复

使用道具 举报

板凳
ID:401564 发表于 2019-8-20 08:15 | 只看该作者
单片机的数据手册都是有例程的,你可以看一下数据手册的,C和汇编都有,但如果你说你看不明白,那就没有办法了
回复

使用道具 举报

地板
ID:213173 发表于 2019-8-20 09:34 | 只看该作者
一时 发表于 2019-8-19 15:30
忘了一点,最好是用STC的内部EEPROM

基于STC官方示例给你写了一个内置EEPROM键控单字节测试程序,0~9共阴单数码管静态显示。初始值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;                               //清除触发寄存器
  35.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  36.     IAP_ADDRL = 0;
  37. }
  38. /*----------------------------
  39. 从ISP/IAP/EEPROM区域读取一字节
  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;                            //写触发命令(0x5a)
  49.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  50.     _nop_();
  51.     dat = IAP_DATA;                             //读IAP数据
  52.     IapIdle();                                  //关闭IAP功能

  53.     return dat;
  54. }
  55. /*-------------------------------
  56. 写一字节数据到ISP/IAP/EEPROM区域
  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;                            //写触发命令(0x5a)
  66.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  67.     _nop_();
  68.     IapIdle();                                  //关闭IAP功能
  69. }
  70. /*----------------------------
  71. ISP/IAP/EEPROM扇区擦除
  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;                            //写触发命令(0x5a)
  80.     IAP_TRIG = 0xa5;                            //写触发命令(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);                                        //扇区擦除(扇区首地址)
  98.                         IapProgram(0x0400, num);                        //写入一字节(地址,数据)
  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);                                //扇区擦除(扇区首地址)
  115.                                 IapProgram(0x0400, num);                //写入一字节(地址,数据)
  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);                                                 //读取一字节
  129.         if((num<0)||(num>9))                                                //超出范围表示没有存储数据
  130.         {
  131.                 num=5;                                                                        //赋初值
  132.                 IapErase(0x0400);                                                //扇区擦除(扇区首地址自动增量),擦除数据后全部复位是0xff
  133.                 IapProgram(0x0400, num);                                //写入一字节(地址,数据)
  134. //                连续读写最多512个字节
  135. //                for(i=0;i<10;i++)
  136. //                {
  137. //                        IapProgram(0x0400+i,table1[i]);                //连续写10个字节数据
  138. //                }
  139.         }
  140.         while(1)
  141.         {
  142.                 keyscan();                                                                //按键扫描
  143.                 P0=table[num];                                                        //数码管显示
  144.         }
  145. }

复制代码

回复

使用道具 举报

5#
ID:388197 发表于 2019-8-20 22:31 | 只看该作者
手册里有例程的,就算看不明白,先照着葫芦画瓢,直接复制,运行.然后慢慢琢磨修改,自然就明白了.
回复

使用道具 举报

6#
ID:476909 发表于 2019-8-28 16:01 | 只看该作者
wulin 发表于 2019-8-20 09:34
基于STC官方示例给你写了一个内置EEPROM键控单字节测试程序,0~9共阴单数码管静态显示。初始值5,每次操 ...

谢谢您
回复

使用道具 举报

7#
ID:602448 发表于 2019-9-17 09:19 | 只看该作者
Y_G_G 发表于 2019-8-20 08:15
单片机的数据手册都是有例程的,你可以看一下数据手册的,C和汇编都有,但如果你说你看不明白,那就没有办法了

请问数据手册在哪下载
回复

使用道具 举报

8#
ID:155507 发表于 2019-9-17 23:26 | 只看该作者
回复

使用道具 举报

9#
ID:878287 发表于 2021-4-18 22:04 | 只看该作者
wulin 发表于 2019-8-20 09:34
基于STC官方示例给你写了一个内置EEPROM键控单字节测试程序,0~9共阴单数码管静态显示。初始值5,每次操 ...

谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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