
- •;Инициализация таймеров
- •; Подпрограмма формирования временной задержки
- •Порядок выполнения работы
- •Бродин в.Г., Шагурин м.И. Микроконтроллеры: архитектура, программирование, интерфейс. Справочник. – м.: эком, 1999, с. 179-182.
- •Бродин в.Б., Калинин а.В. Системы на микроконтроллерах и бис программируемой логики. – м.: эком, 2002, с. 82-87.
- •Подготовка к работе
- •;Подпрограмма кодирования символа клавиши
- •;Подпрограмма временной задержки
- •Порядок выполнения работы
- •Цель работы
- •Аппаратные и программные средства
- •Векторы системы прерываний
- •Подготовка к работе
- •Порядок выполнения работы
- •Краткое описание лабораторной установки
- •Одноплатный контроллер
- •Плата супервизора
- •Интерфейсная плата
Подготовка к работе
Изучить рекомендованную литературу.
Ознакомиться с принципиальной схемой интерфейсной платы (рис. П.1) и подключением клавиатуры к выводам микроконтроллера.
Создать файл с именем kb_demo.a52 и записать в него следующую программу на языке Ассемблера:
KeyCod equ 20h ;ячейка, в которой хранится код
;нажатой клавиши
NumKey equ 21h ;ячейка, в которой хранится код символа
;нажатой клавиши
ljmp Start
org 30h
Start:
mov tmod, #01h ;инициализация Т/С0: режим 1
MainCycle:
acall ReadKey ;вызов п/п опроса клавиатуры
jnc MainCycle ;клавиша нажата? Нет (CY=0),
;продолжаем опрос
acall DocKey ;да (CY=1), определяем код символа
;нажатой клавиши
ajmp MainCycle ;возврат к п/п опроса клавиатуры
ReadKey:
mov p1, #0ffh
clr C ;очищаем флаг переноса CY – признак
;нажатия клавиши
clr p1.0 ;проверяем, нажата ли одна из клавиш
mov a, p1 ;A1-A4?
cjne a, #0feh, Hit ;да (CY=1), переходим к устранению
;дребезга контактов
setb p1.0 ;нет, восстанавливаем состояние линии ;p1.0
clr p1.1 ;проверяем, нажата ли одна из клавиш
mov a, p1 ;B1-B4?
cjne a, #0fdh, Hit ;да (CY=1), переходим к устранению
;дребезга контактов
setb p1.1 ;нет, восстанавливаем состояние линии ;p1.0
clr p1.2 ;проверяем, нажата ли одна из клавиш
mov a, p1 ;C1-C4?
cjne a, #0fbh, Hit ;да (CY=1), переходим к устранению
;дребезга контактов
sjmp zzz ;выход, если ни одна из клавиш не была ;нажата
Hit: ;повторный ввод кода нажатой клавиши
;для устранения дребезга контактов
clr C
mov b, a
mov th0, #0d8h ;формирование задержки длительностью mov tl0, #0f0h ;10 мс с помощью Т/С0
acall Delay
mov a, p1 ;повторное считывание кода нажатой ;клавиши
mov p1, #0ffh ;восстановление состояния линий p1
cjne a, b, zzz ;коды не совпали, выходим из п/п
mov KeyCod, a ;коды совпали, значит, нажатие истинно:
;заносим код клавиши в ячейку KeyCod
setb C ;и устанавливаем флаг нажатия клавиши CY
zzz:
ret ;возврат
;Подпрограмма кодирования символа клавиши
DocKey:
nop
ret
;Подпрограмма временной задержки
Delay:
setb tr0 ;запуск Т/С0
jnb tf0, $ ;ожидание переполнения
clr tr0 ;выключение Т/С0
clr tf0 ;сброс флага переполнения
ret
end
Программа kb_demo.a52 определяет факт нажатия одной из клавиш 12-кнопочной клавиатуры, организованной в виде матрицы (34), путём опроса строк клавиатуры и заносит код нажатой клавиши в ячейку внутренней памяти микроконтроллера. Подразумевается, что в каждый момент времени может быть нажата только одна клавиша. Ложные срабатывания от дребезга контактов устраняются путём повторного опроса строки через 10 мс.
В начале программы находятся три директивы, первые две из которых определяют имена и адреса ячеек внутренней памяти данных, а третья размещает код программы с адреса 30h, чтобы она не накладывалась на область таблицы переходов системы прерываний.
Первая исполняемая команда программы передает управление на команду по адресу 30h, которая конфигурирует T/C0 для работы в режиме 1. Далее вызывается подпрограмма определения нажатия одной из клавиш клавиатуры ReadKey. Подпрограмма опрашивает матрицу по строкам (см. принципиальную схему интерфейсной платы). Для этого во все разряды порта Р1 заносятся единицы и обнуляется флаг переноса CY. Вначале опрашивается строка А. На линию Р1.0 выставляется значение «0», состояние линий порта Р1 считывается в аккумулятор и прочитанное значение сравнивается с кодом маски – кодом, который имеет место при отсутствии нажатых клавиш в строке A. Если в прочитанном байте разряды 3, 4, 5 или 6 не равны единице, то это свидетельствует о нажатии клавиши в строке A. В этом случае устанавливается флаг переноса CY и происходит переход на метку Hit. В противном случае восстанавливается состояние линии Р1.0 и аналогично опрашиваются строки В и С. Таким образом, признаком нажатия клавиши является установка флага переноса. При отсутствии нажатых клавиш происходит выход из подпрограммы ReadKey и ее повторный вызов посредством перехода на метку MainCycle.
При обнаружении нажатой клавиши фрагмент программы с метки Hit осуществляет повторный опрос текущей строки. Находящийся в аккумуляторе код сохраняется в регистре В, а в аккумулятор повторно считывается состояние порта Р1 (активизирована линия текущей строки). Чтение осуществляется после задержки, длительностью около 10 мс, которая реализуется подпрограммой Delay (эта подпрограмма аналогична рассмотренной в предыдущей работе) с помощью T/C0. После этого линии порта Р1 переводятся в исходное состояние, а содержимое регистров А и В сравнивается, и при совпадении код нажатой клавиши записывается в ячейку KeyCod. Далее следует возврат из подпрограммы ReadKey с установленным флагом нажатия клавиши.
В основной программе при установленном флаге нажатой клавиши вызывается подпрограмма DocKey. В исходной программе kb_demo эта подпрограмма не содержит исполняемых команд и будет определена позже в процессе выполнения работы.