Я делаю по тому же принципу, что описал vet:
Цитата
единожды настроенный порт далее не трогал бы, а в процедуре опроса клавиш гасил бы столбцы поодиночке и сканировал бы строки на лог.ноль
Но хранение состояний клавиш немного более разветвленное.
У меня хранятся:
1. Текущее состояние (Не нажата, Преднажата, Нажата, Долго нажата, Отпущена) state
2. Значение сантисекунд, когда было выставлено последнее состояние time
3. Флаг ее обработки worked
4. Счетчик повторений count
Упрощенный алгоритм опроса клавиш таков:
Код
- С клавиатуры считывается состояние кнопки.
- Если она не нажата, то:
{
- если state не равно "Отпущена" или "Не нажата", то установить state в "Отпущена" и worked в "ложь"
}
- Иначе:
{
switch()
{
- Если state равно "Преднажата", установить state в "Нажата", worked в "ложь" и time в текущие сантисекунды
- Если ее состояние равно "Нажата" и разница между текущими сантисекундами и time больше 50 (пол-секунды), установить state в "Долго нажата", worked в "ложь", time в текущие сантисекунды, count в 1
- Если ее состояние равно "Долго нажата" и разница между текущими сантисекундами и time больше 10, установить worked в "ложь", инкрементировать count
}
}
Повторить для всех клавиш
Вот... А в главном цикле просто проверяются флаги worked, и если у какой-то клавиши он установлен в "ложь", то в зависимости от state производятся каки-либо действия, после чего флаг worked сбрасывается в "истина" (а если клавиша была в состоянии "Отпущена", то и состояние сбрасывается в "Не нажата").
Довольно простой алгоритм, позволяющий обрабатывать нажатия кнопок как угодно - одиночные нажатия, долгие нажатия с периодом автонажатия, отпускания...
Да, кстати... период опроса клавиш у меня обычно 10 милисекунд (1 сантисекунда), с одной стороны для антидребезга этого вполне достаточно, с другой стороны - позволяет реагировать на довольно краткие нажатия клавиш.