Федеральное агентство по образованию
ГОУ ВПО УГТУ-УПИ
Кафедра «Физические методы и приборы контроля качества»
Отчет по лабораторной работе №2 (часть 2)
Программирование периферийных устройств, доступных через регистры ПЛИС
Преподаватель: Моисейкин Е.В.
Студентка: Козловских Е.С.
гр. Фт-44061
Екатеринбург 2007
Задание 3. Опрос матричной клавиатуры.
Открыть новый проект, набрать подпрограмму GETKEY, составить головную программу для опроса клавиатуры с помощью подпрограммы GETKEY и вывода кода нажатой клавиши на светодиодные индикаторы. Составить таблицу кодов клавиатуры.
При выполнении указанных выше действий была получена следующая программа:
org 02000h
dpp data 84h
KB xdata 00h ; адрес регистра клавиатуры
sv xdata 07h
prog:
call getkey ; опрос клавиатуры с помощью подпрограммы GETKEY
mov r0,#sv ; запись адреса регистра светодиодов в r0
call putbyte ; вывод кода клавиши на линейку светодиодов
jmp prog ; бесконечный цикл из описанных выше действий
getkey:
push psw ; сохраняем psw
mov psw,0h ; выбираем нулевой банк
push 0h ; сохраняем r0
push 1h ; и r1
push b ; а также b
push dpp ; и номер страницы
putbyte:
push dpp ; сохранение номера страницы ВПД
mov dpp,#08d ; выбираем восьмую страницу
movx @r0,A ; записываем байт из аккумулятора по адресу, который хранится в r0
pop dpp ; восстанавливаем номер страницы ВПД
ret ; возврат из подпрограммы
mov dpp,#08h ; переключаемся на восьмую страницу
mov r0,#KB ; адрес регистра клавиатуры – в r0
mov r1,#0 ; счетчик колонок = 0
mov b,#01111111b ; начальное значение – в b
KB_lp:
mov a,b ; записываем начальное значение в a
rl a ; сдвигаем циклически влево чтобы опросить следующую колонку
mov b,a ; сохраняем значение a
movx @r0,a ; вывод значения в регистр клавиатуры
movx a,@r0 ; чтение поля ROW регистра клавиатуры
cpl a ; инверсия полученного значения
anl a,#0f0h ; проверяем старшую тетраду (ROW) на наличие единиц
jnz kb_cod ; если клавиша нажата – переходим к подпрограмме kb_cod
Inc r1 ; иначе увеличиваем счетчик колонок
cjne r1,#4,KB_lp ; если он не равен четырем – продолжаем цикл
mov a,#0ffh ; если клавиша не нажата – возвращаем 0ffh
sjmp kb_end ; завершаем подпрограмму
kb_cod:
mov b,#0
mov c,acc.7
orl c,acc.5
mov b.2,c
mov c,acc.7
orl c,acc.6
mov b.3,c ; сформировали старшие биты кода (2, 3)
mov a,b ; записываем в аккумулятор
add a,r1 ; и добавляем к ним номер колонки – младшие два бита – код готов
kb_end: ; конец подпрограммы – восстанавливаем значения регистров и возвращаемся
pop dpp
pop b
pop 1h
pop 0h
pop psw
ret
end
Вывод: Клавиатура стенда SDK1.1 типа AK1604A-WWB реализована в виде квадратной матрицы 4x4. Столбцы и строки сведены в регистр клавиатуры KB. Путем записи в регистр номера колонки кнопок и считывания номера строки нажатой клавиши можно получить ее координаты. В данной программе реализовано преобразование координат в код клавиши с последующим выводом его на линейку светодиодов.
В ходе выполнения программы по линейке светодиодов была составлена таблица кодов клавиш:
-
Клавиша
Код
1
00h
2
01h
3
02h
A
03h
4
04h
5
05h
6
06h
B
07h
7
08h
8
09h
9
0Ah
C
0Bh
*
0Ch
0
0Dh
#
0Eh
D
0Fh