- •Содержание
- •Список сокращений
- •Введение
- •Структура микроконтроллера
- •Процессор микроконтроллера
- •Адресное пространство микроконтроллера
- •Подключение erom и eram к микроконтроллеру
- •Периферийные устройства микроконтроллера
- •Параллельные порты ввода-вывода
- •Таймер-счетчик т/с0
- •Таймер-счетчик т/с1
- •Последовательный порт
- •Контроллер прерываний
- •Система команд микроконтроллера
- •Общие сведения о языке Ассемблер для микроконтроллеров стандарта mcs-51 и о программном пакете фирмы 2500 a.D.
- •Синтаксис языка Ассемблер
- •Определители основания системы счисления
- •Макроопределения
- •Сообщения о некоторых ошибках ассемблирования
- •Рекомендуемая процедура инициализации микроконтроллера
- •Типичные применения микроконтроллеров
- •Ввод информации с датчиков
- •Опрос двоичного датчика
- •Ожидание события
- •Ожидание импульсного сигнала
- •Устранение дребезга контактов
- •Подсчет числа импульсов
- •Подсчет числа импульсов за интервал времени между двумя событиями
- •Подсчет числа импульсов за заданный промежуток времени
- •Опрос группы двоичных датчиков
- •Ввод информации с матричной клавиатуры
- •Вывод управляющих сигналов из микроконтроллера
- •Формирование статических сигналов
- •Формирование импульсных сигналов
- •Генерация меандра
- •Формирование сигнала с заданной скважностью
- •Вывод и отображение информации
- •Динамический вывод информации на дисплей из семисегментных индикаторов
- •Реализация функций реального времени
- •Программное формирование временной задержки
- •Формирование временной задержки с использованием таймеров
- •Измерение временных интервалов
- •Преобразование кодов
- •Преобразование унитарного кода в двоичный позиционный
- •Преобразование двоичного позиционного кода в унитарный
- •Преобразование кодов из одной системы счисления в другую
- •Преобразование данных из параллельного кода в последовательный и обратно
- •Цифро-аналоговое преобразование
- •Аналого-цифровое преобразование
- •Метод последовательного приближения
- •Метод двойного интегрирования
- •Операции с памятью
- •Тестирование озу
- •Программа тестирования пзу
- •Обмен данными по шине i2с
- •Общие положения и введение в логику работы шины i2с
- •Пример обмена данными по шине i2c
- •Приём данных по протоколу Centronics
- •Литература
Ввод информации с матричной клавиатуры
Во многих применениях МК работают автономно по заранее заданной программе без вмешательства человека. Наряду с этим существуют микроконтроллерные системы, включающие в контур управления человека-оператора. Типичным средством ввода информации в этом случае является клавиатура.
Наиболее широкое распространение получили матричные клавиатуры. Клавиатуры, построенные данным способом, представляют матрицу двоичных переключателей требуемой размерности (рисунок 4.10).
Линии порта P1 используются для выбора одной из строк клавиатуры, а линии порта P2 – для опроса состояний клавиш этой строки. Каждая клавиша в такой матрице имеет свой номер, соответствующий ее местоположению. Диоды, включенные в данную схему, обеспечивают защиту от замыкания между собой строк в случае одновременного нажатия более чем одной клавиши в разных строках и тем самым снижают нагрузку на активный выход порта Р1.
Рисунок 4.10 – Схема построения матричной клавиатуры
Обслуживание матричной клавиатуры состоит из последовательности процедур:
– сканирования матрицы клавиш;
– устранения дребезга контактов при нажатии клавиши (для некоторого типа клавиатур может отсутствовать);
– ожидания отпускания клавиши;
– устранения дребезга контактов при отпускании клавиши (для некоторого типа клавиатур может отсутствовать);
– идентификации кода нажатой клавиши.
Программа обслуживания клавиатуры может быть реализована следующим образом (листинг 4.15):
Листинг 4.15 – Программа обслуживания клавиатуры
; Назначение регистров в программе: |
|||
; R0 – счетчик линий (хранит код, посылаемый в линии стробирования) |
|||
; R1 – код предыдущего нажатия |
|||
; R2 – счетчик повторений ; Программа не отслеживает нажатие нескольких клавиш ; одновременно в разных строках матрицы. |
|||
|
.ORG 0000H |
; Адрес основной программы |
|
|
JMP BEGIN |
; Переход к основной программе |
|
|
.ORG 000BH |
; Адрес обработчика прерываний ; от таймера T0 |
|
|
JMP TIMER0 |
; Переход к процедуре ; обработчика прерываний |
|
; Начало основной программы |
|||
BEGIN: |
|
|
|
|
MOV IE, #00H |
; Запрет всех прерываний |
|
|
MOV TMOD, #02H |
; Настройка таймера в режим ; перезагрузки |
|
|
MOV TL0, #FFH |
; Инициализация |
|
|
MOV TH0, #FFH |
; таймера |
|
|
MOV R0, #11111110B |
; Иницализация счетчика линий |
|
|
MOV P1, R0 |
; Активация строки |
|
|
MOV P2, #FFH |
; Настройка порта P2 на ввод |
|
|
MOV IE, #82H |
; Разрешение прерываний от ; таймера |
|
|
SETB TR0 |
; Разрешение счета таймера |
|
; Цикл ожидания нажатия |
|||
WAIT: |
|
|
|
|
CJNE A, #FFH, OK |
; Если клавиша нажата ; (А!=FFh), |
|
|
|
; то переход к обработке ; нажатия, |
|
|
|
; иначе переход к ожиданию |
|
|
JMP WAIT |
|
|
; Обработчик нажатия |
|||
; О том, какая комбинация нажата, судится по R0 и A ; соответственно |
|||
OK: |
|
|
|
|
MOV A, #FFH |
|
|
|
JMP WAIT |
|
|
; Обработка прерываний от таймера |
|||
TIMER0: |
|
|
|
|
MOV A, P2 |
; Чтение кода из порта P2 |
|
|
ANL A, #0FH |
; Выделение значащих бит 0–3 |
|
|
CJNE A, #0FH, PRESSED ; Если клавиша нажата |
||
|
|
; (A!=0Fh), |
|
|
|
; то перейти на метку PRESSED |
|
|
|
; иначе осуществляем сдвиг ; сканирующего нуля |
|
|
MOV A, R0 |
; Сдвиг нуля в счетчике |
|
|
RL A |
;линий на одну |
|
|
MOV R0, A |
; позицию |
|
|
CJNE A, #F7H, NO_INIT ; Проверка предельного |
||
|
|
; положения нуля |
|
|
MOV R0, #FEH |
|
|
NO_INIT: |
|
|
|
|
MOV A, #FFH |
; Клавиша не нажата |
|
|
RETI |
; Возврат в основную программу |
|
; Обработка нажатия клавиши |
|||
PRESSED: |
|
|
|
|
MOV R1, A; |
; Помещаем в R1 код предыдущего ; нажатия |
|
; Исключение дребезга |
|||
; Если в течение цикла проверки дребезга зафиксирован |
|||
; одинаковый код, то он считается истинным |
|||
|
MOV R2, #20 |
; Инициализация счетчика ; повторений |
|
BNC_DWN: |
|
|
|
|
MOV A, P2 |
; Чтение кода из порта P2 |
|
|
ANL A, #0FH |
; Выделение значащих бит 0–3 |
|
|
CJNE A, 01, FLS_STRT ; Если считан другой код |
||
|
|
;(A!=R1), |
|
|
|
; то выходим из обработки ; нажатия |
|
|
DJNZ R2, BNC_DWN ; Реализация цикла проверки |
||
|
|
; дребезга |
|
|
PUSH A |
; Помещение в стек считанного ; кода |
|
; Ожидание отпускания клавиш с исключением дребезга |
|||
; Если в течение цикла ни одна клавиша не нажата, |
|||
; то предположение, что все клавиши отпущены, истинно |
|||
BNC_UP_ERR: |
|
|
|
|
MOV R2, #20 |
; Инициализация счетчика ; повторений |
|
BNC_UP: |
|
|
|
|
MOV A, P2 |
; Чтение кода из порта P2 |
|
|
ANL A, #0FH |
; Выделение значащих бит 0–3 |
|
|
CJNE A, #0FH, BNC_UP_ERR ; Если клавиша нажата |
||
|
|
; (A!=0Fh), |
|
|
|
; то снова инициализируем ; счетчик, |
|
|
|
; иначе исключаем дребезг |
|
|
DJNZ R2, BNC_UP ; Реализация цикла проверки |
||
|
|
; дребезга |
|
|
POP A |
; Извлечение из стека ; считанного кода |
|
|
RETI |
; Выход из прерывания ; (в А хранится считанный код) |
|
; Выход из обработки нажатия, клавиша не нажата |
|||
FLS_STRT: |
|
|
|
|
MOV A, #FFH |
|
|
|
RETI |
|
Контрольные вопросы
Как настроить порт на ввод данных? Отдельный разряд порта.
Что подразумевается под событием для микроконтроллера?
Почему при регистрации импульса целесообразно использовать разряды 2 и 3 порта P3?
Каким образом можно организовать счет импульсов за интервал времени между двумя событиями?
Как организуется счет времени?
Чем отличается реальная кнопка от идеальной? Каким образом возможно подавление дребезга? Какой из этих способов предпочтительнее?
Как организуется регистрация коротких импульсов?
Каков алгоритм обработки матричной клавиатуры? Необходима ли при этом обработка дребезга?