作者共發了2篇帖子。 內容轉換:不轉換▼
 
點擊 回復
478 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)
 

本帖信息

點擊數:478 回複數:1
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2015-12-23 18:49
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。