Наиболее распространённое средство ввода данных для микропроцессорных устройств – плёночная или кнопочная клавиатура матричного типа. Для этого типа клавиатур характерно: - разделение выводов на две группы. На одну из них подаются тестовые сигналы, с другой считывается комбинация сигналов, соответствующая нажатой клавише. Эти группы принято называть столбцами и строками клавиатуры и обозначать цифрами и буквами соответственно. Назначение конкретных групп выводов условно, любая из них может выполнять роль столбцов или строк; - кнопки подключены таким образом, что каждая из них при нажатии соединяет один из столбцов с одной из строк клавиатуры. Отсюда их удобное условное обозначение, например 1A – кнопка, расположенная на пересечении столбца 1 и стоки A. Таким образом, количество клавиш клавиатуры равно числу столбцов умноженному на число строк.
Клавиатура на фото, судя по числу выводов, могла бы иметь 16 кнопок, однако имеет 12, видимо один из её выводов не имеет внутренних соединений: Для подключения клавиатуры формата 4x4 достаточно одного порта микроконтроллера. В приведённом примере столбцы клавиатуры подключены к младшей тетраде порта A микроконтроллера AVR - выводы PA0...PA1, которые должны быть настроены на выход (см. рисунок). Старшая тетрада порта - строки матрицы, настраиваются как входы и притягиваются к питанию внутренними pull-up резисторами AVR или внешними номиналом 10 кОм. Для того чтобы избежать конфликта логических уровней при случайном нажатии двух кнопок, принадлежащих разным столбцам матрицы, цепи 1, 2, 3 и 4 небходимо подключить к порту через резисторы номиналом 270 Ом. Обнаружение нажатой кнопки проводится по следующему простому алгоритму: - исходное положение - все столбцы матрицы (PA0...PA3) в состоянии лог. 1; - выбор столбца 1 установкой низкого уровня PA0=0; - считывание старшей тетрады порта (строк клавиатуры) для обнаружения нажатых кнопок столбца 1 (1A, 1B, 1C или 1D). В случае замыкания одной из указанных клавиш нулевой уровень столбца появиться на соответствующей строке матрицы. - возврат в исходное положение - все столбцы в высоком состоянии; - далее происходит аналогичная выборка оставшихся столбцов с последующим чтением строк матрицы. Пример: при нажатии кнопки с адресом 3B, после выборки столбца 3 (PA2=0) на строке B будет считан низкий уровень (PA5=0). Простейшая функция "AskKey" на Си, реализующая этот алгоритм, может выглядеть таким образом: void AskKey (void) {
Key=0; PORTA&=~(1<<0); // Выбрать столбец 1. asm ("nop"); switch (PINA) { case 0b11101110: {Key=1; break;} // Кнопка 1A. case 0b11011110: {Key=2; break;} // Кнопка 1B. case 0b10111110: {Key=3; break;} // Кнопка 1C. case 0b01111110: {Key=4; break;} // Кнопка 1D.} PORTA=0xFF; // Исходное состояние.
PORTA&=~(1<<1); // Выбрать столбец 2. asm ("nop"); switch (PINA) { case 0b11101101: {Key=5; break;} // Кнопка 2A. case 0b11011101: {Key=6; break;} // Кнопка 2B. case 0b10111101: {Key=7; break;} // Кнопка 2C. case 0b01111101: {Key=8; break;} // Кнопка 2D.} PORTA=0xFF; // Исходное состояние.
PORTA&=~(1<<2); // Выбрать столбец 3. asm ("nop"); switch (PINA) { case 0b11101011: {Key= 9; break;} // Кнопка 3A. case 0b11011011: {Key=10; break;} // Кнопка 3B. case 0b10111011: {Key=11; break;} // Кнопка 3C. case 0b01111011: {Key=12; break;} // Кнопка 3D.} PORTA=0xFF; // Исходное состояние.
PORTA&=~(1<<3); // Выбрать столбец 4. asm ("nop"); switch (PINA) { case 0b11100111: {Key=13; break;} // Кнопка 4A. case 0b11010111: {Key=14; break;} // Кнопка 4B. case 0b10110111: {Key=15; break;} // Кнопка 4C. case 0b01110111: {Key=16; break;} // Кнопка 4D.} PORTA=0xFF; // Исходное состояние. } Данная функция присваивает переменной Key номер нажатой кнопки от 1 до 16 или 0, если ни одна из кнопок не нажималась. |