Keil uVision(C51编译器),一元运算符“!”是什么意思?

时间:2013-06-18 18:23:50

标签: c embedded keil c51

我正在使用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编译器中运算符!的含义是什么?

2 个答案:

答案 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