Эскиз Arduino повторяет инструкцию, даже если у нее нет слишком - PullRequest
0 голосов
/ 03 мая 2019

Я программирую Arduino Sketch, который в общих чертах является калькулятором, использующим 4 числовые системы: десятичную, двоичную, восьмеричную и шестнадцатеричную.Когда я спрашиваю пользователя о числовой системе, он вводит желаемую систему (1 для десятичной, 2 для шестнадцатеричной, 3 для восьмеричной и 4 для двоичной) с помощью клавиатуры, затем, после получения этого ввода, Arduino печатает на ЖК-дисплеевыбранная система.Но эти части кода, кажется, повторяются бесконечно, не выполняя часть, в которую вводятся числа и операнды.Я не могу ввести числа, которые не являются 1, 2, 3 или 4, и если я нажимаю одно из этих чисел, он печатает свою систему, полностью игнорируя предыдущий ввод.

Я пробовал булевы переключатели, чтобы указатьпрограмма не запускает эту часть кода, если она была выполнена ранее, но, похоже, она не работает

Это часть кода, которая получает ввод и проверяет его.Случай переключателя повторяется еще три раза в остальных трех случаях, изменяя числовую систему, которая печатается.

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

Очевидно, включая другие условные операторы if, которые варьируются в зависимости от переменной "base" (той, которую пользователь вводит в начале).Если это 1 (десятичное число), оно принимает числа от 0 до 9, если это 2 (шестнадцатеричное), оно принимает числа от 0 до F и т. Д. Пользователь вводит свои числа с помощью ключа переменной.Объект calcShift - это обычная клавиатура в режиме сдвига, в которой буквы и другие два операнда вместо чисел и операнды умножения и деления заменены на операнды питания и корня.

Я хочу, чтобы мой калькулятор получал требуемое числовое значениесистема, получает числа в такой системе и выполняет операции с этими числами, возвращая ответ в ранее выбранной системе, но вместо этого просто придерживается ввода переменной "base", которая определяет используемую числовую систему.

1 Ответ

0 голосов
/ 03 мая 2019

Эскиз Arduino предназначен для выполнения loop() максимально быстро навсегда.Все, что должно запускаться один раз после запуска, должно перейти в setup()

Как правило, вы определяете вид finite state machine, который ведет себя иначе, независимо от того, должен ли пользователь вводить базовый код числа или цифру илиключ оператора.И он хранит предыдущий ввод (текущее состояние) в некоторых глобальных или статических переменных.

В конце loop() нет завершения "программы", но он просто проверил все возможные на данный момент изменения состояния, сохранил их и , в конечном итоге обновил отображение.

И поскольку loop() достаточно быстр, чтобы немедленно реагировать на любое нажатие кнопки, он обычно просто ничего не делает, так как не нажимается новая клавиша.

Если ваш код повторяет что-то постоянно, носледует сделать это только один раз, вы просто не сохраните тот факт, что это уже было сделано.(Или вы используете кнопку сброса в качестве пользовательского интерфейса и допускаете, что «выберите базу номеров» только для фазы setup())

...