Программирование экрана и клавиатуры

Виктор Смирнов
Offline
Зарегистрирован: 17.03.2017

Помогите новичку. Мне надо вывести на экран два символа (казалось бы всего то) да не тут то было. Подскажите что не так.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);  // Устанавливаем дисплей
 
 
int PinOut[4] {5, 4, 3, 2}; // пины выходы
 
int PinIn[4] {9, 8, 7, 6}; // пины входа
int val = 0;
const char value[4][4]
 
 
{ {'1', '4', '7', '*'},
  {'2', '5', '8', '0' },
  {'3', '6', '9', '#'},
  {'A', 'B', 'C', 'D'}
};
// двойной массив, обозначающий кнопку
 
int b = 0; // переменная, куда кладется число из массива(номер кнопки)
 
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  lcd.init();        
  lcd.backlight();// Включаем подсветку дисплея
 
  
  pinMode (2, OUTPUT); // инициализируем порты на выход (подают нули на столбцы)
  pinMode (3, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);
 
  pinMode (6, INPUT); // инициализируем порты на вход с подтяжкой к плюсу (принимают нули на строках)
  digitalWrite(6, HIGH);
  pinMode (7, INPUT);
  digitalWrite(7, HIGH);
  pinMode (8, INPUT);
  digitalWrite(8, HIGH);
  pinMode (9, INPUT);
  digitalWrite(9, HIGH);
 
  Serial.begin(9600); // открываем Serial порт
}
 
char matrix () // создаем функцию для чтения кнопок
{
  for (int i = 1; i <= 4; i++) // цикл, передающий 0 по всем столбцам
  {
    digitalWrite(PinOut[i - 1], LOW); // если i меньше 4 , то отправляем 0 на ножку
    for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам
    {
      if (digitalRead(PinIn[j - 1]) == LOW) // если один из указанных портов входа равен 0, то..
      {
        delay(200);
 
        return value[i - 1][j - 1];          
      }
    }
    digitalWrite(PinOut[i - 1], HIGH); // подаём обратно высокий уровень
  }
}
 
 
void loop()
{
  char sym1 = matrix();
  lcd.setCursor(0, 0);
  lcd.print(sym1);
  delay(2000); 
  char sym2 = matrix();
  lcd.setCursor(0, 1);
  lcd.print(sym2);  
}
 
Если выводить один символ, то работает, а два нет.
Т.Е. если loop такой
void loop()
{
  char sym1 = matrix();
  lcd.setCursor(0, 0);
  lcd.print(sym1);
}

то все в порядке.

 

Что не так?

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

Все так.

Этот код и должен выводить один символ.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Виктор Смирнов
Offline
Зарегистрирован: 17.03.2017

Здравствуйте,

мне не понятно почему при повторном вызове функции matrix пропадает как первый символ, так и второй и на экране появляются в этих позициях непонятные значки

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Виктор Смирнов пишет:

Здравствуйте,

мне не понятно почему при повторном вызове функции matrix пропадает как первый символ, так и второй и на экране появляются в этих позициях непонятные значки

Добрый день, а мне непонятно, почему Вы упорно игнорируете правила форума и отказываетесь вставить код как положено? В таком виде 90% за то, что его и читать-то никто не будет. 

T.Rook
Offline
Зарегистрирован: 05.03.2016

ЕвгенийП пишет:

 ...почему Вы упорно игнорируете правила форума и отказываетесь вставить код как положено? В таком виде 90% за то, что его и читать-то никто не будет.

+1

Вопрос к ТС: что возвращает matrix (), если ничего не нажато?

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Отвечу за ТC: ничего путнего он не возвращает. Точнее это зависит от реализации компилятора: может 0, а может вообще неопределенное значение.

Но хуже другое: когда кнопка нажата и matrix() возвращает нормальное значение, одна ножка микроконтроллера из PinOut[] остается в состоянии LOW. Поэтому поведение matrix() при повторном вызове может не соотвествовать ожиданиям ТС.

T.Rook
Offline
Зарегистрирован: 05.03.2016

AlexeySh пишет:

Отвечу за ТC

Вопрос был адресован тому, кому было необходимо получение знаний и опыта отладки, которые несоизмеримы со знанием простого ответа.