我怎样才能读取pinMode OUTPUT中的引脚?

Baz*_*zzz 29 arduino

我有一个非常简单的测试草图,其中我试图设置一个引脚HIGH然后用它读取它的状态digitalRead.这是我的素描.

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    delay(1000);

    pinMode(3, OUTPUT);
    digitalWrite(3, HIGH);
    delay(1000);

    pinMode(3, INPUT);
    Serial.println(digitalRead(3));
}
Run Code Online (Sandbox Code Playgroud)

串口监控结果:

0
0
0
0
Run Code Online (Sandbox Code Playgroud)

我已经明白改变pinMode会阻止它HIGH.因此,将引脚设置为HIGHin OUTPUT模式然后更改为INPUT模式将其更改为LOW.因此,digitalRead将始终返回0.如果我不更改pinMode,它将无法读取引脚.那么如何在OUTPUT不丢失值的情况下读取处于模式下的引脚的当前设置?

Udo*_*ein 33

你的素描应该是

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    delay(1000);

    pinMode(3, OUTPUT);
    digitalWrite(3, HIGH);
    delay(1000);

    // pinMode(3, INPUT); // get rid of this line
    Serial.println(digitalRead(3));
}
Run Code Online (Sandbox Code Playgroud)

就这样.然后它读取引脚的状态,在你的情况下是"高".如果将pinMode设置为输入,它将根据连接的内容读取输入.如果您将"HIGH"写入输入引脚,则会激活内部上拉.如果在将其设置为输入模式或将其设置为输入模式之前写入HIGH,则无关紧要.除非您正在驱动输出引脚的高负载(例如,接地开关).然后这可能会杀掉别针.

如果你写了一个低电平并将引脚设置为低电平,它可能会浮动,这可能会导致任何不可预测的行为.

  • 你的意思是接受的答案不适用于基于ARM的Arduinos.当然不是.我的回答是. (2认同)

小智 32

在这种情况下,您只想访问数据寄存器本身.

PORTB和PORTD寄存器包含您要查找的引脚数据.我终于可以访问Arduino了解它.你想用bitRead(PORTD, pin).

Serial.println(bitRead(PORTD,3)); //Reads bit 3 of register PORTD which contains the current state (high/low) of pin 3.
Run Code Online (Sandbox Code Playgroud)

参考位读操作以获取更多信息.