Л/Р: Контроль внешних устройств через параллельные порты — работа с клавиатурой
Цель работы: получение практических навыков программирования процедур опроса состояния внешних устройств через параллельные порты микроконтроллера (на примере подключения клавиатуры).
Сохранить файл с именем, например, demo5.asm. В файл поместить следующий исходный текст программы: Code ;----------------------Программа demo5.asm---------------------------- ;-------------------Раздел объявления констант------------------------ KB_Port Equ P1; Переобозначение порта клавиатуры (для удобства) KeyNum Equ 30; Переменная для хранения кода нажатой клавиши LoopNum Equ 31; Переменная для хранения числа внутренних циклов ;-------------------Таблица векторов прерываний----------------------- Org 0000 LJmp Init; ;-------------------------Инициализация ------------------------------- Init: Mov KB_Port,#0Fh; Разрешаем линиям порта клавиатуры работать ;в режиме цифровых входов (особенность ADμC) ;----------------------Основной цикл программы ------------------------ Main_Cycle: LCall AskKey; Вызов процедуры опроса клавиатуры JC Main_Cycle; Если не было нажатия, то на метку, Mov A,KeyNum; иначе загружаем в аккумулятор двоичный код, ACall HexLed; находим в таблице соотв. код для индикатора, Mov DPTR,#8000h; выводим на индикатор номер наж.кл. MovX @DPTR,A; LJmp Main_Cycle; ;----------------- Подпрограмма опроса клавиатуры ---------------------- AskKey: Mov KeyNum,#0; Обнуляем код нажатой клавиши Mov DPTR,#0A000h; Mov А,#06; Movx @DPTR,А; Установка линий столбцов в 1,1,0 соотв. LCall Check; Проверка на нажатие в данной строке JC line1; LJmp AskRet; line1: Mov DPTR,#0A000h; Mov A,#05h Movx @DPTR,A; Установка линий столбцов в 1,0,1 соотв. LCall Check; Проверка на нажатие в данной строке JC line2; LJmp AskRet; line2: Mov DPTR,#0A000h; Mov A,#03; Movx @DPTR,A; Установка линий столбцов в 0,1,1 соотв. LCall Check; Проверка на нажатие в данной строке AskRet: Mov DPTR.#0A000h; Mov A,#07; Movx @DPTR,A; Установка всех линий столбцов в "1" Ret; Сheck: Mov LoopNum,#4; Число строк = 4 Mov A,KB_Port; Считываем текущее состояние строк AnL A,#0FОh; Oбнуляем "лишнюю" тетраду Rotate: Inc KeyNum; Увеличиваем код нажатой клавиши (сканируем) RLC A; Сдвигаем Acc для поиска нуля (нажатой кл.) JNC CheckRet; Если было нажатие, то на метку DJNZ LoopNum,Rotate; Если ряд не закончен, то на метку СheckRet: Ret; ;-Формирование шестнадцатеричного символа 0..F на семисегментном индикаторе ;АСС - входные данные 0..15, и выходные данные '0'..'F' HexLed: Mov DPTR,#DigTbl; Устанавливаем указатель на таблицу символов AnL A,#0Fh; обрабатываем только младшую тетраду Movc A,@A+DPTR; читаем соответствующий символ ret DigTbl: DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h,88h,83h,0C6h,0A1h,86h,8Eh ; 0 1 2 3 4 5 6 7 8 9 A B C D E F End ;------------------------------------------------------------------------- Программа demo5 определяет факт нажатия одной из клавиш 12-кнопочной клавиатуры, организованной в виде матрицы 3 строки × 4 столбца, и заносит код нажатой клавиши в ячейку внутренней памяти микроконтроллера. Первые три строки объявляют константы и переменные для удобства работы с ними. Затем директивой ORG указывается адрес следующей выполняемой команды, в данном случае это вектор прерывания по событию сброса. После сброса указатель на следующую выполняемую команду будет обнулен и программа начнет выполняться с нулевого адреса. По этому адресу располагается команда безусловного перехода в процедуру инициализации, на метку Init. По адресу Init последовательно располагаются команды инициализации порта клавиатуры. Далее идет основной рабочий цикл программы, в котором постоянно осуществляется вызов процедуры опроса (сканирования) клавиатуры на предмет нажатия клавиши, и, в случае нажатия, номер нажатой клавиши выводится на семисегментный индикатор. Процедура HexLed выполняет преобразование двоичного кода номера клавиши (1..12) в битовый образ активных сегментов индикатора (0 = сегмент горит). Для преобразования используется таблица DigTbl. Процедура опроса (сканирования) клавиатуры работает по принципу «скользящего нуля» следующим образом:
© Иркутский государственный университет путей сообщения, отчёт студента Добавил: COBA (31.10.2010) | Категория: Не из ВолгГТУ Просмотров: 2705 | Загрузок: 0 | Рейтинг: 0.0/0 | |
Комментарии (0) | |