Arduino文档为数字I / O引脚定义了常量HIGH
和LOW
,但未指定其含义。因此,如果我想将引脚状态存储在变量中,则该变量应为哪种类型?逻辑假设是1
变量中的0
和int
,或者true
中的false
和bool
,但是我可以在任何地方都找不到这个说法。
答案 0 :(得分:2)
根据digitalRead()
(返回HIGH
或LOW
的文档),该值存储在int
中,因此使用int
似乎是一个安全的赌注。
函数digitalWrite()
将引脚状态(HIGH
或LOW
)作为参数,然后在the GitHub repositories from Arduino中搜索该函数的定义,有三种不同的定义定义:
void digitalWrite(uint32_t, uint32_t);
void digitalWrite(uint8_t, uint8_t);
void digitalWrite(pin_size_t, PinStatus);
PinStatus
是一个枚举:
typedef enum {
LOW = 0,
HIGH = 1,
CHANGE = 2,
FALLING = 3,
RISING = 4,
} PinStatus;
但是HIGH
和LOW
始终被定义为1
和0
,它们可以绝对存储在int中(并可以转换为这三种类型)< / p>
答案 1 :(得分:1)
似乎您可以使用整数作为存储空间来驱动digitalWrite,而不是按照这篇文章的HIGH和LOW:http://forum.arduino.cc/index.php?topic=111711.0
-我尚未对此进行测试,因此请在接受之前进行验证。
答案 2 :(得分:0)
一种看待它的方式是Arduino的人们发明了HIGH
和LOW
枚举器(宏?)来掩盖这样一个事实,即尽管有可能,但可能会有一个处理器不t将HIGH
使用1,将LOW
使用0。如果您想编写可移植的,面向未来的代码,则可能应该坚持使用HIGH
和LOW
。
另一种看待它的方式是,您(可能)并不真正在乎实际的引脚状态是什么;您会在意它的含义:按下按钮,运动传感器检测到有人,控制杆已放下等。您可以用对您有意义的任何形式(例如bool
)存储含义,并在您的概念类型和越过边界的固定状态:
bool button_pressed = digitalRead(button_pin) == LOW;
...
digitalWrite(led_pin, button_pressed ? HIGH : LOW);
这里不要过分担心多余的代码,因为如果一切都具有“显而易见的”值和类型,则编译器将对其进行优化。
这又是一个嵌入式系统,其普遍性通常是大小和速度的次要问题。
对于嵌入式系统,您通常会确切知道要编写的硬件。如果您需要从中获取所有性能的信息,那么您可能不得不放弃使用漂亮的digitalRead
/ digitalWrite
API,而直接使用处理器的寄存器。没关系。