详见:
现在越来越多的单片机,推出了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长度短的,可以参考的。