打印

单片机内部EEPROM怎样写入一个大于255的十进制数

[复制链接]
9047|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本人还是菜鸟,最近在学习EEPROM时发现单片机内部EEPROM在写入的数大于255时就会出错,后来翻了一下数据手册,里面说最大值不能大于0XFF.(也就是255).所以在这里请问各位老鸟,我要怎么才能把大于255的数写入呢,我用的是16F887
沙发
huangxz| | 2013-5-13 10:46 | 只看该作者
写两个字节就可以了;P

使用特权

评论回复
板凳
wangwenzhao|  楼主 | 2013-5-13 11:02 | 只看该作者
huangxz 发表于 2013-5-13 10:46
写两个字节就可以了

两个字节,能不能说具体点?

使用特权

评论回复
地板
huangxz| | 2013-5-13 11:11 | 只看该作者
wangwenzhao 发表于 2013-5-13 11:02
两个字节,能不能说具体点?

一个自己表示0-0xff(255)两个自己就可以表示0-0xffff(65535),四个字节就可以表示0-0xffffffff,
long a = eep_read(1);
a = (a << 8) + eep_read(0);
这样就表示到了大于255的数了

使用特权

评论回复
5
yewuyi| | 2013-5-13 11:12 | 只看该作者
在8位长度下,大于255,小于65535,则对应的数据长度就是两个字节,EEPROM的字节宽度是1个字节的,所以你就要拆分为两个字节,然后一个字节一个字节写进去。

使用特权

评论回复
6
wangwenzhao|  楼主 | 2013-5-13 11:29 | 只看该作者
yewuyi 发表于 2013-5-13 11:12
在8位长度下,大于255,小于65535,则对应的数据长度就是两个字节,EEPROM的字节宽度是1个字节的,所以你就 ...

假如我要写十进制数5555到eeprom,要怎样拆分写进出,再把它还原读出来?

使用特权

评论回复
7
弓长月月鸟| | 2013-5-13 11:31 | 只看该作者
,学习了。谢谢

使用特权

评论回复
8
yewuyi| | 2013-5-13 11:59 | 只看该作者
wangwenzhao 发表于 2013-5-13 11:29
假如我要写十进制数5555到eeprom,要怎样拆分写进出,再把它还原读出来?

定义一个16位宽度的整型变量,该变量为两个字节,将这两个字节分别写入EEPROM即可,读出来的时候,自己在代码组合成一个整型即可。

使用特权

评论回复
9
wangwenzhao|  楼主 | 2013-5-13 14:01 | 只看该作者
yewuyi 发表于 2013-5-13 11:59
定义一个16位宽度的整型变量,该变量为两个字节,将这两个字节分别写入EEPROM即可,读出来的时候,自己在 ...

都怪我太菜,有没有相关的代码作为参考?那样我可能好理解一点.谢谢!

使用特权

评论回复
10
yewuyi| | 2013-5-13 14:17 | 只看该作者
本帖最后由 yewuyi 于 2013-5-13 15:10 编辑

#define              menulength              10
#define              ReadMenuByte          menulength*2
//-------------------------------------------------------------------------
typedef              union
{
int                      MenuCase[menualllength];
uchar                 MenuCaseByte[menualllength*2];
}MENU;
//-------------------------------------------------------------------------
MENU                 Menu;
//-------------------------------------------------------------------------
void                 EEpromRead(void)
{
uchar DataCount=0x00;
while(DataCount<ReadMenuByte){
                                                    Menu.MenuCaseByte[DataCount]=EEPROM_READ(DataCount);
                                                    DataCount++;
                                                    }
}
//----------------------------------------------------------------------------

以上为我临时写的示范代码,只写了读EEPROM的操作,写操作自己依葫芦画瓢去把。

使用特权

评论回复
11
pang7| | 2013-5-13 14:48 | 只看该作者
楼主找本微机原理的书看看吧 这些是基础 弄清楚好一点

使用特权

评论回复
12
兰天白云| | 2013-5-13 15:07 | 只看该作者
没有基础,你让这些大虾怎么办?

使用特权

评论回复
13
yewuyi| | 2013-5-13 15:11 | 只看该作者
兰天白云 发表于 2013-5-13 15:07
没有基础,你让这些大虾怎么办?

回答这种问题,只能看老工程师心情了,心情好就回答几句,心情不好只能绕道走了。;P

使用特权

评论回复
14
金则立则翔| | 2013-5-14 10:27 | 只看该作者
有些问题我建议楼主多思考,多想想,然后多实验!

使用特权

评论回复
15
lcdi| | 2013-5-14 10:47 | 只看该作者
本帖最后由 lcdi 于 2013-5-14 10:49 编辑

我随便说说,这是基础的东西:
计算机系统中,二进制是基础。
单片机系统也是如此,存储结构一般都是以字节为基本操作单位的(当然还有不是这样的)。一个字节就是八个二进制位,能表示的最大数字就是255(能表示0~255)。
更大的数字甚至有符号数都是由多个字节组成的,以256~65535之间的数字来说,这个范围可以用两个字节的二进制数来表示,高8位一个字节,低8位一个字节。存储和读出的时候都是分别操作的。只不过C语言里这些操作你看不到,汇编就能看出来了。
存储eeprom的时候只能一个字节一个字节的操作,这是硬件决定的,那么你把高8位这个字节先存进去,再把低8位那个字节存进去。这样就可以了。读出来的时候先读高8位的字节,然后读出低8位那个字节。当然这个先后顺序可以变的,只要你读写的时候一致就行了。
如果是更大的数比如长整形要用4个字节来表示,那么也是按顺序拆成4个字节存进去,再按顺序读出来组合成长整形就可以用了。
至于怎么拆分怎么组合有很多方法的,直观的方式就是,把一个无符号整型数(2字节)强制类型转换为1字节的类型,比如unsigned char。这样得到低8位的部分,原数字右移8次(相当于除256),再类型转换,得到高8位的部分。
组合的时候高8位的字节左移8次(相当于乘256)再加上低8位的那个字节就行了。

虽然C语言帮你做了很多,但这些概念和方法一定要清楚,因为面向具体硬件操作的时候很多时候都要用到。如果是串行通讯还要把一个字节拆分成一位一位的发送和接收呢,也有低位在前还是高位在前的问题。

使用特权

评论回复
16
江枫渔火| | 2013-5-14 17:03 | 只看该作者
18楼说的不错,学习

使用特权

评论回复
17
yewuyi| | 2013-5-14 17:10 | 只看该作者
江枫渔火 发表于 2013-5-14 17:03
18楼说的不错,学习

朋友,18楼还在本帖之下,你是如何预见到下一贴是怎么回复的啊?

使用特权

评论回复
18
江枫渔火| | 2013-5-14 17:19 | 只看该作者
因为18贴.....


严重同意5楼!

使用特权

评论回复
19
wangwenzhao|  楼主 | 2013-5-15 10:59 | 只看该作者
多谢各位的指点,还是15#比较有耐心,讲得比较详细,对于小虾米来说通俗易懂,困扰我多天的问题解决了

2222.JPG (163.34 KB )

2222.JPG

使用特权

评论回复
20
outstanding| | 2013-7-18 11:44 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

35

帖子

0

粉丝