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