Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет по ЛР домофон.doc
Скачиваний:
6
Добавлен:
13.09.2019
Размер:
1.45 Mб
Скачать

Заключение

В процессе работы была выполнена разработка устройства электронный домофон. Проектирование осуществлялось в соответствии с техническим заданием.

При проектировании программных средств была выполнена декомпозиция задачи и построена статическая модель программы, которая определила состав программных модулей, необходимых для решения поставленной задачи. После этого была разработана структура данных программы и ее алгоритмизация. Далее было выполнено кодирование алгоритмов на языке ассемблера.

Таким образом, задание на лабораторную работу выполнено, а пояснительная записка оформлена в соответствии с действующими стандартами.

22

Список использованных источников

  1. Комаров В. М. Микропроцессорные системы: учебное пособие / РГАТА. – Рыбинск,1997. – 324 с.

  2. Комаров В. М. Микропроцессорные системы. Проектирование аппаратного и программного обеспечения: Учебное пособие. – 2 изд., перераб. и доп. – Рыбинск: РГАТА, 2004. – 176 с.

  3. Комаров В. М. Микропроцессорные системы. Программирование на ассемб-лере: Учебное пособие. – 2 изд., перераб. и доп. – Рыбинск: РГАТА, 2004. – 164 с.

4. СТП 1.01 – 2002. Общие требования к оформлению учебных документов.

Текстовые документы. – Введ. с 01.02.2003. – 28 с.

Приложение А Текст программы

;.386

lampPort EQU 2h

Kbdlamp EQU 1h

Kbdkey EQU 1h

keyPort EQU 2h

Indport1 EQU 81h

Indport2 EQU 82h

RomSize EQU 4096

NMax EQU 50

KbdPort EQU 1h

zadmax EQU 10000 ; задержка замка

zadmax2 EQU 40000 ; задержка для вызова

zadmax3 EQU 60000 ; задержка для очистки

maxerr EQU 4 ; число ошибок ввода

E EQU 01110011b ; E

R EQU 1100000b ; r

d1 EQU 3 ; стартовая квартира

d2 EQU 0

Stk SEGMENT AT 100h

DW 10 DUP (?)

StkTop LABEL WORD

Stk ENDS

Data SEGMENT AT 0

KbdImage DB 4 DUP(?) ; образ клавиатуры

EmpKbd DB ? ; флаг пустой клавиатуры

KbdErr DB ? ; флаг ошибки клавиатуры

NextDig DB ? ; код очередной клавиши

Digout DB 4 DUP(?) ;cifri na ecrane

sDigout DB 4 DUP(?) ;

flcall db ? ; флаг вызова

flansw db ? ; флаг ответа

imansw db ? ; образ ответа

imopen db ? ; образ открытия

flerr db ? ; ошибка ввода

tecd db ? ;tekushaya vvodimaya cifra

kvart db ? ; номер вызванной квартиры

imkvart db ? ;

fldoor db ? ; флаг открытия двери 01111111 и 11111111

flsetkv db ? ; флаг ввода номера квартиры

zad Dw ? ; количесчтво циклов задержки

zad2 Dw ? ; количесчтво циклов задержки

zad3 Dw ? ; количесчтво циклов задержки

Data ENDS

Code SEGMENT

ASSUME cs:Code,ds:Data,es:Code,ss:Stk

SymImages DB 03Fh,00Ch,076h,05Eh,04Dh,05Bh,07Bh,00Eh,07Fh,05Fh

VibrDestr PROC NEAR ; гашение дребезга dx - параметр - адрес порта

VD1: mov ah,al

mov bh,0

VD2: in al,dx

or al,0f0h

cmp ah,al

jne VD1

inc bh

cmp bh,NMax

jne VD2

mov al,ah

ret

VibrDestr ENDP

KbdInput PROC NEAR ;vvod s klaviaturi

lea si,KbdImage ; загрузка образа в si

mov cx,LENGTH KbdImage ; загрузка счётчика циклов 4

mov bl,0FEh ; 1111111110 - для выбора 1-й строки клавиатуры

KI4: mov al,bl ; загрузка значения со сдвинутым 0

and al,fldoor ; учитываем подключенную к порту лампочку - изменяется толоько значимый бит

and al,flansw

out KbdPort,al ; выбор строки клавиатуры - нулём в соотв. разряде

in al,KbdPort ; ввод состояния строки

or al,0f0h ; наложение маски 11110000 - старшая тетрада становится = 1111

cmp al,0ffh ; если в строке кнопка не надата то на KI1

jz KI1

mov dx,KbdPort ; если нажата- то гасим дребезг

call VibrDestr

mov [si],al

KI2: in al,KbdPort ; снова вводим

or al,0f0h ; дожидаемся пока кнопку отпустят

cmp al,0ffh

jnz KI2

call VibrDestr ; снова гасится дребезг

jmp SHORT KI3

KI1: mov [si],al ; сохраняем значение в kbdimage (si+x)

KI3: inc si

rol bl,1 ; сдвиг 0 в накопителе bl

loop KI4

kiend:

mov flsetkv,0 ; обнулить флаг

in al,kbdport

and al,10000000b ; наложение маски

cmp al,0

jne zend

mov flsetkv,0ffh ; если джампер нажат - установить флаг

zend:

in al,kbdport

and al,01000000b ; наложение маски

cmp al,0

jne keyend

mov zad,0

mov fldoor,0ffh ; - установить флаг открытия двери

keyend:

ret

KbdInput ENDP

KeyInput PROC NEAR ; процедура ввода с кнопок

cmp flcall,0ffh

jne keyi1

in al,2 ; когда идёт вызов

not al

and al,1111b ; наложение маски для кнопок ответа

and al,imkvart ; удаление незначимых битов - выделение бита , отвечающего за вызванную квартиру

mov imansw,al ; образ ответов в квартирах

cmp al,0

je keyi1

mov flcall,0 ; если совпавший образ стал не =0 - флаг вызова сбрасывается

mov flansw,0ffh ; устанавливается флаг ответа

keyi1: cmp flansw,0ffh

jne keyi2

in al,2 ; если идёт разговор

not al

mov ah,al ; запись в ah значение порта

and ah,imansw ; наложение образа полученного для данной квартиры

cmp ah,0

jne keyi3 ; если данная кнопка ответа стала не нажата (положили трубку),то

mov flansw,010111111b ; сброс флага ответа

mov imkvart,0 ; обнуление робразов

mov imansw,0

mov word ptr digout,0

mov tecd,0

jmp keyi2 ; переход на конец

keyi3:

; and al,11110000b ; выделение битов откртия двери

in al,2

not al

and al,11110000b ; выделение битов откртия двери

shr al,1

shr al,1

shr al,1

shr al,1 ; сдвиг в младшую тетраду

mov imopen,al ; сохранение в образ открытия

and al,imansw ; наложение образа ответа

cmp al,0

je keyi2 ; если после сравнения с 0 получили не 0, то была нажата соответствующая кнопка открытия двери

mov fldoor,0ffh ; устанавливаем флаг открытия двери

mov flansw,010111111b ; сброс флага ответа

mov word ptr digout,0 ; очистка экрана

mov tecd,0

keyi2:

ret

KeyInput ENDP

outconn PROC NEAR

cmp flansw,0ffh

jne ocn2

mov al,imansw ; если идёт разговор

and al,imkvart

shl al,1

shl al,1

shl al,1

shl al,1 ; образ лампочки для квартиры в старшую тетраду

ocn2: cmp flcall,0ffh

jne ocn1 ; если идёт вызов

or al,imkvart ; образ лампочки для квартиры в младшую

ocn1: out 2,al

ret

outconn ENDP

KbdInContr PROC NEAR ;kontrol vvoda - формирует флаг ошибки клавиатуры и флаг пустой клавиатуры

lea bx,KbdImage

mov cx,3

mov EmpKbd,0

mov KbdErr,0

mov dl,0

KIC2: mov al,[bx]

mov ah,4

KIC1: shr al,1

cmc

adc dl,0

dec ah

jnz KIC1

inc bx

loop KIC2

cmp dl,0

jz KIC3

cmp dl,1

jz KIC4

mov KbdErr,0FFh

jmp SHORT KIC4

KIC3: mov EmpKbd,0FFh

KIC4: ret

KbdInContr ENDP

NxtDigTrf PROC NEAR ; формируем номер клавиши из образа

cmp EmpKbd,0FFh

jz NDT1

cmp KbdErr,0FFh

jz NDT1

lea bx,KbdImage

mov dx,0

NDT3: mov al,[bx]

cmp al,0ffh

jnz NDT2

inc dh

inc bx

jmp SHORT NDT3

NDT2: shr al,1

jnc NDT4

inc dl

jmp SHORT NDT2

NDT4: mov cl,2

shl dh,cl

or dh,dl

mov NextDig,dh

NDT1: ret

NxtDigTrf ENDP

Numvvod PROC NEAR

cmp KbdErr,0FFh

jz vv12

cmp EmpKbd,0FFh

jz vv12

xor ah,ah

mov zad3,0 ; обнуление задржки пропадания цифр с экрана

mov al,nextdig

m1: cmp NextDig,9 ;nazhata klavisha s cifroy

ja m10

cmp tecd,2 ;если tecd стала =2, то переход на конец

je vv12

mov dl,digout ; перенос байта из digout+si в байт digout+si+1

mov digout+1,dl

mov [digout],al ; заносим в начало массива очередную ццифру

inc tecd ;переход к вводу следующей цифры

m1_4:

vv12: jmp endmt

m10: cmp al,10 ; нажат ввод

jne m11

cmp flcall,0ffh

je vv2

cmp flsetkv,0 ;проверка нажат ли джампер

jne m10_1

mov al,digout ;вычитание

sub al,sdigout

aas

mov dl,al

mov al,digout+1

sbb al,sdigout+1

aas

mov dh,al

cmp dx,3

jbe m10_2

mov flerr,0ffh

jmp vv2

m10_2: mov dh,al

cmp dx,4

jae vv2

mov kvart,dl ; сохранение номера вызванной квартиры

mov flcall,0ffh ; установка флага вызова

mov zad2,0 ; сброс задержки

jmp vv2

m10_1: mov ax,word ptr digout ; сохранение digout в sdigout - аналог сохранения в пзу

mov word ptr sdigout,ax

jmp endmt

m11: cmp al,11 ;сброс

vv2: jne endmt

mov flansw,10111111b

mov flcall,0

mov tecd,0 ; - очистка экрана

mov cx,2

mov flerr,0h

mov si,0

fp1_: mov digout[si],0

inc si

mov flcall,0

loop fp1_

vv1_: jmp endmt

endmt: ret

Numvvod ENDP

opendoor PROC NEAR

cmp fldoor,0ffh ; проверка флага открытия двери

jne odend ; если не установлен - на конец

inc zad ; инкремент задержки

cmp zad,zadmax

jb odend

mov fldoor,01111111b ; выполняется когда задержка максимальна

mov zad,0 ; обнуляется задержка

mov imopen,0

odend: mov al,fldoor ; вывод на порт сигнала для замка

and al,flansw ; учёт того, что выводилось ранее

out 1h,al

ret

opendoor ENDP

outcall PROC NEAR ; управление вызовом

mov al,0

cmp flcall,0ffh

jne ocend ; выполняется когда идёт вызов ( flcall установлен )

mov al,1 ; вывод на лампочки квартир сигнала вызова

mov cl,kvart ; номер в подъезде (от 0 до 3)

oc2: cmp cl,0 ; если =0, то на конец

je oc1

shl al,1 ; сдвигаем в al 1 влево

dec cl ; модификация счётчика циклов

jmp oc2

oc1: mov imkvart,al ; запись полученного образа

inc zad2 ; инкремент задержки

cmp zad2,zadmax2

jb ocend

mov zad2,0 ; обнуляется задержка

mov flcall,0 ; выполняется когда задержка максимальна

mov word ptr digout,0

mov tecd,0

ocend: ret

outcall ENDP

cifrout PROC NEAR

cmp fldoor,0ffh

je cd1

cmp flansw,0ffh

je cdend

cmp flcall,0ffh

je cdend

inc zad3 ; инкремент задержки

cmp zad3,zadmax3

jb cdend

cd1: mov zad3,0 ; обнуляется задержка

mov word ptr digout,0

mov tecd,0

mov flerr,0

cdend:

cmp flerr,0ffh

je co1

xor ah,ah

mov al,digout ; байт от 0 до 9

lea bx,symimages ; загруска базового адреса массива образов

add bx,ax ; прибавление смещения

mov al,es:[bx] ; загрузка полученного байта

out 81h,al ; вывод

mov al,digout+1

lea bx,symimages

add bx,ax

mov al,es:[bx]

out 82h,al

jmp coend

co1: mov al,r

out 81h,al

mov al,e

out 82h,al

coend: ret

cifrout ENDP

funcprep proc near

mov cx,2

mov si,0

fp1: mov digout[si],0

inc si

loop fp1

mov fldoor,01111111b

mov tecd,0

mov flcall,0

mov flansw,010111111b

mov KbdErr,0

mov imansw,0

mov imkvart,0

mov imopen,0

mov kvart,0

mov zad,0

mov zad2,0

mov zad3,0

mov flerr,0

mov sdigout,d1

mov sdigout+1,d2

ret

funcprep endp

Start:

mov ax,Code

mov es,ax

mov ax,Data

mov ds,ax

mov ax,Stk

mov ss,ax

lea sp,StkTop

call funcprep

InfLoop: call KbdInput ; ввод с клавиатуры

call KbdInContr

call NxtDigTrf

call Numvvod

call outcall

call outconn

call KeyInput

call opendoor

call cifrout

jmp InfLoop

;В следующей строке необходимо указать смещение стартовой точки

org RomSize-16

assume cs:nothing

jmp Far Ptr Start

Code ENDS

END

2