在AVR单片机中,PORTC |= BIT(2) 和 PORTC &= ~BIT(2)均能正常运行,但是在C51单片机中后者会出错。这主要是因为定义BIT宏的时候格式有问题。 在AVR单片机中,BIT(n)宏(ICCAVR)和_BV(n)宏(WinAVR)都是在头文件中定义好了的,而C51单片机库函数里没有这两个宏,所以需要手动定义。如果在手动定义时写的是下面的语句: #define BIT(n) 1<<n 那么,如果执行P2 &= ~BIT(2),编译器在编译时就会将其替换为P2 &= ~1<<2。那么问题来了,因为~1 == 0xfe,且0xfe << 2 == 0xf8,因此执行后的结果是P2被赋上了0xf8的值,也就是11111000。而我们期望的P2值却是0xfb (11111011)。 因此,错误的根源就是BIT宏替换后1<<2没有加上括号。如果替换后的语句是P2 &= ~(1<<2),那么我们就能得出正确的结果。 所以,在手动定义BIT宏的时候,一定要把1<<n用括号括起来: #define BIT(n) (1<<n)
|