[spoiler] [/spoiler]
Поиски по сети не сильно успешны, пришлось с нуля написать собственный блок для работы с матрицей. На входы блока подаются 6 байтовых переменных для управления светодиодами, с выходов блока снимаются также 6 байтовых переменных по результатам считывания состояния кнопок. Вот он в составе тестового проекта: [spoiler] [/spoiler]
Собственно, всё работает, как задумано, но в моём блоке не предусмотрено программное подавление дребезга контактов. Конечно, можно возложить эту функцию на основное устройство, но не хочется отвлекать его от работы по пустякам. Дело осложнено ещё тем, что результаты опроса клавиатуры получаю в виде байт, то есть состояние каждой кнопки- это один бит в байте. Ресурсов доп. контроллера достаточно для обработки ещё 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); // подаём обратно высокий уровень на выход строки
}