Небольшая путаница в команде digitalWrite

Будет ли среда разработки Arduino интерпретировать digitalWrite(13,x), где x>0, как digitalWrite(13,HIGH)? И будет ли он интерпретировать digitalWrite(13,x), где x<=0, как digitalWrite(13,LOW)?

, 👍0

Обсуждение

0 — низкий, все остальное — ВЫСОКИЙ, @Juraj

но какой-нибудь шутник мог бы сделать ядро Arduino, где LOW определен как 2. Код AVR для digitalWrite и digitalRead будет работать. он не предполагает, что LOW равен 0. поэтому ваш код тоже не должен этого делать. (но в своих набросках я часто предполагаю, что LOW равен 0)., @Juraj

основные функции esp8266 digitalRead и digitalWrite игнорируют LOW и HIGH и используют if (val) и возвращают состояние бита регистра, @Juraj


1 ответ


Лучший ответ:

1

Любое другое значение, отличное от 0 или LOW, приведет к установке пина в HIGH. Ниже я объясню, почему:

Функция digitalWrite() находится в файле hardware/arduino/avr/cores/arduino/wiring_digital.c. Важные строки здесь:

if (val == LOW) {
    *out &= ~bit;
} else {
    *out |= bit;
}

Как вы можете видеть, он проверяет, равно ли заданное значение (из параметра) LOW, и если это так, то он устанавливает соответствующий пин на 0. В любом другом случае он устанавливает пин на 1. Определение LOW можно найти в arduino/hardware/arduino/avr/cores/arduino/Arduino.h:

#define HIGH 0x1
#define LOW  0x0

Таким образом, код проверяет, равно ли значение 0, и устанавливает пин также на 0. Любое другое значение даст в результате 1 (что означает HIGH). Также взгляните на определение digitalWrite():

void digitalWrite(uint8_t pin, uint8_t val)

Значение имеет тип без знака, поэтому каждый тип со знаком будет приведен к типу без знака. Отрицательное число приведет к положительному числу внутри функции.

,

Просто придирка: также False и все остальное, что оценивается как 0, здесь работает :) (И обычно в качестве val используются логические переменные/выражения), @gilhad