Программирование микропроцессорных систем в интегрированной среде программирования keil-c: Методические указания к лабораторным работам, страница 18

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

Для того, чтобы можно было различать нажатие кнопок в разных столбцах, в каждый момент времени к корпусу должен быть подключен только один столбец кнопок. Временная диаграмма напряжений на выводах порта вывода при постоянном опросе состояния кнопок приведена на рисунке 6.

3.3. Опрос состояния кнопок на языке программирования C

Для того, чтобы не было неоднозначности при определении номера нажатой кнопки, выдадим на выходной порт процессора код опроса клавиатуры. Этот код опроса должен содержать на выходе только один логический ноль. Для записи кода в выходной порт как и в предыдущей лабораторной работе можно воспользоваться оператором присваивания. Например:

Port2 = ~1;

В этом примере в порт записывается константа 111111102, которая формируется оператором инвертирования ‘~’ из константы 000000012. После записи этой константы на всех выводах порта кроме нулевого вывода появляется единичный потенциал. На нулевом выводе этого порта появляется низкий потенциал, который может поступать на входные линии параллельного порта при замыкании контактов кнопок клавиатуры. По считанному с входного порта клавиатуры коду можно будет определить состояние кнопок, подключенных к нулевому выводу порта вывода клавиатуры.

Точно так же можно подать нулевой потенциал на первый вывод выходного порта клавиатуры, что позволит определить состояние кнопок, подключенных к первому выводу порта вывода клавиатуры:

Port2 = ~2;

Коды, которые выдаются в выходной порт клавиатуры называется кодами опроса клавиатуры.

Временная диаграмма напряжений при опросе кнопок на выходах порта клавиатуры приведена на рисунке 6.

Рисунок 6. Временные диаграммы напряжения на выводах порта вывода.

После подачи сигнала опроса клавиатуры можно осуществлять считывание логических уровней на выводах порта ввода. Это можно осуществить операцией сравнения:

   if(Port2 ==~0x11)     //Если нажата кнопка на пересечении нулевой колонки и нулевой строки

       SvDiod=1;              //то зажечь нулево й светодиод

Для понимания этой команды необходимо, чтобы перед глазами кроме исходного текста программы находилась принципиальная схема устройства. Схема приведена на рисунке 5. Из этой схемы видно, что если ни одна из кнопок не будет нажата, то код 111111102, записанный в порт клавиатуры не изменится и при считывании этого порта мы получим этот же код.

Если же будет нажата кнопка на пересечении нулевой колонки и нулевого ряда клавиатуры, то нулевой потенциал с выхода порта вывода через замкнутые контакты этой кнопки поступит на нулевой ряд порта ввода. То есть считанный код примет значение 111011102.

При нажатии кнопки на пересечении нулевой колонки и второго ряда клавиатуры через порт ввода будет считан код 101111102.

Коды, которые считываются из входного порта клавиатуры называются кодами сканирования клавиатуры или скан-код клавиатуры.

Для анализа состояния кнопок клавиатуры можно воспользоваться кодом, считываемым с входного порта клавиатуры. Однако намного лучше сначала скопировать содержимое порта ввода во внутреннюю переменную, а только потом анализировать её содержимое. Это позволяет обеспечить одновременность считывания всех выводов порта (или портов) и тем самым избежать неоднозначности работы микроконтроллера при, казалось бы, одинаковых внешних условиях.

3.4. Описание примера программы сканирования клавиатуры

Листинг примера программы, позволяющей определять состояние кнопок клавиатуры, приведён в приложении к методическим указаниям.