Заключение
В процессе работы была выполнена разработка устройства электронный домофон. Проектирование осуществлялось в соответствии с техническим заданием.
При проектировании программных средств была выполнена декомпозиция задачи и построена статическая модель программы, которая определила состав программных модулей, необходимых для решения поставленной задачи. После этого была разработана структура данных программы и ее алгоритмизация. Далее было выполнено кодирование алгоритмов на языке ассемблера.
Таким образом, задание на лабораторную работу выполнено, а пояснительная записка оформлена в соответствии с действующими стандартами.
22
Список использованных источников
Комаров В. М. Микропроцессорные системы: учебное пособие / РГАТА. – Рыбинск,1997. – 324 с.
Комаров В. М. Микропроцессорные системы. Проектирование аппаратного и программного обеспечения: Учебное пособие. – 2 изд., перераб. и доп. – Рыбинск: РГАТА, 2004. – 176 с.
Комаров В. М. Микропроцессорные системы. Программирование на ассемб-лере: Учебное пособие. – 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