我正在使用Keil uVision 4进行编程。
我有一些像这样的代码:
sbit X = P3 ^ 3; // X is third bit of P3 register
...
while (1) {
X = !X; // X equals not X ?!
if (X == 0)
printf("0");
else
printf("1");
}
我可以控制`P3^3
通用输入引脚,因为在这个引脚上我有一个PIR(脉冲红外传感器)。当它闪烁时它在那条线上给我1,在它睡觉时给它0。
当P3^3
被提升到1
时,
输出是(正如预期的那样)10101010101010..
当它仍为0时,
输出是(如预期的那样)0000000000000..
我正在获得的行为就是我上面所描述的,考虑到sbit X
是由PIR设置/未设置的。
所以问题是,Keil C51编译器中运算符!
的含义是什么?
答案 0 :(得分:4)
在Keil C51中,引用manual:
sbit类型在 中定义一个 位特殊功能寄存器(SFR)
因此,您不是在循环之前声明变量X并读取它一次,而是将引用定义为P3.3,并在循环的每次迭代中读取它的状态。也就是说X是对硬件I / O引脚寄存器的引用,而不是变量。
尽管外观sbit
不是简单的typedef
别名,^
不是按位XOR运算符。而是定义了对位可寻址寄存器的引用。将X
写入分配给硬件寄存器 - 然后在这种情况下由硬件定义行为而不是语言。当外部拉高时,显然会改变X值的能力,我猜测是GPIO硬件的本质,而不是!
运算符的任何奇怪行为。检查硬件文档中的I / O引脚行为,但我再次猜测将其拉高会使引脚输出能力
为了获得行为(我想)你期望你会这样编码:
sbit p = P3 ^ 3; // p is third bit of P3 register
...
int X = p ; // get p's current value
while (1) {
X = !X; // X equals not X ?!
if (X == 0)
printf("0");
else
printf("1");
}
答案 1 :(得分:0)
据推测,它意味着标准C中的含义相同。!x
评估为1
x==0
,或0
。结果是int
类型。
如果您正在寻找反转所有位的按位补码,那么您需要~
运算符。
更新:
还有更多的东西;见Clifford's answer。