Ввод переменной с матричной клавиатуры
- Войдите на сайт для отправки комментариев
Пнд, 19/11/2018 - 13:24
Приветствую!
Встала задача вводить данные с матричной клавиатуры 4х4 и выводить на LCD 1602. Клавиатуру я прицепил взаимодействие наладил, при нажатии на кнопку на дисплее выводиться значение, НО значение одноразарядное 0...9, а мне нужно -100...100 как это реализовать не могу додуматься. Может кто уже делал подобный алгоритм поделитесь наработками!
n = n*10 + k,
где n - искомое число, а k - очередная введенная цифра.
Необходимо реализовать последовательный ввод значений. Например нужно ввести -100. Вводим 1, далее 0 (еденицу двигаем на разряд вперед) получаем 10 далее таким же образом вводим еще 0 получаем 100, нажимаем кнопку +- выводим окончательно значение -100
как делал, что не получается?
n = n*10 + k,
где n - искомое число, а k - очередная введенная цифра.
как делал, что не получается?
Пока свой код не выкладешь, никто шипко и не поможет
Читай всё, а особенна п.5 и далее
http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#commen...
как делал, что не получается?
1. Смена знава - умножение на минус единицу.
2. По поводу предложенноо алгоритма - он идейно неправильный. Надо разделить задачк на две:
- ввод числа с клавиатуры,
- вывод числа на экран.
Первое реализуется, как написал я, второе - как Дед.
И массивы для этого не нужны.
while(1) { if(out_symbol>=0x30 && out_symbol<=0x39 && (row_counter<NUMBER_SIZE)) { alp[row_counter]= out_symbol; row_counter++; } if(out_symbol == 'c') { return; Pos_LCD(1, 6+row_counter); string_LCD(&alp[row_counter]); } }Немного описания для понимания: В бесконечный цикл я попадаю из пункта меню где собственно и хочу вводить значение переменной с клавиатуры. out_symbol - это символьное значение нажатой кнопки. Клавиатура работает таким образом что при нажатии записывается символ нажатой кнопки например '9' в out_symbol после отжатия out_symbol обнуляется. alp - это массив куда хочу писать введенные значения. row_counter - переменная указывающая номер ячейки массива. NUMBER_SIZE - кол-во ячеек массива, разрядность числа. Pos_LCD - функция указателя позиции на дисплее куда выводить символ string_LCD - вывод значения на дисплей
При нажатии на кнопки Вы можете вводить только одну цифру от 0 до 9, для того что бы вводить 2,3 ,4. и т.д. значные чисела Вам нужно делать математическое действие, я делал так.
-48? Это значит что у вас диапазон от -50? А если необходимо 10 записать нужно вводить 58?
char customKey = customKeypad.getKey(); if (customKey){ if(customKey =='1'||customKey =='2'||customKey =='3'||customKey =='4'||customKey =='5'||customKey =='6'|| customKey =='7'||customKey =='8'||customKey =='9'||customKey =='0'){ //если нажата кнопка от 0-9 data = data*10+customKey-48; //передвигаем каретку в право и присваеваем data это значение } Serial.println(data);И вводите любое многозначное число
"-48" - это преобразовангие введенного байта из символа от '0' до '9' в число от 0 до 9.
-48? Это значит что у вас диапазон от -50? А если необходимо 10 записать нужно вводить 58?
Буду пробовать писать "идейно правильно". Спасибо за напутствия! Далее отпишу получилось или нет.
char customKey = customKeypad.getKey(); if (customKey){ if(customKey =='1'||customKey =='2'||customKey =='3'||customKey =='4'||customKey =='5'||customKey =='6'|| customKey =='7'||customKey =='8'||customKey =='9'||customKey =='0'){ //если нажата кнопка от 0-9 data = data*10+customKey-48; //передвигаем каретку в право и присваеваем data это значение } Serial.println(data);И вводите любое многозначное число
Писец простыня сравнений, видимо, простое сравнение уже не котируется:
Боюсь представить, какая простыня будет для латинского алфавита, при таком подходе-то :)
Оплата - построчно.
Как у Маяковского
В общем запилил ввод данных, отредактировал значения кнопок перешел на числовой тип вместо символьного, сделал перевод числа в строку для индикации на дисплее, установил границы вводимого значения. При установке "-" пришлось переписывать все строки выводимые на дисплей. Самым большим гемором оказалось подобрать задержки на нажатия т.к. у всех кнопок время дребезга контактов разное.
while(1) { if ((out_symbol>=0x00 && out_symbol<=0x09) && (aa>=-100 && aa <= 100)) { delay(20); aa = aa * 10 + out_symbol; delay(300); } if (out_symbol == 0x0A) { delay(200); aa *= (-1); Clear_LCD(); Pos_LCD(0,0); string_LCD("Etr_alpha_value"); Pos_LCD(1,0); string_LCD("alpha="); } if(aa<-100 || aa > 100) aa /=10; sprintf(alp_m,"%d",aa); Pos_LCD(1,6); string_LCD(alp_m); if(out_symbol == 'c') { delay(200); return; } }Самое удивительно не это. Надо организовывать прием с клавиатуры, так прием с Serial. А этот подход уже ведет в никуда. Организовывается буфер. И нажатие с клавиатуры кидается в этот буфер. Потом уже кому надо извлекает.
Пух, тебе нада преподавать ораторское искусство. А мне - громматегу.
Так я и тренирую. Вот сейчас прохожу фразу
Уже неделю.
Самое удивительно не это. Надо организовывать прием с клавиатуры, так прием с Serial. А этот подход уже ведет в никуда. Организовывается буфер. И нажатие с клавиатуры кидается в этот буфер. Потом уже кому надо извлекает.
Объясните, зачем нужен лишний буфер?