Простой ввод текста с помощью 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 остановит ввод, и вы увидите сообщение «Успех!!» в первой строке и введенный текст во второй строке.
Пожалуйста, помогите. Я в тупике. Спасибо.
@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
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- Как переключить светодиод при нажатии кнопки?
- Очень простая операция Arduino Uno Serial.readString()
- форматирование строк в Arduino для вывода
- DateTime в строку
- Как преобразовать строку в массив байтов
- Создание форматированной строки (включая числа с плавающей запятой) в Arduino-совместимом C++
Не могли бы вы прояснить текущее поведение (вы только что сказали, что это не работает, но это не дает никаких указаний, где исследовать)? Кроме того, было бы неплохо увидеть код
setup()
и объявление переменных. Наконец, описание вашей проводки тоже было бы неплохо, в частности, вы не упомянули, используете ли вы подтягивающие или подтягивающие резисторы., @jfpoilpretСпасибо и извините за то, что не разъяснил ситуацию, я действительно ничего не понимаю в вещах. Я тоже не очень заинтересован, поэтому я просто пытаюсь переписать коды с нуля или изменить то, как все будет работать. Я думаю, вы можете проверить полный код здесь http://pastebin.com/knbXsen4 ;; Мой дизайн... Я не слишком уверен, хорошо это или плохо, но после того, как я протестировал его, он нуждается в устранении дребезга. Вот еще картинка http://i.imgur.com/KHn3zzh.png, спасибо за очки. В следующий раз постараюсь быть более информативным и понятным., @Febri Kurniawan