标题: 求一段STC8单片机系列的EEPROM的程序参考学习 [打印本页]
作者: 一时 时间: 2019-8-19 15:13
标题: 求一段STC8单片机系列的EEPROM的程序参考学习
新手初学单片机,前期进度正常,但到了EEPROM时瞬间卡壳了,网上找资料找教程始终不得要领。冒昧来此求助。
如遇大家帮助,不胜感激。
想求一段单独的EEPROM的读写及保存的C程序来参考学习。
如下 :
以STC8F2K16S2这个芯片为例吧(手头上有这个片子)。
一个共阴的数码管,一位或者四位都行,这个不重要
不去考虑硬件电路,比如上拉或者限流电阻等,。
就简单的将数码管管脚接到某段IO上,比如P2端口。
外部EEPROM的各种操作简单通过三个或四个按键来实现吧,比如:一个设置键、一个增加键、一个移位键吧。这几个键随便接某几个IO即可。
通过设置键进EEPROM读,增加配合移位健来写操作,最后设置键保存修改后的数据即可。
比如设置两个需要读写的参数AAA和BBB,令AAA初始值为1,BBB初始值为2,AAA及BBB的范围都是0~9即可
不知道有没有师傅能耽误些时间给一段参考学习的程序。
作者: 一时 时间: 2019-8-19 15:30
忘了一点,最好是用STC的内部EEPROM
作者: Y_G_G 时间: 2019-8-20 08:15
单片机的数据手册都是有例程的,你可以看一下数据手册的,C和汇编都有,但如果你说你看不明白,那就没有办法了
作者: wulin 时间: 2019-8-20 09:34
基于STC官方示例给你写了一个内置EEPROM键控单字节测试程序,0~9共阴单数码管静态显示。初始值5,每次操作后保存数据,断电后重启显示最后的操作数据。端口定义根据实际电路自行修改。
- #include "reg51.h"
- #include "intrins.h"
- //本测试工作频率为11.0592MHz
- /***********声明特殊功能寄存器地址*************/
- sfr IAP_DATA = 0xC2;
- sfr IAP_ADDRH = 0xC3;
- sfr IAP_ADDRL = 0xC4;
- sfr IAP_CMD = 0xC5;
- sfr IAP_TRIG = 0xC6;
- sfr IAP_CONTR = 0xC7;
- /******CPU的等待时间 按晶振频率选用************/
- #define WT_30M 0x80
- #define WT_24M 0x81
- #define WT_20M 0x82
- #define WT_12M 0x83
- #define WT_6M 0x84
- #define WT_3M 0x85
- #define WT_2M 0x86
- #define WT_1M 0x87
- sbit key1=P1^0;
- sbit key2=P1^1;
- unsigned char code table[]={ //共阴数码管段码
- 0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- //unsigned char table1[10]; //数据缓存数组
- char num; //定义一个操作变量
- /*----------------------------
- 关闭IAP功能
- ----------------------------*/
- void IapIdle()
- {
- IAP_CONTR = 0; //关闭IAP功能
- IAP_CMD = 0; //清除命令寄存器
- IAP_TRIG = 0; //清除触发寄存器
- IAP_ADDRH = 0x80; //将地址设置到非IAP区域
- IAP_ADDRL = 0;
- }
- /*----------------------------
- 从ISP/IAP/EEPROM区域读取一字节
- ----------------------------*/
- char IapRead(int addr)
- {
- char dat;
- IAP_CONTR = WT_12M; //使能IAP
- IAP_CMD = 1; //设置IAP读命令
- IAP_ADDRL = addr; //设置IAP低地址
- IAP_ADDRH = addr >> 8; //设置IAP高地址
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_();
- dat = IAP_DATA; //读IAP数据
- IapIdle(); //关闭IAP功能
- return dat;
- }
- /*-------------------------------
- 写一字节数据到ISP/IAP/EEPROM区域
- -------------------------------*/
- void IapProgram(int addr, char dat)
- {
- IAP_CONTR = WT_12M; //使能IAP
- IAP_CMD = 2; //设置IAP写命令
- IAP_ADDRL = addr; //设置IAP低地址
- IAP_ADDRH = addr >> 8; //设置IAP高地址
- IAP_DATA = dat; //写IAP数据
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_();
- IapIdle(); //关闭IAP功能
- }
- /*----------------------------
- ISP/IAP/EEPROM扇区擦除
- ----------------------------*/
- void IapErase(int addr)
- {
- IAP_CONTR = WT_12M; //使能IAP
- IAP_CMD = 3; //设置IAP擦除命令
- IAP_ADDRL = addr; //设置IAP低地址
- IAP_ADDRH = addr >> 8; //设置IAP高地址
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_(); //
- IapIdle(); //关闭IAP功能
- }
- void keyscan() //按键扫描程序
- {
- static bit key1_sign=0; //按键1自锁标志
- static bit key2_sign=0; //按键2自锁标志
- static unsigned char count1=0; //计数变量1
- static unsigned char count2=0; //计数变量2
- if(!key1) //检测按键1如果为0
- {
- if((count1++>=250)&&(key1_sign==0))
- {
- key1_sign=1; //按键自锁标志1置1
- if(num<10)
- num++;
- IapErase(0x0400); //扇区擦除(扇区首地址)
- IapProgram(0x0400, num); //写入一字节(地址,数据)
- }
- }
- else //按键抬起
- {
- key1_sign=0; //按键自锁标志1清0
- count1=0; //消抖计数1清0
- }
- if(!key2) //检测按键2如果为0
- {
- if((count2++>=250)&&(key2_sign==0))
- {
- key2_sign=1; //按键自锁标志2置1
- if(num>0)
- {
- num--;
- IapErase(0x0400); //扇区擦除(扇区首地址)
- IapProgram(0x0400, num); //写入一字节(地址,数据)
- }
- }
- }
- else //按键抬起
- {
- key2_sign=0; //按键自锁标志2清0
- count2=0; //消抖计数2清0
- }
- }
- void main()
- {
- // unsigned char i;
- num=IapRead(0x0400); //读取一字节
- if((num<0)||(num>9)) //超出范围表示没有存储数据
- {
- num=5; //赋初值
- IapErase(0x0400); //扇区擦除(扇区首地址自动增量),擦除数据后全部复位是0xff
- IapProgram(0x0400, num); //写入一字节(地址,数据)
- // 连续读写最多512个字节
- // for(i=0;i<10;i++)
- // {
- // IapProgram(0x0400+i,table1[i]); //连续写10个字节数据
- // }
- }
- while(1)
- {
- keyscan(); //按键扫描
- P0=table[num]; //数码管显示
- }
- }
复制代码
作者: cjm82 时间: 2019-8-20 22:31
手册里有例程的,就算看不明白,先照着葫芦画瓢,直接复制,运行.然后慢慢琢磨修改,自然就明白了.
作者: 一时 时间: 2019-8-28 16:01
谢谢您
作者: 秃头使者 时间: 2019-9-17 09:19
请问数据手册在哪下载
作者: angmall 时间: 2019-9-17 23:26
这里
http://www.stcmcudata.com/STC8F-DATASHEET/STC8.pdf
作者: LCC6688 时间: 2021-4-18 22:04
谢谢!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |