Простой ввод текста с помощью 5 кнопок

Итак, мне нужно сделать эту функцию, но я не настолько умен и запутался. (извините! Я полный нуб)

Эта функция в основном представляет собой ввод текста с помощью пяти кнопок, кнопок со стрелками и кнопки «ОК». Кнопки «вверх» и «вниз» будут использоваться для переключения букв (az), а кнопки «влево» и «вправо» — для выбора массива для циклического переключения букв.

Контроль будет:

  • кнопка вверх (вверх): ASCII-1 (z, y, x...)
  • кнопка вниз (dw): ASCII+1 (a, b, c...)
  • правая кнопка (ri): array[i] ~> i+1 (перейти к следующему символу/массиву)
  • левая кнопка (le): array[i] ~> i-1 (перейти к предыдущему символу/массиву)
  • кнопка ok (ok): подтверждение текста и изменение лимита, чтобы остановить зацикливание функций

Я не могу заставить его работать с тем кодом, который пишу.

void intext()
{
  int lim=16;
  lcd.setCursor(0,1);
  lcd.print(input);
  for(i=0; i<lim ; )
  {
    if(digitalRead(dw)==HIGH)
    {
      if(input[i]<'a')
        input[i]='z';
      if(input[i]>'z')
        input[i]='a';
      input[i]=input[i]+1;
      delay(1000);
    }
    if(digitalRead(up)==HIGH)
    {
      if(input[i]<'a')
        input[i]='z';
      if(input[i]>'z')
        input[i]='a';
      input[i]=input[i]-1;
      delay(1000);      
    }
    if(digitalRead(ri)==HIGH)
    {
      delay(1000);    
      i=i+1;
    }
    if(digitalRead(le)==HIGH)
    {
      delay(1000); 
      i=i+1;
    }
    if(digitalRead(ok)==HIGH)
    {
      lim=i+1;
      delay(1000); 
    }
  }
}

void loop()
{
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Type your text:");
  intext();
  lcd.setCursor(0,0);
  lcd.print("Success!!");
  lcd.setCursor(0,1);
  lcd.print(input);
}

Я хотел, чтобы результат был таким: сначала вы получили «введите свой текст:» в первой строке и пробел во второй строке. наш курсор находится в первом столбце второй строки, поэтому мы можем циклически перебирать буквы алфавита. если вы нажмете вправо, вы можете редактировать следующий столбец второй строки. вы можете перейти к предыдущему столбцу во второй строке, нажав влево. Вы можете ввести до 15 символов. после завершения ввода нажатие ok остановит ввод, и вы увидите сообщение «Успех!!» в первой строке и введенный текст во второй строке.

Пожалуйста, помогите. Я в тупике. Спасибо.

, 👍1

Обсуждение

Не могли бы вы прояснить текущее поведение (вы только что сказали, что это не работает, но это не дает никаких указаний, где исследовать)? Кроме того, было бы неплохо увидеть код setup() и объявление переменных. Наконец, описание вашей проводки тоже было бы неплохо, в частности, вы не упомянули, используете ли вы подтягивающие или подтягивающие резисторы., @jfpoilpret

Спасибо и извините за то, что не разъяснил ситуацию, я действительно ничего не понимаю в вещах. Я тоже не очень заинтересован, поэтому я просто пытаюсь переписать коды с нуля или изменить то, как все будет работать. Я думаю, вы можете проверить полный код здесь http://pastebin.com/knbXsen4 ;; Мой дизайн... Я не слишком уверен, хорошо это или плохо, но после того, как я протестировал его, он нуждается в устранении дребезга. Вот еще картинка http://i.imgur.com/KHn3zzh.png, спасибо за очки. В следующий раз постараюсь быть более информативным и понятным., @Febri Kurniawan


1 ответ


Лучший ответ:

1

Несколько проблем в опубликованном вами коде:

  • Каждое изменение текста, которое вы делаете внутри цикла for, не будет отображаться на ЖК-дисплее до тех пор, пока цикл for не завершится (когда i<limit уже не будет верным утверждением). Вы можете добавить дополнительный код внутри цикла for и вне любого из его условных операторов, который будет многократно устанавливать курсор и выводить input на ЖК-дисплей. Что-то похожее на код, который у вас есть до цикла for:

    void intext() 
    {
      ... // остальная часть кода до цикла for
    
      for (int i; i<limit; ) 
      {
        ... // все условия вверх/вниз/влево/вправо/ок
    
        lcd.setCursor(0,1);
        lcd.print(input);
      }
    }
    
  • Еще одна проблема заключается в том, что когда пользователь нажимает влево, счетчик должен уменьшаться, а не увеличиваться, и вы должны проверять левую границу:

    if(digitalRead(le)==HIGH && i>0) // добавлена проверка левой границы
    {
       delay(1000); 
       i=i-1; // а не i=i+1;
    
    }
    
  • После нажатия ОК и поскольку цикл for не увеличивает i, условие в for (i<limit) останется истинным, и цикл не завершится, пока пользователь не щелкнет Вправо еще раз. Чтобы смягчить это, измените следующее

    if(digitalRead(ok)==HIGH)
    {
      lim=i; // а не: lim=i+1;
      delay(1000); 
    }
    

В противном случае пользователю придется нажать Вправо для завершения, чтобы еще раз увеличить i.

    Комментарий
  • jfpoilpret о подтягивании вверх/вниз очень важен. Убедитесь, что вы используете подтягивающие/подтягивающие резисторы, чтобы предотвратить устранение дребезга входных сигналов (подробнее по этой ссылке).
,

Ты мой свет. Спасибо. Извините, что не дал качественный комментарий. Я просто... в восторге.., @Febri Kurniawan