目前共有2篇帖子。 内容转换:不转换▼
 
点击 回复
471 1
我终于知道为什么在51单片机中执行P2 &= ~BIT(2);会出错了
一派护法 十九级
1楼 发表于:2015-12-23 18:48
在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)
一派护法 十九级
2楼 发表于:2015-12-23 18:49
可以推测出,AVR单片机的自带头文件里,BIT或BV宏定义肯定是加了括号的,所以才不会出错。而C51单片机里手动定义时却忽略了这一点。

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:471 回复数:1
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2015-12-23 18:49
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。