Ввод текста в переменную "char" с матричной клавиатуры.
- Войдите на сайт для отправки комментариев
Вс, 08/05/2016 - 21:14
Добрый вечер. Прошу помощи у опытных ардуинщиков. Никак немогу сообразить как в переменную "char" ввести текст с матричной клавиатуры. Вот пример программы, но таким способом сохраняется последний введённый символ. Понимаю что нужно работать с массивами, но туплю конкретно, никак не соображу чё и как. Помогите пожлуйста, а то мозг уже начинает закипать.
void loop() { for (int i = 1; i <= 4; i++) // цикл, передающий 1 по всем столбцам { digitalWrite(ryad[i - 1], HIGH); // если i меньше 4 , то отправляем 1 на ножку for (int j = 1; j <= 4; j++) // цикл, принимающих 1 по строкам { if (digitalRead(stroka[j - 1]) == HIGH) // если один из указанных портов входа равен 1, то... { time = millis(); } if (digitalRead(stroka[j - 1]) == HIGH && a == 0) // если один из указанных портов входа равен 1 и переменная "а" равна 0, то... { lcd.clear(); //очищаем экран lcd chislo = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" a = 1; //переменной "а" присваиваем 1 } if (digitalRead(stroka[j - 1]) == LOW && a == 1 && millis() - time >= 10) //если кнопка отпущена, переменная "а" равна 1 и прошло 100 мсек, то... { a = 0; //переменной "а" возвращаем 0 } } digitalWrite(ryad[i - 1], LOW); // подаём обратно низкий уровень } }
Таким способом тоже ничего не получилось
char chislo[16]; if (digitalRead(stroka[j - 1]) == HIGH && a == 0) // если один из указанных портов входа равен 1 и переменная "а" равна 0, то... { lcd.clear(); //очищаем экран lcd chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры lcd.print(chislo[b]); // выводим на экран lcd данные переменной "chislo" b++; a = 1; //переменной "а" присваиваем 1 }
Во втором примере, исправьте
на
Сергей, есть же библиотека
http://playground.arduino.cc/Code/Keypad
Во втором примере, исправьте
на
lcd не реагирует, экран чистый.
Во втором примере, исправьте
на
lcd не реагирует, экран чистый.
Разобрался. У меня было int b = 1, поменнял на int b = 0, lcd ожил но всё равно показывает только последний введённый знак, значит в переменную "char chislo[16]" записуется только один знак, а мне нужно записать строку минимум из 18-ти знаков.
Покажите весь код, в char chislo[16] можно записать строку длинной 15 символов+ символ окончания строки 0x00. В вашем коде не вижу объявления b и непонятно где инициализируется массив.
Покажите весь код, в char chislo[16] можно записать строку длинной 15 символов+ символ окончания строки 0x00. В вашем коде не вижу объявления b и непонятно где инициализируется массив.
После lcd.print(chislo);
Добавте b++;
это если после заполнения строки ее не надо очищать, если надо.
То тут 2 пути, сделать карусельку, последний символ вытесняет первый или чистить и писать сначала.
После lcd.print(chislo);
Добавте b++;
это если после заполнения строки ее не надо очищать, если надо.
То тут 2 пути, сделать карусельку, последний символ вытесняет первый или чистить и писать сначала.
Вот спасибо, всё получилось. У меня к вам ещё просьба будет, покажите как вытеснять первый символ.
И ещё одна посьба. обьясните мне строку chislo[b+1] = 0x00; а то я боюсь опять залезть в дебри и ненайду толкового обьяснения из-за кучи информации в гугле.
данный код:
Замените на:
chislo[b+1] = 0x00;
0x00 или '\0' - это специальный знак, который говорит, что показать символы до него, а его и после не надо. b у нас указывет последний символ который надо выводить, вот после него (b+1) и ставим.
данный код:
Замените на:
chislo[b+1] = 0x00;
0x00 или '\0' - это специальный знак, который говорит, что показать символы до него, а его и после не надо. b у нас указывет последний символ который надо выводить, вот после него (b+1) и ставим.
Я сделал вот так
Сейчас попробую сделать как вы посоветовали.
Я кажись, забыл b++; добавить в предпоследнюю строку, а то он еще раз по првому условию зайдет.
Я кажись, забыл b++; добавить в предпоследнюю строку, а то он еще раз по првому условию зайдет.
В предпоследнюю, это в каком месте?
А то что вы в цикле использовали переменную "b" на работе программы никак не отразится?
Я кажись, забыл b++; добавить в предпоследнюю строку, а то он еще раз по првому условию зайдет.
В предпоследнюю, это в каком месте?
А то что вы в цикле использовали переменную "b" на работе программы никак не отразится?
Она используется только для того, чтоб перемещаться по вашему массиву. Не должна :-). Если все правильно.
Для нагллядности конечно это может плохо , но бывают случаи когда нету пары лишних байт.
Молчит мониторчик.
Точно, вывода до нет :-))
Вернул назад кусок скетча
лсд ожил но, на 16-ом знаке экран очищается и больше не реагирует.
Я Вас ещё не задолбал?
Точно, вывода до нет :-))
И так молчит.
Вернул назад кусок скетча
лсд ожил но, на 16-ом знаке экран очищается и больше не реагирует.
Я Вас ещё не задолбал?
Вставте последний код, (в препоследнем вывод был только по условию, если символов было меньше 15)
Точно, вывода до нет :-))
И так молчит.
lcd.print(chislo);
// выводим на экран lcd данные переменной "chislo"
Точно в конце идет ?
Сделал вот так
всё работает, проблема была в этой команде
когда поменял на
всё пошло хорошо.
Только что провёл эксперемент с командой chislo[b++] нажимал на кнопки когда в впрграмме использовалась эта комонда. На 24-е нажатие на ЛСД высветилиси все элементы на которые я нажимал и дальше программа работала нормально.
rigl большое спасибо что уделии мне внимание.
всё работает, проблема была в этой команде
1
chislo[b++]
когда поменял на
1
chislo[b+1]
всё пошло хорошо.
Так и оставте, я ошибся.