Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №4

.doc
Скачиваний:
16
Добавлен:
01.05.2014
Размер:
128 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

Государственное образовательное учреждение высшего профессионального образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

КАФЕДРА

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

Иванов Н.М.

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ 4

РАБОТА С ПОРТАМИ

по дисциплине: МИКРОПРОЦЕССОРНЫЕ СИСТЕМЫ

РАБОТУ ВЫПОЛНИЛ

С

4544кф

ТУДЕНТ ГР.

Кураев А.А.

подпись, дата

инициалы, фамилия

Санкт-Петербург

2008

Цель работы: приобретение навыков программирования взаимодействия МК с устройствами ввода (на примере клавиатуры) и устройствами вывода (на примере жидкокристаллического индикатора (ЖКИ)).

Индивидуальное задание:

Iсодержание сообщения, выводимого на ЖКИ

IIпорты, через которые МК связываются с клавиатурой и ЖКИ

I. Строка 1: «Группа номер 4544»

Строка 2: «Номер клавиши=ХХ»

II.

ЖКИ

Клавиатура

Управление

Шина данных

Входы

Выходы

P1(2-0)

P4

P1(7-4)

P5(7-4)

Рис.1. Пример подключения клавиатуры и ЖКИ к микроконтроллеру

Подготовить бегущий 0

Установить начальный адрес КС

Выделить значащие разряды и записать в ячейку КС

Сдвинуть”0”в следующую позицию

Перейти к следующей ячейке КС

ДА

НЕТ

Установить начальный адрес КС

Прочитать очередную ячейку КС

ДА

НЕТ

Перейти к следующей ячейки КС

Определение № строки

dsk:

Определение №столбца

ДА dloop1:

НЕТ

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