Ввод текста в переменную "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
}
Во втором примере, исправьте
на
if(b < 15) { chislo[b+1] = 0x00; lcd.print(chislo); }Сергей, есть же библиотека
http://playground.arduino.cc/Code/Keypad
Во втором примере, исправьте
на
if(b < 15) { chislo[b+1] = 0x00; lcd.print(chislo); }lcd не реагирует, экран чистый.
Во втором примере, исправьте
на
if(b < 15) { chislo[b+1] = 0x00; lcd.print(chislo); }lcd не реагирует, экран чистый.
Разобрался. У меня было int b = 1, поменнял на int b = 0, lcd ожил но всё равно показывает только последний введённый знак, значит в переменную "char chislo[16]" записуется только один знак, а мне нужно записать строку минимум из 18-ти знаков.
Покажите весь код, в char chislo[16] можно записать строку длинной 15 символов+ символ окончания строки 0x00. В вашем коде не вижу объявления b и непонятно где инициализируется массив.
Покажите весь код, в char chislo[16] можно записать строку длинной 15 символов+ символ окончания строки 0x00. В вашем коде не вижу объявления b и непонятно где инициализируется массив.
#include <LiquidCrystal.h> // Лобавляем необходимую библиотеку const int ryad[4] {6, 7, 8, 9}; const int stroka[4] {10, 11, 12, 13}; const char value[4][4] { {'1', '4', '7', '*'}, {'2', '5', '8', '0' }, {'3', '6', '9', '#'}, {'A', 'B', 'C', 'D'} }; int time = 0; int a = 0; int b = 0; char chislo[16]; LiquidCrystal lcd(0, 1, 2, 3, 4, 5); // (RS, E, DB4, DB5, DB6, DB7) void setup() { pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); pinMode(13, INPUT); lcd.begin(16, 2); // Задаем размерность экрана lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки } 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[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры if(b < 15) { chislo[b+1] = 0x00; 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); // подаём обратно низкий уровень } }После lcd.print(chislo);
Добавте b++;
это если после заполнения строки ее не надо очищать, если надо.
То тут 2 пути, сделать карусельку, последний символ вытесняет первый или чистить и писать сначала.
После lcd.print(chislo);
Добавте b++;
это если после заполнения строки ее не надо очищать, если надо.
То тут 2 пути, сделать карусельку, последний символ вытесняет первый или чистить и писать сначала.
Вот спасибо, всё получилось. У меня к вам ещё просьба будет, покажите как вытеснять первый символ.
И ещё одна посьба. обьясните мне строку chislo[b+1] = 0x00; а то я боюсь опять залезть в дебри и ненайду толкового обьяснения из-за кучи информации в гугле.
данный код:
lcd.clear(); //очищаем экран lcd chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры if(b < 15) { chislo[b+1] = 0x00; lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" }Замените на:
lcd.clear(); //очищаем экран lcd if(b < 15) // тут бы надо заменить 15 на размер массива-1 (можно объявить #define SIZE) { chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры chislo[b++] = 0x00; // тогда не нfдо дополнительного b++ lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" } else { for(b=1; b<14;b++) // а тут 14 на размер массива-2 chislo[b-1] = chislo[b]; chislo[b-1] = value[i - 1][j - 1]; }chislo[b+1] = 0x00;
0x00 или '\0' - это специальный знак, который говорит, что показать символы до него, а его и после не надо. b у нас указывет последний символ который надо выводить, вот после него (b+1) и ставим.
данный код:
lcd.clear(); //очищаем экран lcd chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры if(b < 15) { chislo[b+1] = 0x00; lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" }Замените на:
lcd.clear(); //очищаем экран lcd if(b < 15) // тут бы надо заменить 15 на размер массива-1 (можно объявить #define SIZE) { chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры chislo[b++] = 0x00; // тогда не нfдо дополнительного b++ lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" } else { for(b=1; b<14;b++) // а тут 14 на размер массива-2 chislo[b-1] = chislo[b]; chislo[b-1] = value[i - 1][j - 1]; }chislo[b+1] = 0x00;
0x00 или '\0' - это специальный знак, который говорит, что показать символы до него, а его и после не надо. b у нас указывет последний символ который надо выводить, вот после него (b+1) и ставим.
Я сделал вот так
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[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры chislo[b+1] = 0x00; lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" b++; if(b > 16) { c = b - 16; for(c; c > 0; c--) { lcd.scrollDisplayLeft(); } } a = 1; //переменной "а" присваиваем 1 } if (digitalRead(stroka[j - 1]) == LOW && a == 1 && millis() - time >= 10) //если кнопка отпущена, переменная "а" равна 1 и прошло 100 мсек, то... { a = 0; //переменной "а" возвращаем 0 } } digitalWrite(ryad[i - 1], LOW); // подаём обратно низкий уровень } }Сейчас попробую сделать как вы посоветовали.
Я кажись, забыл b++; добавить в предпоследнюю строку, а то он еще раз по првому условию зайдет.
Я кажись, забыл b++; добавить в предпоследнюю строку, а то он еще раз по првому условию зайдет.
В предпоследнюю, это в каком месте?
А то что вы в цикле использовали переменную "b" на работе программы никак не отразится?
Я кажись, забыл b++; добавить в предпоследнюю строку, а то он еще раз по првому условию зайдет.
В предпоследнюю, это в каком месте?
lcd.clear(); //очищаем экран lcd if(b < 15) // тут бы надо заменить 15 на размер массива-1 (можно объявить #define SIZE) { chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры chislo[b++] = 0x00; // тогда не нfдо дополнительного b++ lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" } else { for(b=1; b<14;b++) // а тут 14 на размер массива-2 chislo[b-1] = chislo[b]; chislo[b-1] = value[i - 1][j - 1]; b++; // чтоб она снова равнялась 15 }А то что вы в цикле использовали переменную "b" на работе программы никак не отразится?
Она используется только для того, чтоб перемещаться по вашему массиву. Не должна :-). Если все правильно.
Для нагллядности конечно это может плохо , но бывают случаи когда нету пары лишних байт.
Молчит мониторчик.
Точно, вывода до нет :-))
lcd.clear(); //очищаем экран lcd if(b < 15) // тут бы надо заменить 15 на размер массива-1 (можно объявить #define SIZE) { chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры chislo[b++] = 0x00; // тогда не нfдо дополнительного b++ } else { for(b=1; b<14;b++) // а тут 14 на размер массива-2 chislo[b-1] = chislo[b]; chislo[b-1] = value[i - 1][j - 1]; b++; // чтоб она снова равнялась 15 } lcd.print(chislo); // выводим на экран lcd данные переменной "chislo"Вернул назад кусок скетча
chislo[b+1] = 0x00; // тогда не нfдо дополнительного b++ lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" b++;лсд ожил но, на 16-ом знаке экран очищается и больше не реагирует.
Я Вас ещё не задолбал?
Точно, вывода до нет :-))
lcd.clear(); //очищаем экран lcd if(b < 15) // тут бы надо заменить 15 на размер массива-1 (можно объявить #define SIZE) { chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры chislo[b++] = 0x00; // тогда не нfдо дополнительного b++ } else { for(b=1; b<14;b++) // а тут 14 на размер массива-2 chislo[b-1] = chislo[b]; chislo[b-1] = value[i - 1][j - 1]; b++; // чтоб она снова равнялась 15 } lcd.print(chislo); // выводим на экран lcd данные переменной "chislo"И так молчит.
Вернул назад кусок скетча
chislo[b+1] = 0x00; // тогда не нfдо дополнительного b++ lcd.print(chislo); // выводим на экран lcd данные переменной "chislo" b++;лсд ожил но, на 16-ом знаке экран очищается и больше не реагирует.
Я Вас ещё не задолбал?
Вставте последний код, (в препоследнем вывод был только по условию, если символов было меньше 15)
Точно, вывода до нет :-))
lcd.clear(); //очищаем экран lcd if(b < 15) // тут бы надо заменить 15 на размер массива-1 (можно объявить #define SIZE) { chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры chislo[b+1] = 0x00; b++;} else { for(b=1; b<14;b++) // а тут 14 на размер массива-2 chislo[b-1] = chislo[b]; chislo[b-1] = value[i - 1][j - 1]; b++; // чтоб она снова равнялась 15 } lcd.print(chislo); // выводим на экран lcd данные переменной "chislo"И так молчит.
lcd.print(chislo);// выводим на экран lcd данные переменной "chislo"Точно в конце идет ?
Сделал вот так
#include <LiquidCrystal.h> // Лобавляем необходимую библиотеку const int ryad[4] {6, 7, 8, 9}; const int stroka[4] {10, 11, 12, 13}; const char value[4][4] { {'1', '4', '7', '*'}, {'2', '5', '8', '0' }, {'3', '6', '9', '#'}, {'A', 'B', 'C', 'D'} }; int time = 0; int a = 0; int b = 0; int c = 0; char chislo[255]; LiquidCrystal lcd(0, 1, 2, 3, 4, 5); // (RS, E, DB4, DB5, DB6, DB7) void setup() { pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); pinMode(13, INPUT); lcd.begin(16, 2); // Задаем размерность экрана lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки } 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 if(b < 16) // тут бы надо заменить 15 на размер массива-1 (можно объявить #define SIZE) { chislo[b] = value[i - 1][j - 1]; // вводим в переменную "chislo" символы с клавиатуры chislo[b+1] = 0x00; // тогда не нfдо дополнительного b++ b++; } else { for(b=1; b<16;b++) // а тут 14 на размер массива-2 chislo[b-1] = chislo[b]; chislo[b-1] = value[i - 1][j - 1]; b++; // чтоб она снова равнялась 15 } 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); // подаём обратно низкий уровень } }всё работает, проблема была в этой команде
когда поменял на
всё пошло хорошо.
Только что провёл эксперемент с командой chislo[b++] нажимал на кнопки когда в впрграмме использовалась эта комонда. На 24-е нажатие на ЛСД высветилиси все элементы на которые я нажимал и дальше программа работала нормально.
rigl большое спасибо что уделии мне внимание.
всё работает, проблема была в этой команде
1chislo[b++]когда поменял на
1chislo[b+1]всё пошло хорошо.
Так и оставте, я ошибся.