有六个位操作符,他们是:
& 按位与
| 按位或
^ 按位异
~ 按位求反
>> 右移 ,这里需要注意的是数据整体的移动不是某一位的移动
<< 左移 , 这里需要注意的是数据整体的移动不是某一位的移动
例如:
1<<3 就是二进制数00001左移3位成为:01000
3<<3 就是二进制数00011左移3位成为:11000
自己的错误认识是只能对单个位进行移位,这样我们在对一个寄存器进行设置的时候可以使用下边的方法:
如何设置寄存器的位?
例如:
rADCCON = (0 << 0) | (0 << 1) | (0 << 2) | (ch << 3) | (1 << 6)| (1 << 14) ;
像这样,如果对某一位置1,就可以1<<第几位,然后与该寄存器相与就可以了,置0也是。
在这个操作的前提是该寄存器初始化的值为0,如果不是0,那么要置0的位相与之后未必是0,
所以可以在前边加如下:
rADCCON=(rADCCON & 0x00) |(0 << 0) | (0 << 1) | (0 << 2) | (ch << 3) | (1 << 6)| (1 << 14) ;
如果我们只需要对某一些对进行操作,而其他为不需要修改。可以借鉴上边的操作:
rADCCON=(rADCCON & 0x【mask】) |(0 << 0) | (0 << 1) | (0 << 2) | (ch << 3) | (1 << 6)| (1 << 14) ;
通过0x【mask】与寄存器相与,把需要修改的位清零,然后在相与,就可以在保护不需要修改位的前提下,修改需要修改的位。
下边的方法是如果对寄存器位清零与位置1
#define setbit(x,y) x|=(1<#define clrbit(x,y) x&=~(1<这样我们这么写:
rADCCON&=~( (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 6)| (1 << 14) ) ;
另外一个技巧:
mask=0x01;
int i=0;
for(i=0;i<8;i++)
{
if( (arg&mask)!=0 )
{
GPFCON&=~(3< GPFUP=0x0;
gpio_mask&=( ~(1< }
mask=(mask<<1);
}
mask=0x01;
阅读(1163) | 评论(1) | 转发(0) |