您的位置:控制工程论坛网论坛 » 教程与手册 » 关于单片机C语言的位操作处理方法!

常青树

常青树   |   当前状态:在线

总积分:1421  2025年可用积分:0

注册时间: 2008-09-28

最后登录时间: 2012-05-30

空间 发短消息加为好友

关于单片机C语言的位操作处理方法!

常青树  发表于 2008/10/3 21:05:35      709 查看 1 回复  [上一主题]  [下一主题]

手机阅读

关于单片机C语言的位操作处理方法!

详见:

关于单片机C语言的位操作处理方法!

现在越来越多的单片机,推出了C语言系统,越来越多人在使用中,发现位操作不如
ASM汇编的好用,其实不然,有很多方法实现此类操作:

   //第一种://所有的位都可以这样操作,//寄存器、IO是最好的
   #define SB(val, bitn)    (val |= (1<<(bitn)))     //set_bit置1
   #define CB(val, bitn)    (val &=~(1<<(bitn)))     //clr_bit清0
   #define GB(val, bitn)    (val &  (1<<(bitn)))     //get_bit得到到此位  
   #define XB(val, bitn)    (val ^= (1<<(bitn)))     //xor_bit取反此位

   //第二种:联合
union
{ byte Byte;
  struct
  { byte B0      :1;
    byte B1      :1;
    byte B2      :1;
    byte B3      :1;
    byte B4      :1;
    byte B5      :1;
    byte B6      :1;
    byte B7      :1;
  } Bits;
} _BIT18;

#define BIT18    _ BIT18.Byte
#define FDOT    _ BIT18.Bits.B0


   BIT18=0X33;     //我想整个字节给值,发现这里是可以的
   FDOT=1;
   FDOT=0;
   FDOT=1;


  第三种:用伪指令代入+地址应该可以的,于是试了一下,还可以
  typedef struct bit_struct
                {  unsigned bit0 : 1 ;
                    unsigned bit1 : 1 ;
                    unsigned bit2 : 1 ;
                    unsigned bit3 : 1 ;
                    unsigned bit4 : 1 ;
                    unsigned bit5 : 1 ;
                    unsigned bit6 : 1 ;
                    unsigned bit7 : 1 ;
                }bit_field;
   #define BITUSE(addr) (*((volatile  bit_field *) (addr)))

   char BIT98;
   #define test   BITUSE(&BIT98).bit0


   BIT98=0x33;    //ok,通过!
   test=0;        //位操作也通过了
   test=1;


   至于哪一种好用,要根据实际情况,如果那种C编译系统支持,生成的的rom长度短的,可以参考的。


1楼 0 0 回复