写成宏,方便移植
#define setbit(x,y) x|=(1<
//将X的第Y位置1
#define clrbit(x,y) x&=~(1<
方法二:
C语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另一个最典型的应用,而且十分广泛地正在被使用着的是位间的与(&)、或(|)、非(~)操作,这跟嵌入式系统的编程特点有很大关系。我们通常要对硬件寄存器进行位设置
譬如,我们通过将AM186ER型80186处理器的中断屏蔽控制寄存器的
第6位设置为0(开中断2),最通用的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp &~INT_I2_MASK);
而将该位设置为1的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp | INT_I2_MASK);
判断该位是否为1的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
if(wTemp & INT_I2_MASK)
{
…
}
方法三:
int a|=(1<
a|=(1<<4)
int b&=~(1<
x=x|0x0100 //把第三位置1
x=x&0x1011 //把第三位置0
#define BitGet(Number,pos) ((Number) >> (pos)&1))
//用宏得到某数的某位
#define BitGet(Number,pos) ((Number) |= 1<
//把某位置1
#define BitGet(Number,pos) ((Number) &= ~(1<
//把某位置0
#define BitGet(Number,pos) ((Number) ^= 1<
//把Number的POS位取反
典型操作有:
WTCON |= (1 << 5)
//WTCON的第五位清1
WTCON &= ~(1 << 5)
//WTCON的第五位清0
补充:
//常用函数
#define
SETBIT(C_Sou,C_Bit) (C_Sou |= (0x00000001 << C_Bit))
#define
CLRBIT(C_Sou,C_Bit) (C_Sou &= ~(0x00000001 << C_Bit))
#define
GETBIT(C_Sou,C_Bit) ((C_Sou & (0x00000001 << C_Bit))?1:0)
上述方法在嵌入式系统的编程中是非常常见的,我们需要牢固掌握。