gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:53:11 25 4
gpt4 key购买 nike

我正在使用 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,在它 sleep 时给我 0。

P3^3 被上拉到 1 时,输出是(如预期的那样)10101010101010..

当它仍然为0时,输出是(与预期不同)0000000000000..

我得到的行为是我在上面描述的,考虑到 sbit X 是由 PIR 设置/取消设置的。

那么问题来了,Keil C51编译器中的运算符!是什么意思?

最佳答案

在 Keil C51 中,引用 manual :

The sbit type defines a bit within a special function register (SFR)

因此,您不是在循环之前声明一个变量 X 并读取它一次,而是定义一个对 P3.3 的引用,并在循环的每次迭代中读取它的状态。也就是说X是对硬件I/O管脚寄存器的引用,不是变量。

尽管出现 sbit 不是简单的 typedef 别名,^ 也不是按位异或运算符。相反,它定义了对位可寻址寄存器的引用。分配 X 写入硬件寄存器 - 在这种情况下,行为由硬件而不是语言定义。当 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");
}

关于c - Keil uVision(C51 编译器),一元运算符 "!"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17176147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com