Подключение клавиатуры 6 линий – 15 кнопок к микроконтроллеру

     В этой статье описан вариант подключения 15-и кнопочной клавиатуры к 6-и линиям микроконтроллера AVR. Способ не нов, по этому в излишних комментариях не нуждается. Схема подключения клавиатуры к МК представлена на рисунке ниже. Если для кого-то схема с первого раза покажется не логичной, то нарисуйте на листе бумаги 6 точек (в виде шестиугольника) и каждые две точки соедините между собой линией. В итоге получите ровно 15 линий. Теперь в разрыв каждой линии вставьте кнопку. Получится клавиатура на 15 кнопок с шестью линиями ввода-вывода (точками).

Keyboard 6 lines - 15 keys

    Данным методом можно спроектировать клавиатуру на сколь угодное количество кнопок. Количество линий и количество подключенных к ним  кнопок определяется соотношением:

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 */
}

Вот такой вот неказистый код...
     

Материал на страницах этого сайта выложен только для ознакомительных целей. Любая перепечатка и распространение, использование в коммерческих целях материалов сайта только с разрешения и по согласованию с автором. При использовании материалов сайта прямая ссылка и указание авторства обязательна.