Ввод переменной с матричной клавиатуры

MoLoCo
Offline
Зарегистрирован: 25.02.2018

Приветствую!

Встала задача вводить данные с матричной клавиатуры 4х4 и выводить на LCD 1602. Клавиатуру я прицепил взаимодействие наладил, при нажатии на кнопку на дисплее выводиться значение, НО значение одноразарядное 0...9, а мне нужно -100...100 как это реализовать не могу додуматься. Может кто уже делал подобный алгоритм поделитесь наработками!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

n = n*10 + k,

где n - искомое число, а k - очередная введенная цифра.

MoLoCo
Offline
Зарегистрирован: 25.02.2018

Необходимо реализовать последовательный ввод значений. Например нужно ввести -100. Вводим 1, далее 0 (еденицу двигаем на разряд вперед) получаем 10 далее таким же образом вводим еще 0 получаем 100, нажимаем кнопку +- выводим окончательно значение -100

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

как делал, что не получается? 

MoLoCo
Offline
Зарегистрирован: 25.02.2018

andriano пишет:

n = n*10 + k,

где n - искомое число, а k - очередная введенная цифра.

Это уже ближе к теме, а как реализовать отрицательное значение?

MoLoCo
Offline
Зарегистрирован: 25.02.2018

DetSimen пишет:

как делал, что не получается? 

Создавал массив и в цикле присваивал значение в 0 ячейку, потом при новом нажатии из 0 ячейки массива переписывал в следующую а в 0 записывал новое значение. Но я оперировал знаковыми переменными в соответствии с ASCII ' -', т.е. каждой кнопке присвоен тип char '0'...'9' для упрощенного ввода на дисплей. Но походу это не вариант...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пока свой код не выкладешь, никто шипко и не поможет

Читай всё, а особенна п.5 и далее

http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#commen...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

MoLoCo пишет:

DetSimen пишет:

как делал, что не получается? 

Создавал массив и в цикле присваивал значение в 0 ячейку, потом при новом нажатии из 0 ячейки массива переписывал в следующую а в 0 записывал новое значение. Но я оперировал знаковыми переменными в соответствии с ASCII ' -', т.е. каждой кнопке присвоен тип char '0'...'9' для упрощенного ввода на дисплей. Но походу это не вариант...

1. Смена знава - умножение на минус единицу.

2. По поводу предложенноо алгоритма - он идейно неправильный. Надо разделить задачк на две:

- ввод числа с клавиатуры,

- вывод числа на экран.

Первое реализуется, как написал я, второе - как Дед.

И массивы для этого не нужны.

MoLoCo
Offline
Зарегистрирован: 25.02.2018
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 - вывод значения на дисплей

IVAN222
Offline
Зарегистрирован: 19.04.2017

При нажатии на кнопки Вы можете вводить только одну цифру от 0 до 9, для того что бы вводить 2,3 ,4. и т.д. значные чисела Вам нужно делать математическое действие, я делал так.

data = data*10+customKey-48;  //передвигаем каретку в право и присваеваем data это значение 

 

MoLoCo
Offline
Зарегистрирован: 25.02.2018

-48? Это значит что у вас диапазон от -50? А если необходимо 10 записать нужно вводить 58?

IVAN222
Offline
Зарегистрирован: 19.04.2017
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);

И вводите любое многозначное число

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

"-48" - это преобразовангие введенного байта из символа от '0' до '9' в число от 0 до 9.

MoLoCo
Offline
Зарегистрирован: 25.02.2018

MoLoCo пишет:

-48? Это значит что у вас диапазон от -50? А если необходимо 10 записать нужно вводить 58?

Все до самого доперло это 0х30:))) для перевода из ASCII

MoLoCo
Offline
Зарегистрирован: 25.02.2018

Буду пробовать писать "идейно правильно". Спасибо за напутствия! Далее отпишу получилось или нет.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

IVAN222 пишет:

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);

И вводите любое многозначное число

 

Писец простыня сравнений, видимо, простое сравнение уже не котируется:

if(customKey >= '0' && customKey <= '9')

Боюсь представить, какая простыня будет для латинского алфавита, при таком подходе-то :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Оплата - построчно.

MoLoCo
Offline
Зарегистрирован: 25.02.2018

Как у Маяковского

MoLoCo
Offline
Зарегистрирован: 25.02.2018

В общем запилил ввод данных, отредактировал значения кнопок перешел на числовой тип вместо символьного, сделал перевод числа в строку для индикации на дисплее, установил границы вводимого значения. При установке "-" пришлось переписывать все строки выводимые на дисплей. Самым большим гемором оказалось подобрать задержки на нажатия т.к. у всех кнопок время дребезга контактов разное.

 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;

   }
 } 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Самое удивительно не это.  Надо организовывать прием с клавиатуры, так прием с Serial. А этот подход уже ведет в никуда. Организовывается буфер. И нажатие с клавиатуры кидается в этот буфер. Потом уже кому надо извлекает.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пух, тебе нада преподавать ораторское искусство.  А мне - громматегу. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Так я и тренирую. Вот сейчас прохожу фразу

Уже неделю.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

qwone пишет:

Самое удивительно не это.  Надо организовывать прием с клавиатуры, так прием с Serial. А этот подход уже ведет в никуда. Организовывается буфер. И нажатие с клавиатуры кидается в этот буфер. Потом уже кому надо извлекает.

Объясните, зачем нужен лишний буфер?