В этой статье описан вариант подключения 15-и кнопочной клавиатуры к 6-и линиям микроконтроллера AVR. Способ не нов, по этому в излишних комментариях не нуждается. Схема подключения клавиатуры к МК представлена на рисунке ниже. Если для кого-то схема с первого раза покажется не логичной, то нарисуйте на листе бумаги 6 точек (в виде шестиугольника) и каждые две точки соедините между собой линией. В итоге получите ровно 15 линий. Теперь в разрыв каждой линии вставьте кнопку. Получится клавиатура на 15 кнопок с шестью линиями ввода-вывода (точками).
Данным методом можно спроектировать клавиатуру на сколь угодное количество кнопок. Количество линий и количество подключенных к ним кнопок определяется соотношением:
NUM_WIRES * (NUM_WIRES - 1) / 2 = NUM_KEYS, где:
NUM_WIRES – количество используемых линий;
NUM_KEYS – количество используемых кнопок.
Опрос такой клавиатуры работает по следующему алгоритму:
1. Формируется байт состояния линий с начальным значением 0xFF;
2. Все линии клавиатуры устанавливаются на прием с подтягивающими pull-up резисторами;
3. Циклически опрашиваются все линии клавиатуры, путем перевода линии опроса на вывод и установления на ней уровня лог. “0”;
4. В каждом цикле опроса считывается состояние порта клавиатуры путем совмещения состояния порта с байтом состояния линий операцией логического “И”,
при этом, предварительно номер бита, равный номеру линии опроса устанавливается в единицу.
После завершения цикла сканирования в байте состояния будем иметь код, в котором номера сброшенных битов будут соответствовать номерам замкнутых линий. К достоинствам данной клавиатуры можно отнести не надобность дополнительных токоограничивающих резисторов, так как в каждом цикле на вывод работает только одна линия, остальные работают на ввод, важно лишь, чтобы при смене режима работы линии (ввод или вывод), сначала все линии устанавливались на вывод, что и реализовано в нижеприведенном коде. Недостатком способа является невозможность верного определения одновременных нажатий более чем одной кнопки. Данным методом можно опрашивать и матричную клавиатуру, при этом возможно отследить все одновременные нажатия кнопок. Ниже приведен пример опроса данной клавиатуры:
/*****************************************************************************
Определения для порта клавиатуры
******************************************************************************
#define KB_PORT PORTC
#define KB_DDR DDRC
#define KB_PIN PINC
#define KB_WIRES
((char)((1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7)))
#define KB_NO_USE ((char)((1 << 0)|(1 << 1)))
#define USE_WIRES 6
/* количество используемых линий */
#define NO_USE_WIRES 2
/* количество не используемых линий */
#define HI_WIRE
((char)(1 << 7)) /* номер стартовой при сканировании линии */
/*****************************************************************************
Сканирование клавиатуры. Возвращает код нажатых кнопок
******************************************************************************/
char KB_6_15_Scan(void)
{
char num_wires = USE_WIRES; /* инициализируем счетчик циклов */
char scanner = HI_WIRE; /* инициализируем сканнер */
char key = 0xFF; /* начальное значение для возвращаемого байта */
/* цикл сканирования кнопок */
do
{
KB_DDR &= ~(KB_WIRES); /*
Все линии клавиатуры на ввод */
KB_PORT |= KB_WIRES; /* Подключаем pull-up resistors
*/
KB_DDR |= scanner; /* устанавливаем одну линию на вывод
*/
KB_PORT &= ~scanner; /* устанавливаем на этой линии "0"
*/
num_wires--; /* уменьшаем счетчик циклов и выполняем задержку для уст. состояния порта
*/
key &= (KB_PIN | KB_NO_USE | scanner); /* считываем состояние линий
*/
scanner >>= 1; /* формируем новый скан-код
*/
}
while(num_wires);
/* если была нажата одна кнопка, то в итоге в key получим код со сброшенными двумя битами
номера бит соответствует номерам замкнутых линий */
return key; /* возвращаем key */
}
Материал на страницах этого сайта выложен только для ознакомительных целей. Любая перепечатка и распространение, использование в коммерческих целях материалов сайта только с разрешения и по согласованию с автором. При использовании материалов сайта прямая ссылка и указание авторства обязательна.