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))
|