Arduino HIGH LOW

24
我有一个Arduino板,想知道HIGHLOW的确切含义,实际值是什么...它们是带符号的int吗?无符号的int?无符号的char?它们的值是多少?我猜HIGHLOW可能是unsigned int,其中所有位都设置为1和0,但我不确定。我想使用HIGHLOW进行按位操作,或者将除HIGHLOW之外的值传递给digitalWrite。另外,我怎样将整数强制转换为HIGHLOW,以便我能够这样做?
5个回答

44

你可以查看 hardware/arduino/cores/arduino/Arduino.h 文件(至少在 Arduino 1.0.1 软件中),第18和19行:

 #define HIGH 0x1
 #define LOW  0x0

这些定义是十六进制整数值,意味着你可以对它们进行任何位运算 - 目前它们有多大意义并不是很清楚。同时请注意,这些值可能会在以后更改 - 这会使得对它们进行位运算更加不明智。


20
如果你想向digitalWrite()传递其他值,你可以查看函数原型。
void digitalWrite(uint8_t, uint8_t);

因此,任何整数值(0到255)都可以使用。如果向digitalWrite()传递高于HIGH和LOW的值,则其行为无法预测。

由于HIGH和LOW仅是定义的常量,您不能将整数强制转换为它们(也不会有这种操作的意义)。似乎您可以在期望HIGH和LOW的任何位置使用整数。

但实际上,这样做是一个不好的主意,原因很多——HIGH和LOW的定义可能会更改(虽然不太可能),并且从类型角度来看,这没有意义。相反,您应该在程序中使用逻辑来确定应该传递HIGH还是LOW给函数调用,然后实际传递常量。


1
实际上,据我所知,对于Arduino来说,TRUE和FALSE并没有定义在任何地方,只有HIGH和LOW以及true和false…(HIGH=true,LOW=false)。 - codeling
上面的答案说明了已定义的常量。 - Void Star

20
我来为您翻译一下,以下是翻译内容:

codeling的回答中,我想补充一点:

Arduino.h(1.0版)的18-25行代码如下:

#define HIGH 0x1
#define LOW  0x0

#define INPUT 0x0
#define OUTPUT 0x1

#define true 0x1
#define false 0x0

因此,HIGH <==> OUTPUT <==> true <==> 0x1LOW <==> INPUT <==> false <==> 0x0。 然后,HIGH <==> !LOWLOW <==> !HIGH...

2
真奇怪,输入/输出完全颠倒了(至少与使用AVR-GCC进行“正常”开发不同)。我最喜欢的AVR微控制器之一的优点是,“1”看起来像“ I”(表示输入),而“0”看起来像“ O”(表示输出),这使得记忆变得超级容易。 - BrainSlugs83

1
digitalWrite()的第一个参数是引脚号。
digitalWrite()的第二个参数将会是:
1. 向二进制输出写入高电平(3.3或5伏)或低电平(0伏)。 2. 使二进制输入的内部上拉电阻被启用(高电平)或禁用(低电平)。
对于任一参数的按位操作都没有意义。也许您需要使用analogWrite()?
请参阅文档:digitalWrite() Constants

1
HIGH和LOW只是数字(分别为1和0)。对它们进行位运算是完全有意义的。至于digitalWrite的行为,第二个参数是一个无符号8位整数,被视为布尔值--因此任何非零值都应视为HIGH。 - BrainSlugs83

0
关于输入和输出:输出为1,因为DDRD必须设置为1才能将I/O设置为输出。

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接