Одним из широко распространенных в системах управления и контроля устройств, предназначенных для ввода информации в МК, является матричная клавиатура. В стенде используется пленочная клавиатура с организацией в виде матрицы 4 × 3. Схема подключения клавиатуры к МК показана на рис. 3.20.
Рис. 3.20. Схема подключения клавиатуры к МК |
Один вывод каждой клавиши соединяется с вертикальной линией сканирования, а второй вывод – с горизонтальной линией возврата. Обнаружение нажатой клавиши и ее последующая идентификация основаны на использовании процедуры сканирования, которая сводится к поочередной установке каждой из линий сканирования в состояние логической единицы (при одновременном обнулении остальных) и опросу состояния линий возврата.
В соответствии с этим в разряды PD0, PD1 и PD2 порта PORTD, настроенные на выход (линии сканирования), циклически выдаются коды сканирования, содержащие логическую 1 только в одном разряде и логические 0 в остальных.
В разряды PA0…PA3 порта PORTA, настроенные на вход без внутренних подтягивающих резисторов (линии возврата), после каждого изменения кода сканирования считывается состояние линий строк клавиатуры.
Если клавиши не нажаты, то при любом состоянии линий сканирования со всех разрядов линий возврата считываются логические 0, заданные внешними подтягивающими резисторами R5…R7. При нажатии любой клавиши линия сканирования замыкается с линией возврата и, когда в линию сканирования с нажатой клавишей поступит логическая 1, то в соответствующей линии возврата тоже считается логическая 1.
Зная номер линии сканирования с заданной логической 1 (столбец), и номер линии возврата (строка), где появилась логическая 1, мы можем легко определить нажатую клавишу.
Есть, однако, одна особенность, которую необходимо учитывать при разработке программы. Во время работы МК с датчиками, имеющими механические контакты (кнопки, клавиши, клавиатуры и т. д.), возникает явление, называемое дребезгом. Оно заключается в том, что в момент соприкосновения или разъединения контактов сопротивление между ними хаотически меняется в течение некоторого времени, зависящего от материала, конфигурации и состояния контактов, воздействующей на контакты силы и ряда других факторов. Во время дребезга сигнал с контакта может быть прочитан как случайная последовательность нулей и единиц. Подавить это нежелательное явление можно аппаратными средствами, но чаще это делается программным путем.
Наиболее простым способом подавления эффекта дребезга контактов является введение временнóй задержки. Он основан на том, что программа, обнаружив первое замыкание контакта, запрещает опрос состояния этого контакта на время, заведомо большее длительности времени дребезга. Время задержки лежит в пределах 10…30 мс и подбирается экспериментально для каждого типа контактов. Повторный опрос состояния клавиши после задержки дает истинное значение этого состояния.
Окончательно алгоритм опроса состояния клавиатуры необходимо представить в виде отдельной функции. В начале этой функции разряды PD0, PD1 и PD2 порта PORTD настраиваются на выход, а разряды PA0…PA3 порта PORTA – на вход без подключения внутренних подтягивающих резисторов. Затем в ней реализуется бесконечный цикл, в котором выполняется следующая последовательность действий:
1) задать цикл формирования и записи в разряды PD0, PD1 и PD2 порта PORTD кодов сканирования с «бегающей» единицей;
2) после записи каждого кода сканирования считать и проверить состояние разрядов PA0…PA3 порта PORTA;
3) если во всех разрядах считано состояние логического 0, то закончить очередной цикл сканирования и перейти к п. 7;
4) если хотя бы в одном разряде считано состояние логической 1, то ввести паузу для подавления дребезга;
5) произвести повторное считывание разрядов PA0…PA3 порта PORTA, дающее истинное состояние нажатой клавиши;
6) по номерам столбца и строки, содержащих логическую 1, определить, какая клавиша была нажата и код нажатой клавиши вывести по команде возврата из функции;
7) конец цикла задания кода сканирования.
Варианты заданий
В данной работе используются навыки по программированию вывода информации на ЖКИ индикатор, полученные при выполнении предыдущей лабораторной работы. Во всех вариантах ввод исходных данных и вывод результата индицируются на ЖКИ индикаторе.
1. Разработать калькулятор, выполняющий операцию сложения двух целых десятичных чисел. С клавиатуры вводятся слагаемые, операция сложения реализуется нажатием клавиши *, а результат выводится после нажатия клавиши #.
2. Разработать калькулятор, выполняющий операцию поразрядного логического И над двумя десятичными числами. С клавиатуры вводится первое число, затем после нажатия клавиши * – второе число, а результат выводится после нажатия клавиши #.
3. Разработать калькулятор, выполняющий операцию вычитания двух целых десятичных чисел. С клавиатуры вводятся числа, операция вычитания реализуется нажатием клавиши *, а результат выводится после нажатия клавиши #.
4. Разработать калькулятор, выполняющий операцию поразрядного логического ИЛИ над двумя десятичными числами. С клавиатуры вводится первое число, затем после нажатия клавиши * – второе число, а результат выводится после нажатия клавиши #.
5. Разработать калькулятор, выполняющий операцию умножения двух целых десятичных чисел. С клавиатуры вводится числа, операция умножения реализуется нажатием клавиши *, а результат выводится после нажатия клавиши #.
6. Разработать калькулятор, выполняющий поразрядную операцию ИСКЛЮЧАЮЩЕЕ ИЛИ над двумя десятичными числами. С клавиатуры вводится первое число, затем после нажатия клавиши * – второе число, а результат выводится после нажатия клавиши #.
7. Разработать калькулятор, выполняющий операцию целочисленного деления двух целых десятичных чисел. С клавиатуры вводятся числа, операция деления реализуется нажатием клавиши *, а результат выводится после нажатия клавиши #.
8. Разработать калькулятор, выполняющий операцию сдвига влево целого десятичного числа. С клавиатуры вводится число, после нажатия клавиши * – число разрядов, на которое производится сдвиг, а результат выводится после нажатия клавиши #.
9. Разработать калькулятор, выполняющий операцию возведения в степень целого десятичного числа. С клавиатуры вводится число, после нажатия клавиши * – показатель степени, а результат выводится после нажатия клавиши #.
10. Разработать калькулятор, выполняющий операцию сдвига вправо целого десятичного числа. С клавиатуры вводится число, после нажатия клавиши * – число разрядов, на которое производится сдвиг, а результат выводится после нажатия клавиши #.
11. Разработать калькулятор, выполняющий операцию остатка от целочисленного деления двух целых десятичных чисел. С клавиатуры вводятся числа, операция вычисления остатка реализуется нажатием клавиши *, а результат выводится после нажатия клавиши #.
12. Разработать калькулятор, выполняющий операцию поразрядной инверсии целых десятичных чисел. С клавиатуры вводятся число, операция инверсии реализуется нажатием клавиши #.