Лабораторная работа №4
.docФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшего профессионального образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
КАФЕДРА
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
-
Иванов Н.М.
должность, уч. степень, звание
подпись, дата
инициалы, фамилия
|
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ 4 |
|
|||||||
---|---|---|---|---|---|---|---|---|---|
|
РАБОТА С ПОРТАМИ
|
|
|||||||
|
по дисциплине: МИКРОПРОЦЕССОРНЫЕ СИСТЕМЫ |
|
|||||||
|
|
||||||||
|
|
|
|||||||
|
|
|
|
|
|
||||
|
|
|
РАБОТУ ВЫПОЛНИЛ
С
4544кф |
|
|
|
|
Кураев А.А. |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург
2008
Цель работы: приобретение навыков программирования взаимодействия МК с устройствами ввода (на примере клавиатуры) и устройствами вывода (на примере жидкокристаллического индикатора (ЖКИ)).
Индивидуальное задание:
I – содержание сообщения, выводимого на ЖКИ
II – порты, через которые МК связываются с клавиатурой и ЖКИ
I. Строка 1: «Группа номер 4544»
Строка 2: «Номер клавиши=ХХ»
II.
ЖКИ |
Клавиатура |
||
Управление |
Шина данных |
Входы |
Выходы |
P1(2-0) |
P4 |
P1(7-4) |
P5(7-4) |
Рис.1. Пример подключения клавиатуры и ЖКИ к микроконтроллеру
Подготовить ”бегущий
0”
Установить начальный адрес КС
Выделить значащие разряды и записать
в ячейку КС
Сдвинуть”0”в следующую позицию
Перейти к следующей ячейке КС
ДА
НЕТ
Установить начальный адрес КС
Прочитать очередную ячейку КС
ДА
НЕТ
Перейти к следующей ячейки КС
Определение № строки
Определение №столбца
НЕТ
row_n
= 4
col_n
= 4
Рис.2. схема алгоритма программы
опроса клавиатуры
Определение № нажатой клавиши
инициализировать
ЖКИ
настроить адрес
1-ой строки ЖКИ
считать очередной
код из памяти МК и выдать на ЖКИ
ДА
НЕТ
настроить адрес
2-ой строки ЖКИ
считать очередной
код из памяти МК и выдать на ЖКИ
ДА
НЕТ
Рис.3. схема алгоритма и текст программы,
осуществляющей вывод заголовков на ЖКИ
а:=row_n
определение Н.А.,
с которого выводится № строки
опрос клавиатуры
Вывод заголовков
b:=col_n
Рис.4. Схема алгоритма для программы, управляющей взаимодействием МК
с клавиатурой и ЖКИ
Программа опроса клавиатуры
row_n: equ 41h
col_n: equ 42h
N: equ 40h ; номер нажатой клавиши
map_start: equ 30h ; начало области хранения КС клавиатуры
klav: push psw ; сохранение используемых
push a ; ресурсов МК в стеке
push 0
push 1
; формирование КС и запись в память МК
; установка “0” в начальные позиции
mov a,#7Fh ; подготовка “бегущего нуля”
mov r0,#map_start ; адрес начала карты состояния клавиатуры
opros: mov 90h,a ; выдача байта вида “бегущий ноль” в порт 4
setb p5.7 ; настройка на
setb p5.6 ;
setb p5.5 ;
setb p5.4 ;
mov b,p5 ; чтение состояния клавиши очередной
; строки клав-ры
anl b,#F0h ; маска, выделение значащих разрядов
mov @r0,b
setb c
rrc a ; подготовка нового опроса сдвиг “0” в
; следующую позицию
inc r0 ; в очередную позицию карты, перейти к
; следующей ячейке КС
cjne a,#11110111b,opros ; дешифрация карты
mov r0,#map_start,
dc: mov a,@r0
cjne a,#F0h,dsk ; нажата клавиша?
inc r0 ; нет просмотр карты далее
cjne r0,#(map_start+4),dc
mov row_n,#4 ; если клавиша не нажата, row_n=4, col_n=4
mov col_n,#4 ; если клавиша нажата, row_n=0..4, col_n=0..4
sjmp end1
dsk: mov a,r0 ; клавиша нажата, R0 содержит адрес ячейки
clr c
subb a,#map_start
mov row_n,a
mov a,@r0 ; содержимое ячейки КС для определения №
; колонки
mov col_n,#0
dloop1: rrc a
jnc end1
inc col_n
mov r1,col_n
cjne r1,#4,dloop1
end1: lcall get_num
pop 1
pop 0
pop a
pop psw
ret
get_num: push a
mov a,row_n
cjne a,#4,gn_end
mov N,#0
pop a
ret
gn_end: clr c
rlc a ; умножить row_n на два
add a,col_n
inc a
mov N,a
pop a
ret
Программа вывода заголовков на ЖКИ
indic: ; инициализация ЖКИ
indic_init: mov switch,#0 ; переключить на команду
mov byte,#38h ; определить передаваемый байт (команда –
; данных)
lcall indic_wr
mov byte,#0ch
lcall indic_wr
mov byte,#06h ; режим автоматического перемещения курсора
; слева направо после вывода каждого символа
lcall indic_wr
mov byte,#80h ; установка адреса первого символа
lcall indic_wr ; первой строки
mov switch,#1 ; переключить на данные (RS=1)
mov dptr,#0FFD0h
indic_data_wr1: movx a,@dptr ; вывод символов первой строки
ind_row1: mov byte,a ; передаваемый байт - в буфер
lcall indic_wr
inc dptr
mov a,dpl
cjne a,#0E4h,indic_data_wr1
mov switch,#0 ; RS=0-команда
mov byte,#0C0h ; установка адреса первого символа
lcall indic_wr ; второй строки
mov switch,#1 ; RS=1 - данные
indic_data_wr2: movx a,@dptr ; вывод символов второй строки
ind_row2: mov byte,a
lcall indic_wr
inc dptr
mov a,dpl
cjne a,#0F8h,indic_data_wr2 ;E4h+14h=F8h – адрес конца второй строки
indic_exit: ret
indic_wr: mov 0e8h,byte ; передаваемый байт в Р4, процедура записи в
; ЖКИ
setb p1.2 ; E:=1
clr p1.1 ; RW:=0(запись)
mov a,switch
mov c,acc.0
mov p1.0,c ; RS:=0 (команда - данные)
lcall indic_delay
clr p1.2 ; E:=0
lcall indic_delay
setb p1.2 ; E:=1 (установка DB0…DB7 в состояние HI)
indic_delay: nop ; процедура программной задержки
nop
nop
nop
nop
nop
nop
nop
ret
org 0FFD0h
data: db “Gruppa nomer 4544” ; пример организации выводимых данных
db “Nomer klavishi=XX”
Текст программы, управляющей взаимодействием МК с клавиатурой и ЖКИ
org 8300h
main: lcall indic
loop: lcall opros
mov switch,#0 ; переключить на команду
mov byte,#8Ah ; определить позицию вывода первого символа
lcall indic_wr
mov a,n ; № нажатой клавиши
mov b,#10
div ab
add a,#30
mov switch,#1 ; переключить на данные
mov byte,a
lcall indic_wr
add b,#30
mov byte,b
lcall indic_wr
sjmp loop
ret
include ASMS\...\klava.asm
include ASMS\...\lcd.asm