Если все клавиши, принадлежащие к одной колонке, отжаты, то на соответствующем входе порта PORTx[4]…PORTx[7] формируется логическая 1. МК использует специальную программу опроса клавиатуры, чтобы обнаружить, какая клавиша в данный момент времени нажата. Эта программа сначала выставляет на линию PORTx[0] логический 0. Тогда все левые выводы клавиш первого ряда оказываются под потенциалом логического 0. Если одну из клавиш этого ряда нажать, то уровень сигнала на одном из входов PORTx[4]…PORTx[7] изменится с 0 на 1. Например, если нажали клавишу «0», то на входе PORTx[4] установится низкий логический уровень, а все остальные входы PORTx[5]…PORTx[7] останутся в 1. Или, если нажать клавишу «2», то в 0 установится вывод PORTx[6], а линии PORTx[4], PORTx[5] и PORTx[7] будут в 1. Таки образом, программа, прочитав состояние линий PORTx[4]…PORTx[7] и обнаружив 0 в каком-либо разряде, сможет установить, какая клавиша нажата.
Программа опроса клавиатуры последовательно анализирует состояние клавиш каждого ряда, последовательно выставляя логический 0 на выводы PORTx[0]…PORTx[3]. На рис. 5.5 приведена таблица, в которой показаны коды, которые будут на линиях порта при нажатии каждой из клавиш. Эти коды должны быть использованы программой опроса для приведения кода нажатой клавиши к одному из стандартных представлений, например к коду ACSII.
Рассмотренная нами клавиатура может иметь иные символы на кнопках, в соответствие с функциональным назначением кнопки в устройстве. Например, подобная клавиатура используется для управления насосом бензоколонки. Тогда клавиши могут задавать тип отпускаемого бензина, форму приема платежа и т.д. Микроконтроллер должен распознать, какая клавиша нажата, и перейти к соответствующей подпрограмме.
Рис. 5.6.
Блок-схема алгоритма опроса матричной клавиатурыНа рис. 5.6 приведена блок-схема алгоритма опроса матричной клавиатуры из 16 клавиш. Этот алгоритм состоит из четырех одинаковых блоков, в которых сначала устанавливается в 0 одна из линий PORTx[0]…PORTx[3], а затем контролируется состояние линий PORTx[4]…PORTx[7]. Если на входах линий PORTx[4]…PORTx[7] логические 1, то ни одна кнопка активизированного ряда не нажата, и следует перейти к опросу следующего ряда. Если на какой-либо из линий PORTx[4]…PORTx[7] обнаружен потенциал логического 0, то по номеру линии и по номеру активизированного ряда программа должна восстановить код нажатой клавиши. Для этого удобно использовать таблицу рис. 5.5. Мы привели лишь общую структуру алгоритма. Детальное ее рассмотрение последует после примера программного кода, и описания ЖК дисплея.
/*-----------------------------------------------------------*/
/* filename: keypad.c */
/* МAIN PROGRAМ: Эта программа производит анализ */
/*состояния матричной клавиатуры из 16 клавиш */
/*Для подключения клавиатуры использован PORTB */
/*Разряды PORTB[0]…PORTB[3] активизируют линии рядов */
/*разряды PORTB[4]…PORTB[7]используются для считывания кодов */
/*колонок */
/*-----------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
#include
#include
/*используемые функции*/
char keypad(unsigned char keypress, unsigned char row);
char which_key(unsigned char keypress); /*Function to select key*/
void main{void) {
unsigned char keypress;
/*задание кодов активизации рядов клавиатуры*/
unsigned char first = 0xFE; /*код активизации первого ряда*/
unsigned char second = 0xFD; /*код активизации второго ряда*/
unsigned char third = 0xFB; /*код активизации третьего ряда*/
unsigned char fourth = 0xF7; /*код активизации четвертого ряда*/
DDRB = 0x0f; /*линии 0…3 на вывод, линии 4…7 на ввод*/
while(1) {
PORTB = 0xFE;
keypress = PORTB;