Матрица кнопок и светодиодов

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
seri0shka
Лейтенант
Сообщения: 391
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 22
Откуда: Кременчуг
Имя: Сергей

Матрица кнопок и светодиодов

#1

Сообщение seri0shka » 24.07.2019{, 15:33}

В моём устройстве для панели управления и индикации используется отдельный контроллер. Его задача- считать состояние клавиш, передать его в виде нескольких байт по УАРТ основному устройству, а также получить от основного устройства несколько байт информации о состоянии индикации и соответственно засветить нужные светодиоды. Соответственно физически блок управления и индикации связан с устройством четырьмя проводами:
gh.bmp
gh.bmp (221.37 КБ) 587 просмотров
Опрос клавиш (кнопок, тумблеров) происходит с помощью матрицы из нескольких строк и колонок, светодиоды так же объединены в матрицу, строки для обеих матриц являются общими. Матрица на 8 общих строк, 6 колонок клавиатуры, и 6 колонок индикации (8+6+6 выводов контроллера), соответственно количество кнопок до 48 штук, и до 48 светодиодов. Опрос и индикация производятся динамически. Вместо светодиодов можно подключить до 6 семисегментных индикаторов, или, к примеру, 4 семисегментника плюс 16 светодиодов. На схеме для упрощения показана матрица на 6 строк и по 4 колонки.
СпойлерПоказать
СХЕМА20а.jpg
Поиски по сети не сильно успешны, пришлось с нуля написать собственный блок для работы с матрицей. На входы блока подаются 6 байтовых переменных для управления светодиодами, с выходов блока снимаются также 6 байтовых переменных по результатам считывания состояния кнопок.
KlavAndLed_03_(CODE).ubi
(78 КБ) 53 скачивания
Вот он в составе тестового проекта:
blok indikacii 01.flp
(273.36 КБ) 41 скачивание
СпойлерПоказать
скрФЛпр.png
Собственно, всё работает, как задумано, но в моём блоке не предусмотрено программное подавление дребезга контактов. Конечно, можно возложить эту функцию на основное устройство, но не хочется отвлекать его от работы по пустякам. Дело осложнено ещё тем, что результаты опроса клавиатуры получаю в виде байт, то есть состояние каждой кнопки- это один бит в байте. Ресурсов доп. контроллера достаточно для обработки ещё 48 переменных, но моих мозгов уже не хватает. Прошу помощи.
Компромиссный вариант- проверять именно байты на изменение, но тогда одновременное нажатие 2 и более кнопок система будет воспринимать с задержкой (как дребезг).
Для тех, кто не хочет загружать и открывать проект, часть блока опроса и индикации:

Код: Выделить всё

  for (byte r = 0; r < 8; r++) // цикл for, меняющий номер выхода
  {
    digitalWrite(keypadOut[r], LOW); // подаём низкий уровень на выход строки
    delayMicroseconds(2);
    for (byte c = 0; c < 6; c++) // цикл for, меняющий номер входа
    {
      bitWrite(OutByteKlav[c], r, !digitalRead(keypadIn[c])); // меняем соответствующий бит по результату опроса клавиатуры
      digitalWrite(ledOut[c], bitRead(InByteLed[c], r)); // зажигаем светодиод в соответствии с полученной от устр. информацией
    }
    delay(2);
    digitalWrite(led1, 0); // погасили все светодиоды
    digitalWrite(led2, 0);
    digitalWrite(led3, 0);
    digitalWrite(led4, 0);
    digitalWrite(led5, 0);
    digitalWrite(led6, 0);
    digitalWrite(keypadOut[r], HIGH); // подаём обратно высокий уровень на выход строки
  }

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Матрица кнопок и светодиодов

#2

Сообщение Dryundel » 24.07.2019{, 21:28}

seri0shka писал(а):
24.07.2019{, 15:33}
В моём устройстве для панели управления и индикации используется отдельный контроллер. Его задача- считать состояние клавиш, передать его в виде нескольких байт по УАРТ основному устройству, а также получить от основного устройства несколько байт информации о состоянии индикации и соответственно засветить нужные светодиоды. Соответственно физически блок управления и индикации связан с устройством четырьмя проводами:
Скажите, а оно действительно нужно?
Ну я понимаю применение кнопочной матрицы такого типа обусловлена наличием в продаже дешевых пленочных матриц. Иногда это удобно, не смотря на недостаток невозможности отслеживания нажатия более двух кнопок одновременно. Ведь зачастую и не требуется одновременное нажатие. А вот светодиодная матрица такого типа, тем более для индикации, это мне кажется совсем не камильфо. Возможность правильной индикации только двух светодиодов одновременно, мне кажется совсем не функционально.

Не проще ли, если это не матричная клавиатура, вместо доп контроллера, воспользоваться микросхемами расширений на принципе сдвиговых регистров и в случае отдельных кнопок и для индикаторных светодиодов?

seri0shka
Лейтенант
Сообщения: 391
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 22
Откуда: Кременчуг
Имя: Сергей

Матрица кнопок и светодиодов

#3

Сообщение seri0shka » 24.07.2019{, 22:14}

Dryundel писал(а):
24.07.2019{, 21:28}
Скажите, а оно действительно нужно?
Можно догадаться, что нужно, если прикинуть, сколько времени я на это потратил. По сравнению с применением специализированных микросхем (чей протокол общения ещё нужно впихнуть в контроллер, в отличие от аппаратного УАРТа) я вижу только плюсы. Кроме того, я вовсе не ориентировался на дешевые пленочные матрицы, совершенно другие кнопки и переключатели. И с чего вы взяли, что индикация только двух светодиодов одновременно? Схема позволяет засветить как один, так и все светодиоды вместе- самая обычная динамическая индикация. Также схема без изменений позволяет отслеживать до 6 одновременно включенных тумблеров, если они подключены к одной строке матрицы, или при применении диода последовательно с каждой кнопкой/переключателем вообще любое количество в любой комбинации.

Аватара пользователя
Nikan
Майор
Сообщения: 1194
Зарегистрирован: 29.12.2016{, 00:49}
Репутация: 100
Откуда: москва

Матрица кнопок и светодиодов

#4

Сообщение Nikan » 24.07.2019{, 22:23}

.
Последний раз редактировалось Nikan 23.03.2023{, 23:37}, всего редактировалось 1 раз.

seri0shka
Лейтенант
Сообщения: 391
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 22
Откуда: Кременчуг
Имя: Сергей

Матрица кнопок и светодиодов

#5

Сообщение seri0shka » 24.07.2019{, 22:34}

Nikan, ну как бы 16 кнопок- не 48, опять же, нужно ещё ухитриться связать её с контроллером. Кстати, не подскажете толковые примеры применения именно и с кнопками, и со светодиодами, лучше в FLprog? Хотя это не отменяет первоначальный вопрос.

Аватара пользователя
Nikan
Майор
Сообщения: 1194
Зарегистрирован: 29.12.2016{, 00:49}
Репутация: 100
Откуда: москва

Матрица кнопок и светодиодов

#6

Сообщение Nikan » 24.07.2019{, 22:47}

.
Последний раз редактировалось Nikan 23.03.2023{, 23:36}, всего редактировалось 1 раз.

seri0shka
Лейтенант
Сообщения: 391
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 22
Откуда: Кременчуг
Имя: Сергей

Матрица кнопок и светодиодов

#7

Сообщение seri0shka » 24.07.2019{, 23:25}

Nikan писал(а):
24.07.2019{, 22:47}
возьмите ТМ1638
Нет, там 24 кнопки и 80 (!) светиков. Лучше бы поровну поделили. Кроме того, 3 провода управления. Ну и протокол, грузящий контроллер в любом случае больше, чем аппаратный UART. А цена всего в 2 раза меньше, чем применяемая мной атмега8, не говоря о том, что 1638 ещё купить надо (плюс стоимость доставки и время).Так что я склоняюсь к своему варианту, он и без подавления дребезга нормально работает. Но хочется всё же нормально сделать.

Аватара пользователя
Nikan
Майор
Сообщения: 1194
Зарегистрирован: 29.12.2016{, 00:49}
Репутация: 100
Откуда: москва

Матрица кнопок и светодиодов

#8

Сообщение Nikan » 24.07.2019{, 23:35}

.

Ответить

Вернуться в «Спросить у знатоков»