首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Arduino的2位加法器

带有Arduino的2位加法器
EN

Stack Overflow用户
提问于 2018-03-27 05:21:48
回答 4查看 3K关注 0票数 1

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

代码语言:javascript
复制
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);
}

请原谅缺乏优化,(这可以在我解决了灯的问题之后),对优化的任何帮助也将是非常感谢的,但现在我只需要帮助使它,这样的事情就不会被混淆,因为只有一个开关是打开的,导致两个灯都开着,但错了。我在Tinkercad上做的:

电路图:

01+01=010

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

只是第二次打开,但被误解为10+00=010 (或visa相反)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-27 09:17:53

首先,有比你选择的更好的方法。然而,这个答案将坚持您的方法,并解释您的代码失败的原因。

据我所知,你的做法背后的想法是:

1)覆盖输入不高的情况(即从所有LED的转动开始)。1例。

2)覆盖1输入高的情况。4例。

3)覆盖两个输入量较高的情况。6例。

4)覆盖准确3个输入量高的情况。4例。

5)覆盖所有4种输入都很高的情况。1例。

该方法将起作用,因为步骤5优先于步骤4,步骤4优先于步骤3,依此类推。也就是说,即使您在例如步骤4中设置了一个不正确的输出,它也将由步骤5(如果所有输入都很高)进行校正。

那么你的代码有什么问题呢?

的问题是,你没有涵盖所有的情况,例如,,你从来没有涵盖b1b4两者都很高。

此外,这里还有一个错误:

代码语言:javascript
复制
if(b2Value == HIGH && b4Value == HIGH && b2Value == HIGH)
   ^^^                                   ^^^

此外,您的代码永远不会像您在这里所做的那样检查低值:

代码语言:javascript
复制
if(b2Value == HIGH && b3Value == LOW && b4Value == LOW)

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

总之,您必须有初始化加上15个if-语句。

所以你的代码应该是:

代码语言:javascript
复制
  // 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)
  {
      ...
  }

上述说明了为什么您的代码不能工作,以及如何修复它。

但是正如您所看到的,这种方法非常容易出错(也就是说,很容易忽略一个案例)。除此之外,它的性能也很差。因此,我将推荐一种更简单的方法。

代码语言:javascript
复制
int temp = 2 * digitalRead(A1Pin) +
               digitalRead(A0Pin) +
           2 * digitalRead(B1Pin) +
               digitalRead(B0Pin);

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

Stack Overflow用户

发布于 2018-03-27 07:06:20

引脚有很好的标签:A1PinA0Pin等。变量名应该遵循相同的约定:a1Valuea0Value等,这将使if语句更容易理解。

然后,您只需要系统地处理if语句。对于4个输入,有16个可能的组合,每个组合都需要一个if语句。每个if语句都应该检查每个输入值。

所以前两个if语句是

代码语言:javascript
复制
if (a1Value == LOW && a0Value == LOW && b1Value == LOW && b0Value == LOW)
{
    digitalWrite(LED0Pin,LOW);   // 0 + 0 = 0
    digitalWrite(LED1Pin,LOW);
    digitalWrite(LED2Pin,LOW);
}
else if a1Value == LOW && a0Value == LOW && b1Value == LOW && b0Value == HIGH) 
{
    digitalWrite(LED0Pin,HIGH);  // 0 + 1 = 1
    digitalWrite(LED1Pin,LOW);
    digitalWrite(LED2Pin,LOW);
}

最后一个if语句是

代码语言:javascript
复制
else if (a1Value == HIGH && a0Value == HIGH && b1Value == HIGH && b0Value == HIGH)
{
    digitalWrite(LED0Pin,LOW);   // 3 + 3 = 6
    digitalWrite(LED1Pin,HIGH);
    digitalWrite(LED2Pin,HIGH);
}

还有13条路要走。

当然还有其他的方法,但我想我可以帮你完成你开始的工作。

一旦代码正常运行,就可以将其发布到code review上,并将得到关于如何优化它的各种建议。

票数 1
EN

Stack Overflow用户

发布于 2018-03-27 07:20:44

以下是Yunnosch的注释,这就是他的意思,您可以预先计算加法的值,然后将其显示给LED,这大大简化了下面代码应该工作的代码,或者至少可以作为我在一个示例中为您解释逻辑的指南,希望它能有所帮助。

注意:由于我不是在Arduino的前面,所以这段代码没有经过测试,但是它确实编译了。

代码语言:javascript
复制
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);

  // b1 is set to represent 1 and b2 will represent 2 same with b3 and b4 pair
  // lets assume b1 = 1 b2 = 0 the number is 1
  // b3 is set to 1 and b4 is set to 1
  // input : b2|b1 + b4|b3
  //          0| 1    1| 1
  // sum = 1*1 + 0*2 + 1*1 + 1*2 = 4 - which is represented in binary as b100
  int sum = (b1Value * 1) + (b2Value * 2) + (b3Value * 1) + (b4Value * 2);

  if (sum & 0x1) //binary rep b001 - following the example will result in 0
    digitalWrite(LED0Pin, HIGH);
  else
    digitalWrite(LED0Pin, LOW);

  if (sum & 0x2) //binary rep b010 - following the example will result in 0
    digitalWrite(LED1Pin, HIGH);
  else
    digitalWrite(LED1Pin, LOW);

  if (sum & 0x4) //binary rep b100 - following the example will result in 1
    digitalWrite(LED2Pin, HIGH);
  else
    digitalWrite(LED2Pin, LOW);

  delay(10);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49504923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档