8个位定义,怎样把它合成一个uchar变量进行eeprom存储?

[复制链接]
4143|12
 楼主| gmgmgm 发表于 2009-9-22 21:12 | 显示全部楼层 |阅读模式
bit key_flag;//当前按键标志,1==按住;0==松开
bit menu;
bit stop;
bit stop2;
bit far;
bit near;
bit good;
bit bad;


前面定义了8个位标志,
在操作过程中,已经改变了上面那些位的值,0或1;在想把8个位定义值当成一个8位的普通数据存进eeprom里面,这样就可以省些eeprom的空间,需要怎样把这些位定义合成一个8位进行存储?而且自己要清楚这8位要一一对应。有哪位大侠讲解下,谢谢!
woshixinshou 发表于 2009-9-22 21:42 | 显示全部楼层
可以用类似IIC总线传输的方法,降UCHAR逐位赋值右移,再储存;反之逐位左移返回值。
ejack 发表于 2009-9-22 21:47 | 显示全部楼层
zhugjbest 发表于 2009-9-22 21:49 | 显示全部楼层
zq1987731 发表于 2009-9-22 22:31 | 显示全部楼层
typedef struct
{
    uchar key_flag : 1;
    uchar menu : 1;
    uchar stop : 1;
    uchar stop2 : 1;
    uchar far : 1;
    uchar near : 1;
    uchar good : 1;
    uchar bad : 1;
}your_type_name;
 楼主| gmgmgm 发表于 2009-9-23 09:13 | 显示全部楼层
楼上的我看不懂你这是啥意思?还望指点
zq1987731 发表于 2009-9-23 09:41 | 显示全部楼层
这就是C语言中的“位段”
我用typedef将其定义成了一个类型
那么需要用的时候只要如此定义(举例):
your_type_name X;
X.key_flag = 1;
……

将此类型存入EEPROM时,假设有如此函数:EEPROM_Write(uint address, uchar x);
只需要如此调用就行:EEPROM_Write(任意支持的地址,  *((const uchar *)&X));
从EEPROM中读回来也是一样的方法。
zq1987731 发表于 2009-9-23 09:45 | 显示全部楼层
整个位段,8个标志,正好占用1个字节
*((const uchar *)&X)的意思——
首先X是位段结构变量(这个如果不明白请看下C教科书),将其地址取出,强行转化为uchar类型,并加以只读属性,然后取出其正好一字节大小的内容后写入EEPROM
 楼主| gmgmgm 发表于 2009-9-23 11:20 | 显示全部楼层
对这个位段这个字眼还是有点陌生,我还得找教科书学习下,感谢zq1987731前辈的指点,
因特网用户 发表于 2009-9-23 12:17 | 显示全部楼层
TI 的2812的头文件就是那样子定义的
 楼主| gmgmgm 发表于 2009-9-23 14:09 | 显示全部楼层
还得请教各位了,我这样定义了:
struct menu
{
    uchar key_flag : 1;
    uchar menu : 1;
    uchar stop : 1;
    uchar stop2 : 1;
    uchar far : 1;
    uchar near : 1;
    uchar good : 1;
    uchar bad : 1;
};

我要怎样去用它的每个成员?
我这样操作:stop2=0;far=1;
这样操作编译器不认为有这些成员的存在,在网上搜了下,没找到有关成员要怎样去操作的学习资料。还望楼上的各位解说下
woshiwml 发表于 2009-9-23 17:05 | 显示全部楼层
看看c的结构体的定义
gaohq 发表于 2009-9-23 19:05 | 显示全部楼层
仔细读7楼的话
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

766

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部