Главная Не из ВолгГТУ » Файлы » Методички » Не из ВолгГТУ [ Добавить материал ]

Л/Р: Контроль внешних устройств через параллельные порты — работа с клавиатурой

Цель работы: получение практических навыков программирования процедур опроса состояния внешних устройств через параллельные порты микроконтроллера (на примере подключения клавиатуры).

  1. Ознакомиться со схемой платы Lab812 и подключением клавиатуры к выводам микроконтроллера.
  2. Запустить на инструментальном компьютере интегрированную систему программирования «ProView32». Создать новый проект и файл.

Сохранить файл с именем, например, 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)

Имя *:
Email *:
Код *: