Arduino素描即使没有太多,也会重复执行一条指令

时间:2019-05-03 01:57:22

标签: arduino arduino-uno arduino-ide arduino-c++

我正在编程一个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;

切换后,它必须执行以下代码:

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;
  }

显然包括其他条件,这些条件根据变量“ base”(用户在开始时输入的条件)而有所不同。如果是1(十进制),则接受数字0到9;如果是2(十六进制),则接受数字0到F,依此类推。 用户用可变键输入他的数字。对象calcuShift只是移位模式下的普通键盘,字母和其他两个操作数而不是数字,而乘法和除法操作数由幂和根操作数代替。

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

1 个答案:

答案 0 :(得分:0)

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

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

loop()的结尾没有“程序”完成,但是它只是检查了当前所有可能的状态更改,将其存储并最终进行了更新。

由于loop()足够快,可以在按下任何按钮时立即做出反应,因此通常不会执行任何操作,因为没有按下新键。

如果您的代码可以永久重复执行某件事,但应该只重复执行一次,那么您根本就不会存储已经完成的事实。 (或者您将“重置”按钮用作用户界面,并仅在setup()阶段允许使用“选择数字基础”)