| AVR的位操作只能对地址小于$1F的寄存器使用 
 大于$1F的寄存器,AVR 芯片本身就不支持位操作,什么语言都一样,只能用操作RAM的方式来处理
 
 
 
 
 几个位操作的小函数,经过了CVAVR的编译(其他编译器也是一样的),AVRStudio的模拟调试。结果是正确的,但运行时间约10uS,有兴趣的网友可以来交流。
 1 测试指定的位
 unsigned char BitTst(unsigned char *Pa,char b)  //Pa为被测试的对象的地址,b值为指定的位
 {
 return *Pa & (1<<b);
 }
 
 用法:
 unsigned char x,y;
 y=0x4F;
 x=BitTst(&y,3);
 
 2 将指定的位置“1”
 void BitSet(unsigned char *Pa,char b)  //Pa为置位对象的地址,b值为指定的位
 {
 *Pa|=1<<b;
 }
 
 用法:BitSet(&x,6);
 
 3 将指定的位清“0”
 void BitClr(unsigned char *Pa,char b)  //Pa为清零位对象的地址,b值为指定的位
 {
 *Pa&=~(1<<b);
 }
 
 用法:BitClr(&x,6);
 
 4 将指定的位取反
 void BitCpl(unsigned char *Pa,char b)  //Pa为取反位对象的地址,b值为指定的位
 {
 *Pa^=1<<b;
 }
 
 用法:BitCpl(&x,6);
 
 写成宏的方式吧,速度快点!
 #define BitSet(a,b)     (a |= (1<<b))
 #define BitClr(a,b)     (a &= ~(1<<b))
 |