
Схемотехника / Схемотехника(1) / cx lab3
.docМИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РФ
ПЕРМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСТИТЕТ
Кафедра АТ
Лабораторная работа №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; - для индик с общ. катодом
;Из двух вышепривед. строк одна должна быть закоммент.т.