Читайте также:
|
|
Во многих применениях микроконтроллер работает автономно по заданной программе. Однако в интерактивных системах осуществляется ввод значений некоторых параметров (пределов регулирования, граничных значений и др.) с контролем ввода, а также вывод значений параметров системы. В качестве устройств ввода-вывода применяются цифровые и символьно-знаковые клавиатуры.
В микропроцессорных системах используются клавиатуры некодирующего матричного типа, которые представляют собой матрицу контактов, включенных на пересечении строк и колонок. Идентификация нажатой клавиши и формирование соответствующего ей двоичного кода выполняется программно. В составе клавиатуры могут быть цифровые и функциональные клавиши. Цифровые клавиши предназначены для ввода численных значений параметров для программы, а функциональные - для выбора режимов. Обычно численные значения вводятся в десятичной и системе, поэтому клавиатура содержит клавиши с символами 0,1,2,...,9. Символика остальных клавиш отображает их функции, например '└−┘'- пробел, 'СТ' - старт, 't’- время и т.д. Очевидно, что любой функциональной клавише также как и цифровой соответствует двоичный код, определяемый её положением в матрице. На рисунке 66 представлена схема клавиатуры формата 4х4.
Выходы 0,1,2,3 дешифратора DD2 используются для выбора строк, а разряды РА.4…РА.7 микроконтроллера - для опроса матрицы клавиш. Разряды опроса микроконтроллера настраиваются на ввод. Обработчиком клавиатуры в разряды РС.0-РС.1 (РС.6 должен быть равен нулю) микроконтроллера загружаются последовательно двоичные коды сканирования (с помощью оператора for), поступающие на входы дешифратора. Сигналы на выходах дешифратора имеют вид «бегущего» нуля. После выдачи каждого кода сканирования производится анализ состояния линий опроса (возврата) РА.4…РА.7.
Рисунок 66
Значение исходного кода, загружаемого в разряды РС.0 и РС.1 равно 00, т.е. код выбора нулевой строки матрицы. Состояния выходов дешифратора имеют логические значения 0111. Если в нулевой строке не нажата ни одна кнопка (разомкнуты все контакты), то на разряды РINА.4-РINА.7 подается напряжение высокого уровня, которое поступает от источника +5В через резисторы R1-R4. Затем в разряды РС.0 и РС.1 необходимо подать код выбора первой строки. При состоянии РINА.0 - РINА.7 равном хххх1111, подать код выбора второй строки и т.д..
Если нажата какая-либо кнопка в строке, то на одном из разрядов РА.4 -РА.7 будет напряжение логического нуля и для определения кода нажатой клавиши необходимо произвести последовательный опрос состояния разрядов РА.4 -РА.7. Например, при замкнутых контактах S1 напряжение низкого уровня с нулевого выхода дешифратора через диод VD1 и замкнутый контакт поступает на линию опроса РА.4. Если замкнут контакт S2, то нулевой уровень напряжения будет в разряде РА.5 и т.д..
Ниже приведен текст программы обработки клавиатуры по схеме рис. 66. При нажатии кнопки формируется импульсный звуковой сигнал с помощью таймера/счетчика Т0. Каждой кнопке соответствует определенная частота импульсов.
#include <mega16.h>
#include <delay.h>
unsigned char cod_key;
unsigned char i;
void key (void) //Обработчик клавиатуры
{
unsigned char cod_col = 0,j = 0;
cod_col = (~ PINA) >> 4; /*В переменную помещается инверсия PINA и сдвиг
на 4 разряда вправо. Значения cod_col при нажатой кнопке для
для колонок
колонка 1 - cod_col = 00000001 =1
колонка 2 - cod_col = 00000010 = 2
колонка 3 - cod_col = 00000100 = 4
колонка 4 - cod_col = 00001000 = 8.
При ненажатой кнопке cod_col = 0.
*/
if (cod_col!= 0) //Если нажата кнопка, то будем определять код клавиши
{
while((cod_col = (cod_col / 2)!= 0) //Выполнять цикл, пока выполн.условие.
{j + +;} //В цикле добавлять единицу
cod_key = j + 4 * i; /*Вычислить код клавиши, например, для
кнопки 9 – вторая строка (i = 2) и первая колонка (j =1),
cod_key = 1 + 4 * 2 = 9.*/
OCR0 = cod_key * 2; // Значение для периода звук. импульсов
TCCR0 = 0b00011101; //Включить звук
delay_ms (200); // Длительность звукового сигнала
TCCR0 = 0; // Выключить звук
}
}
//-------Главная функция---------------------------
void main(void)
{
DDRC = 0xc3;
DDRB.3 = 1;
while (1) // Непрерывный опрос кнопок
{
for (i = 0; i < 4; i + +) // Цикл выбора строк
{
PORTC = i; // Код выбора строки в порт.
key (); // Вызвать обработчик клавиатуры.
}
delay_ms (1); // Время между опросами
}
}
Операторами while(cod_col = (cod_col / 2)!= 0) и { j + +;} производится преобразование десятичного позиционного кода, который содержится в переменной cod_col, в двоичный код, методом деления на основание двоичной системы (на 2).
while(cod_col = (cod_col / 2)!= 0) //Выполнять j + +, пока результат деления
// не равен нулю.
{j + +;}
Для случая cod_col = 00001000, т.е. нажата клавиша в третьей колонке, то:
1-е деление 8: 2 = 4 (не ноль) и j + 1 = 1; (нач. значение j равно нулю)
2-е деление 4: 2 = 2 (не ноль) и j + 1 = 2;
3-е деление 2: 2 = 1 (не ноль) и j + 1 = 3;
4-е деление 1: 2 = 0 цикл не выполняется и j =3 – номер третьей колонки.
Дата добавления: 2015-07-20; просмотров: 60 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Измерение временных параметров импульсов | | | ROUND и TRUNC |