В моём устройстве для панели управления и индикации используется отдельный контроллер. Его задача- считать состояние клавиш, передать его в виде нескольких байт по УАРТ основному устройству, а также получить от основного устройства несколько байт информации о состоянии индикации и соответственно засветить нужные светодиоды. Соответственно физически блок управления и индикации связан с устройством четырьмя проводами:
- gh.bmp (221.37 КБ) 588 просмотров
Опрос клавиш (кнопок, тумблеров) происходит с помощью матрицы из нескольких строк и колонок, светодиоды так же объединены в матрицу, строки для обеих матриц являются общими. Матрица на 8 общих строк, 6 колонок клавиатуры, и 6 колонок индикации (8+6+6 выводов контроллера), соответственно количество кнопок до 48 штук, и до 48 светодиодов. Опрос и индикация производятся динамически. Вместо светодиодов можно подключить до 6 семисегментных индикаторов, или, к примеру, 4 семисегментника плюс 16 светодиодов. На схеме для упрощения показана матрица на 6 строк и по 4 колонки.
Поиски по сети не сильно успешны, пришлось с нуля написать собственный блок для работы с матрицей. На входы блока подаются 6 байтовых переменных для управления светодиодами, с выходов блока снимаются также 6 байтовых переменных по результатам считывания состояния кнопок.
Вот он в составе тестового проекта:
Собственно, всё работает, как задумано, но в моём блоке не предусмотрено программное подавление дребезга контактов. Конечно, можно возложить эту функцию на основное устройство, но не хочется отвлекать его от работы по пустякам. Дело осложнено ещё тем, что результаты опроса клавиатуры получаю в виде байт, то есть состояние каждой кнопки- это один бит в байте. Ресурсов доп. контроллера достаточно для обработки ещё 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); // подаём обратно высокий уровень на выход строки
}