所以我的任务是用一个面包板、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);
}请原谅缺乏优化,(这可以在我解决了灯的问题之后),对优化的任何帮助也将是非常感谢的,但现在我只需要帮助使它,这样的事情就不会被混淆,因为只有一个开关是打开的,导致两个灯都开着,但错了。我在Tinkercad上做的:
电路图:

01+01=010

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

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

发布于 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(如果所有输入都很高)进行校正。
那么你的代码有什么问题呢?
的问题是,你没有涵盖所有的情况,例如,,你从来没有涵盖b1和b4两者都很高。
此外,这里还有一个错误:
if(b2Value == HIGH && b4Value == HIGH && b2Value == HIGH)
^^^ ^^^此外,您的代码永远不会像您在这里所做的那样检查低值:
if(b2Value == HIGH && b3Value == LOW && b4Value == 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;发布于 2018-03-27 07:06:20
引脚有很好的标签:A1Pin、A0Pin等。变量名应该遵循相同的约定:a1Value、a0Value等,这将使if语句更容易理解。
然后,您只需要系统地处理if语句。对于4个输入,有16个可能的组合,每个组合都需要一个if语句。每个if语句都应该检查每个输入值。
所以前两个if语句是
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语句是
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上,并将得到关于如何优化它的各种建议。
发布于 2018-03-27 07:20:44
以下是Yunnosch的注释,这就是他的意思,您可以预先计算加法的值,然后将其显示给LED,这大大简化了下面代码应该工作的代码,或者至少可以作为我在一个示例中为您解释逻辑的指南,希望它能有所帮助。
注意:由于我不是在Arduino的前面,所以这段代码没有经过测试,但是它确实编译了。
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);
}https://stackoverflow.com/questions/49504923
复制相似问题