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

МИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РФ

ПЕРМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСТИТЕТ

Кафедра АТ

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

«Подключение внешних устройств через параллельные порты – работа с клавиатурой»

Выполнили: ст. гр. ЭВТ-04

Проверил: Кузнецов И.И.

Пермь

2007

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

Задание 1

;*******Программа опр-я ном. нажатой клав.***

.EQU Stack=$70

.ORG $0

rjmp Start

.ORG $30

Start: ;Иниц. стека

ldi R16,high(Stack)

out SPH,R16

ldi R16,low(Stack)

out SPL,R16

ldi R16,$8F ;PD0-3,7 выходы,PD4-6 входы

out $11,R16 ;DDRD

MainCycle:

rcall ReadKey

brcc MainCycle ;если флаг C установлен, определяем номер клавиши

rcall DocKey

rjmp MainCycle

;******Процед. опр-я кода клав*****

ReadKey:

ldi R16,$0F ;0000 1111 на порт D

out $12,R16 ;PORTD

cbi $12,0 ;0 в PORTD.0 - строку A (A1-A3)

nop

nop

nop

in R17,$10 ;PIND чтение сост-й линий порта D

andi R17,0b01111111

cpi R17,0b01111110 ;Сравн-е входов с шаблоном ненажатых клавиш

brne Hit ;Неравно - была нажата клавиша, повторный опрос

sbi $12,0 ;Равно, Восстанавл. сост-е линии PORTD.0

cbi $12,1 ;0 в строку B(B1-B3)

nop

nop

in R17,PIND ;чтение сост-я линий порта D

andi R17,0b01111111 ;выделение входов

cpi R17,0b01111101 ;ср-е вх. с шабл. нажат. клав.

brne Hit ;не равно - была нажата клав., повт. опрос

sbi $12,1 ;равно, восст. сост-е линии PORTD.1

cbi $12,2 ;0 - в строку C (С1-С3)

nop

nop

in R17,PIND ;PIND чтение сост-й линий порта D

andi R17,0b01111111 ;выделение входов

cpi R17,0b01111011 ;Сравн-е входов с шаблоном ненажатых клавиш

brne Hit ;Неравно - была нажата клавиша, повторный опрос

sbi $12,2 ;Равно, Восстанавл. сост-е линии PORTD.2

cbi $12,3 ;0 - в строку D (D1-D3)

nop

nop

in R17,PIND ;PIND чтение сост-й линий порта D

andi R17,0b01111111

cpi R17,0b01110111 ;Сравн-е входов с шаблоном ненажатых клавиш

brne Hit ;Неравно - была нажата клавиша, повторный опрос

sbi $12,3 ;Равно, Восстанавл. сост-е линии PORTD.3

clc

rjmp zzz ;выход, если ничего не нажато

Hit: ;Повт чтение для устр-я дребезга (через 0.1 сек)

clc ;сброс флага переноса

mov R18,R17 ;сохр. код клав. в R18

rcall Delay ;задержка 64 мсек

in R17,PIND ;чтение сост-я линий порта D

andi R17,0b01111111 ;выдел-е входов

ldi R16,$0F ;восст-е 0000 1111 на порте D

out $12,R16

cp R18,R17 ;если совпало, значит нажатие истинно

brne zzz

mov R19,R17 ;заносим код клавиши в R19

sec ;и уст. фла нажатия клавиши

zzz:

ret

;****Проц. опр-я номера клавиши*****

DocKey:

cpi R19,0b01101110

brne Kcod2

ldi R20,$00 ;номер клав. A1

rjmp Kcodend

Kcod2:

cpi R19,0b01101101

brne Kcod3

ldi R20,$01 ;номер клав. B1

rjmp Kcodend

Kcod3:

cpi R19,0b01101011

brne Kcod4

ldi R20,$02 ;номер клав. C1

rjmp Kcodend

Kcod4:

cpi R19,0b01100111

brne Kcod5

ldi R20,$03 ;номер клав. D1

rjmp Kcodend

Kcod5:

cpi R19,0b01011110

brne Kcod6

ldi R20,$04 ;номер клав. A2

rjmp Kcodend

Kcod6:

cpi R19,0b01011101

brne Kcod7

ldi R20,$05 ;номер клав. B2

rjmp Kcodend

Kcod7:

cpi R19,0b01011011

brne Kcod8

ldi R20,$06 ;номер клав. C2

rjmp Kcodend

Kcod8:

cpi R19,0b01010111

brne Kcod9

ldi R20,$07 ;номер клав. D2

rjmp Kcodend

Kcod9:

cpi R19,0b00111110

brne Kcod10

ldi R20,$08 ;номер клав. A3

rjmp Kcodend

Kcod10:

cpi R19,0b00111101

brne Kcod11

ldi R20,$09 ;номер клав. B3

rjmp Kcodend

Kcod11:

cpi R19,0b00111011

brne Kcod12

ldi R20,$0A ;номер клав. C3

rjmp Kcodend

Kcod12:

cpi R19,0b00110111

brne Kcodend

ldi R20,$0B ;номер клав. D3

Kcodend: ;выдача ном. нажат. клав. на индикатор

ldi R30,low(DigitTab*2) ;загружаем в Z адрес таблицы преобр-я

ldi R31,high(DigitTab*2)

add R30,R20 ;учитываем смещ-е в табл.

clr R0

adc R31,R0

lpm ;читаем код из табл.

out $15,R0 ;PORTC ;выдаем код на шину данных индикаторов

ldi R24,$70

out $02,R24 ;DDRE ;уст. реж порта E:Dig0..Dig2

ret

;****Проц. задержки****

Delay:

ldi R16,$05 ;Таймер 2 тактируется CK/1024

out $25,R16 ;Считает от 0 до $FF за 64 мсек

Wait:

in R16,$36 ;TIFR

out $1A,R16 ;PORTA

sbis $1A,6

rjmp Wait ;если нет, ждем

sbi $1A,6 ;если да, сброс флага переполнения

in R16,$1A

out $36,R16

ret

;*****Кодировка сегм. индикат.****

; a

; f b

; g

; e c

; d h

DigitTab:

; 1,2,3,4,5,6,7,8,9,A,B,C

.db $F9,$A4,$B0,$99,$92,$82,$F8,$80,$90,$88,$83,$C6; - для индик с общ. анодом

; .db $86,$DB,$CF,$E6,$ED,$FD,$87,$FF,$EF,$F7,$FC,$B9; - для индик с общ. катодом

;Из двух вышепривед. строк одна должна быть закоммент.т.

Соседние файлы в папке Схемотехника(1)