Ардуино, клавиатура LCD 1602 - ввод данных
- Войдите на сайт для отправки комментариев
Чт, 09/02/2017 - 16:07
Прошу подсказать, кто может. Нужно ввести с матричной клавиатуры на LCD 1602 две переменных, пригодных для независимых операций (сброс, корректировка). Примерным образом - нажимаем клавишу "А", вводим число в одной строке дисплея, затем нажимаем "В" и вводим второе число в другой строке. Отношения к программированию не имею, написал как мог два скетча, не судите строго, если неграмотно. Оба скетча не работают. В чем ошибка?
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {11,10,9,8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7,6,5,4}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
unsigned int numar1=0, numar2=0;
void setup(){
Serial.begin(9600);
lcd.begin(); // initialize the lcd
lcd.backlight();
}
void loop() {
char key = keypad.getKey();
if(key ='A'){
if (key != NO_KEY && (key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key=='0')){
numar1=(numar1*10)+int(key-'0');
lcd.setCursor(0,0);
lcd.print(numar1);
}
}
if(key ='B'){
if (key != NO_KEY && (key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key=='0')){
numar2=(numar2*10)+int(key-'0');
lcd.setCursor(0,0);
lcd.print(numar1);
}
}
}
Второй нерабочий скетч
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const byte ROWS = 4; //4 rows
const byte COLS = 4; //3 columns
//Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {11,10,9,8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7,6,5,4}; //connect to the column pinouts of the keypad
long first = 0;
long second = 0;
//Create the keypad
Keypad kpd = Keypad (makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
lcd.begin(); // initialize the lcd
lcd.backlight();
}
void loop() {
char key = kpd.getKey();
switch(key)
{
if(key ='A'){
case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
lcd.setCursor(0,0);
first = first * 10 + (key - '0');
lcd.print(first);
break;
}
}
switch(key)
{
if(key ='B'){
case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
lcd.setCursor(0,1);
second = second * 10 + (key - '0');
lcd.print(second);
break;
}
}
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Так вы с клавиатуры одно нажатие всего считываете, а хотите ещё несколько цифр получить. Поэтому ничего и не работает.
Или если более понятно, вы каждый раз проверяете нажатие клавиши "А" или "B". А все что внутри проверки не работает, потому что второй раз то вы клавиатуру не опрашиваете. Поэтому переменная key как была равна "A" так и осталась. А в следующей итерации loop() вы опять только "A" и "B" проверяете.
Проверяйте и обрабатыайте все клавиши. Тогда будет работать.
Знаний катастрофически не хватает. Если клавиша "А" нажата if(key=A), то должно выполняться действие описанное в фигурных скобках
Ну для таких вещей я такой скетч сделал . Нажал на нужную кнопку вызвал нужную функцию . Полный скетч здесь https://yadi.sk/d/WT0l3qE23AKXKx
Главный файл выкладываю
qwone, Спасибо
а чем keypad.h не устраивает?
я пользуюсь и вполне доволен....
Устроил бы если хватило бы знаний написать рабочий скетч без ошибок, для чего и попросил помощи. Человек помогает, я ему благодарен. В принципе за любую помощь
а чем keypad.h не устраивает?
я пользуюсь и вполне доволен....
1. Я стараюсь программировать в своем стиле. А он немного отличается установками.
2. keypad.h не соответствует классу Do.Термин тоже из моей концепции .