gpt4 book ai didi

c++ - 带 Arduino 的 2 位加法器

转载 作者:行者123 更新时间:2023-11-30 01:04:43 25 4
gpt4 key购买 nike

因此,我的任务是使用面包板、4 个开关、3 个 LED 和一个 Arduino 制作一个 2 位加法器。问题是加法器做了两件冲突的事情(至少在我的代码中是这样),第一件事是打开一个开关它只会打开一盏灯(001),但是它还需要计算 10+ 00,这只意味着一个开关将打开,这样一来(如我的代码所述)它将最终打开对应于两个的灯,而不是仅打开中间的一个(010),反之亦然(001)。我知道它与我的 if 语句的第一位有关,这是代码:

int A0Pin = 12;
int A1Pin = 11;
int B0Pin = 10;
int B1Pin = 9;

int LED0Pin = 6;
int LED1Pin = 5;
int LED2Pin = 4;

void setup()
{
pinMode(A0Pin, INPUT);
pinMode(A1Pin, INPUT);
pinMode(B0Pin, INPUT);
pinMode(B1Pin, INPUT);

pinMode(LED0Pin, OUTPUT);
pinMode(LED1Pin, OUTPUT);
pinMode(LED2Pin, OUTPUT);
}

void loop()
{
int b1Value = digitalRead(A0Pin);
int b2Value = digitalRead(A1Pin);
int b3Value = digitalRead(B0Pin);
int b4Value = digitalRead(B1Pin);

digitalWrite(LED0Pin, LOW);
digitalWrite(LED1Pin, LOW);
digitalWrite(LED2Pin, LOW);

if (b1Value == HIGH)
{
digitalWrite(LED0Pin,HIGH);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,LOW);
}
if (b2Value == HIGH)
{
digitalWrite(LED0Pin,HIGH);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,LOW);
}
if (b3Value == HIGH)
{
digitalWrite(LED0Pin,HIGH);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,LOW);
}
if (b4Value == HIGH)
{
digitalWrite(LED0Pin,HIGH);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,LOW);
}
if(b1Value == HIGH && b3Value == HIGH )
{
digitalWrite(LED0Pin,LOW);
digitalWrite(LED1Pin,HIGH);
digitalWrite(LED2Pin,LOW);
}
if(b2Value == HIGH && b4Value == HIGH )
{
digitalWrite(LED0Pin,LOW);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,HIGH);
}
if(b2Value == HIGH && b3Value == LOW && b4Value == LOW)
{
digitalWrite(LED0Pin,LOW);
digitalWrite(LED1Pin,HIGH);
digitalWrite(LED2Pin,LOW);
}
if(b1Value == LOW && b2Value == LOW && b4Value == HIGH)
{
digitalWrite(LED0Pin,LOW);
digitalWrite(LED1Pin,HIGH);
digitalWrite(LED2Pin,LOW);
}
if(b1Value == HIGH && b2Value == HIGH)
{
digitalWrite(LED0Pin,HIGH);
digitalWrite(LED1Pin,HIGH);
digitalWrite(LED2Pin,LOW);
}
if(b3Value == HIGH && b4Value == HIGH)
{
digitalWrite(LED0Pin,LOW);
digitalWrite(LED1Pin,HIGH);
digitalWrite(LED2Pin,LOW);
}
if(b1Value == HIGH && b2Value == HIGH && b4Value == HIGH)
{
digitalWrite(LED0Pin,LOW);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,HIGH);
}
if(b2Value == HIGH && b4Value == HIGH && b2Value == HIGH)
{
digitalWrite(LED0Pin,LOW);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,HIGH);
}
if(b1Value == HIGH && b2Value == HIGH && b3Value == HIGH)
{
digitalWrite(LED0Pin,HIGH);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,HIGH);
}
if(b3Value == HIGH && b4Value == HIGH && b1Value == HIGH)
{
digitalWrite(LED0Pin,HIGH);
digitalWrite(LED1Pin,LOW);
digitalWrite(LED2Pin,HIGH);
}
if(b1Value == HIGH && b2Value ==
HIGH && b3Value == HIGH && b4Value == HIGH)
{
digitalWrite(LED0Pin,LOW);
digitalWrite(LED1Pin,HIGH);
digitalWrite(LED2Pin,HIGH);
}
delay(10);
}

请原谅缺乏优化,(在我弄清楚灯光问题后可能会出现),任何优化方面的帮助也将不胜感激,但现在我只需要帮助来实现 01+ 00 最后不要因为只有 1 个开关打开而感到困惑,导致两盏灯都亮着或只有一盏灯亮着,但不正确。我是在 Tinkercad 上制作的:

电路图:

Circuit diagram

01+01=010

01+01=010

只是第一个开关 (01+00=001)

Just the first switch on (01+00=001)

只是第二次打开,但被误解为 10+00=010(反之亦然)

just the second switch on, but misinterpreted as 10+00=010 (or visa versa)

最佳答案

嗯,首先:有比您选择的方法更好的方法。但是,此答案将坚持您的方法并解释您的代码失败的原因。

据我所知,您的方法背后的想法是:

1) 涵盖没有输入为 HIGH 的情况(即您首先关闭所有 LED)。 1例。

2) 涵盖恰好有 1 个输入为高电平的情况。 4例。

3) 涵盖恰好有 2 个输入为高电平的情况。 6例。

4) 涵盖恰好有 3 个输入为高电平的情况。 4例。

5) 覆盖所有 4 个输入都为高电平的情况。 1例。

该方法可行,因为第 5 步优先于第 4 步,第 4 步优先于第 3 步,依此类推。也就是说,即使您在例如中设置了不正确的输出第 4 步,它将被第 5 步纠正(如果所有输入均为高电平)。

So what is wrong with your code?

问题是您没有涵盖所有情况。例如,您从未涵盖 b1b4 都为 HIGH。 p>

你这里还有一个拼写错误:

if(b2Value == HIGH && b4Value == HIGH && b2Value == HIGH)
^^^ ^^^

此外,您的代码永远不会像您在此处那样检查 LOW:

if(b2Value == HIGH && b3Value == LOW && b4Value == LOW)

LOW 值由 if 语句的优先级隐式处理。

总共必须有初始化加上 15 个 if 语句。

所以你的代码应该是:

  // Handle 1 case with no input high
digitalWrite(LED0Pin, LOW);
digitalWrite(LED1Pin, LOW);
digitalWrite(LED2Pin, LOW);

// Handle 4 cases with exactly 1 input being high
if (b1Value == HIGH)
{
...
}
else if (b2Value == HIGH)
{
...
}
else if (b3Value == HIGH)
{
...
}
else if (b4Value == HIGH)
{
...
}

// Handle 6 cases with exactly 2 input being high
if(b1Value == HIGH && b2Value == HIGH )
{
...
}
else if(b1Value == HIGH && b3Value == HIGH )
{
...
}
else if(b1Value == HIGH && b4Value == HIGH)
{
...
}
else if(b2Value == HIGH && b3Value == HIGH)
{
...
}
else if(b2Value == HIGH && b4Value == HIGH)
{
...
}
else if(b3Value == HIGH && b4Value == HIGH)
{
...
}

// Handle 4 cases with exactly 3 input being high
if(b1Value == HIGH && b2Value == HIGH && b3Value == HIGH)
{
...
}
else if(b1Value == HIGH && b2Value == HIGH && b4Value == HIGH)
{
...
}
else if(b1Value == HIGH && b3Value == HIGH && b4Value == HIGH)
{
...
}
else if(b2Value == HIGH && b3Value == HIGH && b4Value == HIGH)
{
...
}

// Handle 1 cases with exactly 4 input being high
if(b1Value == HIGH && b2Value == HIGH && b3Value == HIGH && b4Value == HIGH)
{
...
}

上面解释了为什么您的代码无法正常工作以及如何修复它。

但如您所见,这种方法很容易出错(即很容易漏掉一个案例)。除此之外,它的性能也很差。所以我会推荐一种更简单的方法。

int temp = 2 * digitalRead(A1Pin) +
digitalRead(A0Pin) +
2 * digitalRead(B1Pin) +
digitalRead(B0Pin);

output0 = (temp & 1) == 1;
output1 = (temp & 2) == 2;
output2 = (temp & 4) == 4;

关于c++ - 带 Arduino 的 2 位加法器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49504923/

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