|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
伟-肇庆:
鸿哥,我倒是有一个建议.你全局变量,很多都是标志位赋值0或者1.何不用宏实现位操作,用位实现.
鸿哥--深圳:
我觉得RAM够用的情况下,直接用unsigned char 定义比较简单直接,而且方便我在不同的单片机上移植.
伟-肇庆:
比如:
- #define SETFLAG_X flag|=1<<0
- #define CLRFLAG_X flag&=~(1<<0)
复制代码 一个字节可当8个标志位使用用.
用宏实现,可读性也好.1个全局变量能实现的事,总比8个好.
Ray-上海:
把一个字节当成8个位使用,为了方便读取判断某一位,用联合结构体处理如下:
- union
- {
- struct
- {
- unsigned b0:1;
- unsigned b1:1;
- unsigned b2:1;
- unsigned b3:1;
- unsigned b4:1;
- unsigned b5:1;
- unsigned b6:1;
- unsigned b7:1;
- }oneBit;
- unsigned char flag;
- }myFlag;
复制代码
在不能操作bit的单片机中使用c语言的结构体和联合体一样可以实现,可以进行字节或者任意一位变量的操作.
鸿哥--深圳;
判断某一位的时候应该怎样判断?
if(myFlag.oneBit.b7==1)是这样判断吗?
Ray-上海:
嗯.
曹健-江苏:
伟,你这样定义,对于初学者看起来可能有点吃力.鸿哥的代码我看起来感觉逻辑比较清晰,理解起来也很容易.
鸿哥--深圳:
对.用的宏多了,就会把初学者搞晕.但是你的方法确实给大家提供了另外一种思路,在RAM资源紧缺的时候能派上用场。
另外,我跟大家讲讲用联合结构体其实还有一个小弊端:
用联合结构体的时候是这样的:if(myFlag.oneBit.b7==1)
用一个字节变量的时候是这样的:if(ucFlag==1).
表面上看,myFlag.oneBit.b7==1和ucFlag==1都是一条语句,但是你用了联合结构体后,经过C语言的编译后,它还会是一条语句吗?
我觉得里面肯定会有移位,与,等操作。也就是原来一条指令的语句,其实内部已经有很多条指令组成了。所以我觉得直接用一个char变量会更加简单快捷。
|
|