0

我正在编写一个 Arduino Sketch,一般来说它是一个使用 4 个数字系统的计算器:十进制、二进制、八进制和十六进制。当我向用户询问数字系统时,他将使用键盘输入所需的系统(十进制为 1,十六进制为 2,八进制为 3,二进制为 4),然后,在收到此输入后,arduino 在 LCD 上打印选择的系统。但是这部分代码似乎无限重复,没有执行输入数字和操作数的部分。我不能输入不是 1、2、3 或 4 的数字,如果我按下其中一个数字,它会打印它的系统,完全忽略之前的输入。

我尝试使用布尔开关来指示程序如果之前已执行过该部分代码但它似乎不起作用,则不运行该部分代码

这是接收输入并对其进行验证的代码部分。开关盒在其他 3 次中重复其他 3 次,改变了打印的数字系统。

void loop()
{
  char base = calcuShift.getKey();
  if (base != NO_KEY && (base == '1' || base == '2' || base == '3' || base == '4')) {
    switch (base) {
      case '1':
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Sistema");
        lcd.setCursor(0,1);
        lcd.print("Decimal");
        delay(3000);
        lcd.clear();
        break;

在 switch case 之后,它必须执行以下代码:

char key;
if (digitalRead(A0) == HIGH) {
  key = calcuShift.getKey();
} else {
  key = calcu.getKey();
}

if (key != NO_KEY && 
    (key=='1' || key=='2' || key=='3' || key=='4' || key=='5' || key=='6' || key=='7' || key=='8' || key=='9') && 
    base == '1') {

  if (inicio == false) {
    num1 = num1 + key;
    int numLength = num1.length();
    lcd.setCursor(15-numLength,0);
    lcd.print(num1); 
  } else {
    num2 = num2 + key;
    int numLength = num2.length();
    lcd.setCursor(15-numLength,1);
    lcd.print(num2);
    final = true;
  }

显然包括其他 if 条件,这些条件取决于变量“base”(用户在开始时输入的那个)。如果它是 1(十进制)它接受数字 0 到 9,如果它是 2(十六进制)它接受数字 0 到 F 等等。用户使用变量键输入他的数字。calcuShift 对象只是 shift 模式下的普通键盘,用字母和其他两个操作数代替数字,乘法和除法操作数由幂和根操作数代替。

我希望我的计算器接收所需的数字系统,接收此类系统中的数字并使用这些数字进行运算,在先前选择的系统中返回答案,但只是坚持输入指示数字系统的变量“base”用过的。

4

1 回答 1

0

Arduino 草图旨在loop()永远尽可能快地执行。任何打算在启动后运行一次的东西都应该进入setup()

通常,您定义一种finite state machine行为不同的类型,无论用户应该输入数字基本代码还是数字或操作键。并且它将先前的输入(当前状态)存储在一些全局或静态变量中。

在结束时loop()没有“程序”完成,但它只是检查了所有当前可能的状态更改,存储它们并最终更新显示。

而且它loop()的速度足以在任何按钮按下时立即做出反应,它通常不会做任何事情,因为没有按下新键。

如果你的代码永远重复做某事,但应该只做一次,你根本不存储这已经完成的事实。(或者您使用重置按钮作为用户界面并仅允许“选择数字基数”用于setup()阶段)

于 2019-05-03T12:29:14.603 回答