Клавиатура 4х4.

m
Offline
Зарегистрирован: 15.11.2015

Товарищи прошу помощи в организации алгоритма считывания!

В наличии есть arduino mega 2560 и мембранная клавиатура 4х4, необходимо разработать код для считывния 2 и более символов с клавиатуры и записи в переменную, ну то есть нажали 1 потом 2 и на выходе получили 12, контролем начала и конца ввода является кнопка *, собственно со считыванием одного числа я разобрался но вот как считать 2 и более не вкуриваю.

P.S использую библиотеку Keypad.h.

P.P.S пример кода считавания на котором основывался.

 
#include <Keypad.h>
 
const byte ROWS = 4; 
const byte COLS = 4; 
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {3, 2, 1, 0};
byte colPins[COLS] = {7, 6, 5, 4}; 
 
 
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
 
void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
  }
}
vk007
Offline
Зарегистрирован: 16.06.2015

m пишет:

необходимо разработать код для считывния 2 и более символов с клавиатуры и записи в переменную, ну то есть нажали 1 потом 2 и на выходе получили 12, контролем начала и конца ввода является кнопка *, собственно со считыванием одного числа я разобрался но вот как считать 2 и более не вкуриваю.

Зарезервировать массив, размерностью равной количеству цифр в максимально ожидаемом вводимом числе, например, для чисел от 0 до 9999

byte num[4];

Потом в цикле, пока не будет нажата '*' (или как понравится), позаполнять массив полученными значениями нажимаемых кнопок (попутно отсеивая ненужные значения типа 'A'-'D' и '#' и можно сразу преобразовывая '0' в 0, '1' в 1 и т.д.).

Перед каждой записью новой цифры в num[0] сдвигать num[3] в num[4], num[2] в num[3], num[1] в num[2], num[0] в num[1].

В итоге, просто посчитать, что у нас получилось:

itogo = num[0] + 10*num[1] + 100*num[2] + 1000*num[3];

 

vk007
Offline
Зарегистрирован: 16.06.2015

Если нужное число всегда фиксированной длины (например, от 1111 до 9999) то и сдвигать в середине массива ничего не надо, а просто считать последовательно четыре цифры, записать их в num[3] - num[0] и сложить по той же формуле.

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

Вообще-то массив не нужен. Даже если число имеет произвольный формат.

Первоначально число инициализируется нулем.

При нажатии на кнопку анализируется, что именно нежето: если цифровая клавиша, число умножается на 10 и к нему прибавляется величина, соответствующая кнопке. Если нажата кнопка завершения (например, "*", как предложено выше). Набор числа прекращается и продолжается выполнение программы (например, манипуляции с этим числом).