Заключение
В процессе работы была выполнена разработка «устройство проверки реакции». Проектирование осуществлялось в соответствии с техническим заданием.
При проектировании программных средств была выполнена декомпозиция задачи и построена статическая модель программы, которая определила состав программных модулей, необходимых для решения поставленной задачи. После этого была разработана структура данных программы и ее алгоритмизация. Далее было выполнено кодирование алгоритмов на языке ассемблера.
Таким образом, задание на лабораторную работу выполнено, а пояснительная записка оформлена в соответствии с действующими стандартами.
28 Список использованных источников
Комаров В. М. Микропроцессорные системы: учебное пособие / РГАТА. – Рыбинск,1997. – 324 с.
Комаров В. М. Микропроцессорные системы. Проектирование аппаратного и программного обеспечения: Учебное пособие. – 2 изд., перераб. и доп. – Рыбинск: РГАТА, 2004. – 176 с.
Комаров В. М. Микропроцессорные системы. Программирование на ассемб-лере: Учебное пособие. – 2 изд., перераб. и доп. – Рыбинск: РГАТА, 2004. – 164 с.
4. СТП 1.01 – 2002. Общие требования к оформлению учебных документов.
Текстовые документы. – Введ. с 01.02.2003. – 28 с.
Приложение А Текст программы
RomSize EQU 4096
inport EQU 2
outsym EQU 0
outnum EQU 1
outflag EQU 3
NMax EQU 50
Data SEGMENT AT 0h
timeuser dw 200 DUP(?) ;время пользователей
nakopitel db 5 dup(?) ;сумма 10 замеров
zamer db 1 dup(?)
nomberuser dw 1 dup(?) ;номер пользователя
mesto dw 1 dup(?) ;место
sort db 1 dup(?) ;флаг сортировки
flagtime db 1 dup(?) ;флаг генерации задержки
obraz db 1 dup(?) ;ячейка хранящая образ кнопок
old db 1 dup(?) ;значение кнопок для выбора пользователя
random dw 2 dup(?) ;ячейка хранящая случайные числа
iadro dw 1 dup(?) ;ядро для получения случайных чисел
time db 4 dup(?) ;время для вывода на дисплей (время 1ого замера и среднее время)
starts db 1 dup(?) ;состояние устройства (просмотр или замеры)
Data ENDS
Stk SEGMENT AT 100h
dw 20 dup (?)
StkTop Label Word
Stk ENDS
Code SEGMENT
ASSUME cs:Code,ds:Data,es:Code,ss:Stk
SymImages DB 03Fh,00Ch,076h,05Eh,04Dh,05Bh,07Bh,00Eh
DB 07Fh,05Fh,040h,079h,033h,07Ch,073h,063h
nullimages DB 02fh,03Dh,031h,031h
readkey PROC NEAR
mov obraz,00h
in al,inport ;читаем порт ввод номера
mov ah,al ;выделение
xor al,old ;переднего
and al,ah
mov old,ah
jz read1 ;фронта
mov obraz,ah
read1:
ret
readkey ENDP
Control PROC NEAR
;мы прочитав образ клавиатуры формируем флаги уравления
mov ah,obraz
cmp starts,0 ;если процесс измерения запущен
jne contr2 ;управление "сортировка/просмотр" невозможно.
and ah,10h
xor sort,ah ;формирование флага сортировки
mov al,sort
out outflag,al
cmp sort,0
jne contr2
xor ax,ax
mov mesto,ax
contr2:
mov al,obraz
and al,00000100b ;формирование флага запуска измерений
cmp al,0
je contr1
cmp starts,0ffh
je contr1
cmp sort,0
jne contr1
mov flagtime,0ffh
mov starts,0ffh
mov zamer,10
mov al,00000100b
out outflag,al
lea si,time
xor ax,ax
mov [si],ax
mov [si+2],ax
xor di,di
lea bx,timeuser
mov cx,100
contr4:mov ax,nomberuser
cmp [bx+di],ax
jne contr3
mov [bx+di],0ffffh
mov [bx+di+2],0ffffh
contr3:add di,4
loop contr4
contr1: ret
Control ENDP
inuser PROC NEAR
mov dx,nomberuser ;считываем текущий номер пользователя
cmp dx,0ffffh
jne is4
mov nomberuser,01h
mov dx,01
is4: xor ax,ax
cmp starts,0 ;если программа выполняет замеры переходим к подпрограмме выводящей номер пользователя на индикаторы
jne is3
mov al,sort ;если в режиме сортировки переходим к просмотру номера пользователя
cmp al,0
jne is3
mov al,03h ;рассматриваем кнопки управление номером пользователя
and al,obraz ;читаем образ кнопок
mov ah,al
cmp ah,1
jne is2
inc dl ;увеличиваем его на 1
cmp dl,0Ah
jb is2
xor dl,dl
is2: cmp ah,2
jne is3
inc dh ;или на 10 в зависимости от
cmp dh,0Ah ;того какая кнопка была нажата
jb is3
xor dh,dh ;не выходим за пределы 10ого счисления
is3: cmp sort,0
jne is1
mov nomberuser,dx ;сохраняем текущего пользователя
mov dx,11011111b ;передача параметров
mov bx,nomberuser ;
CALL outdecimal
is1: ret
inuser ENDP
inmesto PROC NEAR
mov dx,mesto ;считываем текущee место
cmp starts,0 ;если программа выполняет замеры выходим из подпрограммы.
jne im1
mov al,sort ;если не в режиме просто переходим к подпрограмме вывода места на индикаторы.
cmp al,0
je im5
mov al,01100000b ;рассматриваем кнопки управление местом
and al,obraz ;читаем образ кнопок
mov ah,al
cmp ah,00100000b
jne im2
inc dl ;увеличиваем его на 1
cmp dl,0Ah
jb im5
xor dl,dl
inc dh
cmp dh,0ah
jb im2
xor dx,dx ;соблюдаем границы
im2: cmp ah,01000000b
jne im5
cmp dl,0
ja im3
mov dl,0ah
cmp dh,0
jne im4
mov dh,0ah
im4: dec dh
im3: dec dl
im5: cmp sort,0
je im1
mov mesto,dx ;сохраняем текущего пользователя
mov dl,01111111b ;передача параметров
mov ax,mesto
inc ax
aaa
cmp ah,0ah
jne im6
xor ah,ah
im6: mov bx,ax
CALL outdecimal
im1: ret
inmesto ENDP
outdecimal PROC NEAR ;вывод двузначного десятичного числа на индикаторы в dx передается номера индикаторов, а в bx число.
CMP BX,0FFFFH
JNE OTN1
MOV BX,0A0AH
OTN1:
mov ax,Code
mov es,ax
xor ax,ax
mov al,dl
out outnum,al
mov al,bl
lea si,SymImages
add si,ax
mov al,es:[si]
out outsym,al
ror dl,1
xor al,al
out outsym,al
mov al,dl
out outnum,al
mov al,bh
lea si,SymImages
add si,ax
mov al,es:[si]
out outsym,al
xor al,al
out outsym,al
mov ax,data
mov es,ax
ret
outdecimal ENDP
randomize PROC NEAR ;образовываем задержку по определенному алгоритму
cmp starts,0
je ran2
cmp flagtime,0
je ran2
mov ax,iadro ;ядро
mov dx,random ;случайный множитель
cmp dx,0 ;множитель не должен
jne ran1 ;быть равен 0
mov dx,random+2
cmp dx,0
jne ran1
mov dx,iadro
ran1: mul dx
mov random,ax ;сохраняем младшую часть как новый множитель
shr ax,8
mov ah,dl
mov random+2,ax ;середина числа является сл. числом
mov flagtime,0 ;сгенерировали время, сбросили флаг
ran2: ret
randomize ENDP
priglashenie PROC NEAR
cmp starts,0
je pr2
mov cx,random+2
and cx,03fffh ;2 старших разряда отбросили, тк. утомляет ожидать.
cmp cx,0
je pr3
dec cx
mov random+2,cx
jmp pr2
pr3: mov al,00101100b ;задержки нет, выводим сигнал приглашения
out outflag,al
pr2: ret
PRIGLASHENIE ENDP
Reakcia PROC NEAR
cmp starts,0
je rkc3
cmp random+2,0
jne rkc3
lea si,time
mov al,obraz
and al,00001000b
cmp al,0
je rkc1
jmp exit
rkc1:
mov al,[si+3]
cmp al,02h
je exit
xor ax,ax
MOV CX,3
mov al,[si]
add al,1 ;прибавляем 1
aaa
mov [si],al
rkc2: inc si
mov al,[si]
adc al,0 ;подбираем перенос
aaa
mov [si],al
loop rkc2
cmp al,02h ;если более 2с. не ждем выходим.
je exit
jmp rkc3
exit: mov al,00000100b
out outflag,al
call sum
mov flagtime,0ffh
rkc3: ret
Reakcia ENDP
outtime PROC NEAR
mov ax,data
mov es,ax
lea si,time
mov ax,[si]
cmp ax,0f0fh
jne ot3
mov bx,11111111B
call outnull
jmp ot2
ot3:
xor cx,cx
mov cl,03h
xor dx,dx
mov dl,11110111b
ot1: lea di,SymImages
mov al,dl
out outnum,al
xor ax,ax
mov al,[si]
add di,ax
mov ax,Code
mov es,ax
mov al,es:[di]
out outsym,al
inc si
xor al,al
out outsym,al
mov ax,DATA
mov es,ax
ror dl,1
loop ot1
mov al,dl
out outnum,al
lea di,SymImages
xor ax,ax
mov al,[si]
add di,ax
mov ax,CODE
mov es,ax
mov al,es:[di]
or al,80h
out outsym,al
xor al,al
out outsym,al
mov ax,DATA
mov ax,es
ot2: ret
outtime ENDP
sum PROC NEAR
lea di,nakopitel ;загрузка адресов
lea si,time
mov cx,4
clc
sm2:mov al,[si]
adc al,[di]
aaa
mov [di],al
inc si
inc di
loop sm2
mov al,0
adc al,[di]
aaa
mov [di],al
mov cx,4
lea si,time
xor ax,ax
sm1:mov [si],al
inc si
loop sm1
mov al,zamer
dec al
mov zamer,al
cmp al,0
jne sm4
mov starts,0 ;выполнили 10 замеров
mov flagtime,0 ;сбросили флаги
mov sort,0
xor al,al
out outflag,al
call save ;вызвали подпрограмму записи
sm4:ret
sum ENDP
sortirovka proc near
xor cx,cx
lea bx,timeuser
mov cl,100
s3: push cx
xor si,si
mov cl,99
s2:
mov ax,[bx+si+2] ;берем время
cmp ax,[bx+si+6] ;сравниваем со след.
jbe s1 ; <=
mov ax,[bx+si] ;если справа меньше обмениваем dw 2
xchg ax,[bx+si+4]
mov [bx+si],ax
mov ax,[bx+si+2]
xchg ax,[bx+si+6]
mov [bx+si+2],ax
s1: add si,4
loop s2
pop cx
loop s3
ret
sortirovka endp
save PROC NEAR
lea si,nakopitel+4
lea di,timeuser+396
mov cx,4
xor ax,ax
sv1: shl ax,4 ;переводим время
or al,[si] ;в упакованный формат
dec si
loop sv1
MOV [DI+2],AX
MOV AX,NOMBERUSER
MOV [DI],AX
CALL sortirovka
xor ax,ax
lea si,nakopitel
mov [si],ax
mov [si+2],ax
mov [si+4],al
ret
save ENDP
raspakovka PROC NEAR
lea si,time
mov al,[bx+di+2]
and al,0fh
mov [si],al
mov al,[bx+di+2]
shr al,4
inc si
mov [si],al
inc si
mov al,[bx+di+3]
and al,0fh
mov [si],al
mov al,[bx+di+3]
shr al,4
inc si
mov [si],al
ret
raspakovka ENDP
PROSMOTR PROC NEAR
cmp starts,0
jne psmtr11
lea BX,timeuser
lea si,time
xor di,di
mov cx,100
cmp sort,0
je psmtr2
xor ax,ax
prsm2: cmp ax,mesto
jne prsm1
mov ax,[bx+di]
mov nomberuser,ax
call raspakovka
call outtime
mov dx,11011111b ;передача параметров
mov bx,nomberuser ;
CALL outdecimal
mov ax,mesto
inc ax
aaa
cmp ah,0ah
jne prsm6
xor ah,ah
prsm6:
mov dx,01111111b
mov bx,ax
call outdecimal
xor cx,cx
jmp psmtr1
prsm1:inc ax
aaa
add di,4
loop prsm2
mov bx,11011111b ;передача параметров
call outnull
psmtr11: jmp psmtr1
psmtr2: xor ax,ax
inc ax
xor di,di
mov cx,100
prsm4:
mov dx,[bx+di]
cmp nomberuser,dx
jne prsm3
mov mesto,ax
call raspakovka
call outtime
mov dx,01111111b ;передача параметров
mov bx,mesto ;выводим место
mov ax,bx
dec ax
aaa
mov mesto,ax
CALL outdecimal
jmp psmtr1
prsm3:
inc ax
aaa
add di,4
loop prsm4
mov bx,01111111b
call outnull
psmtr1: ret
PROSMOTR ENDP
outnull PROC NEAR
mov cl,04h
mov ax,Code
mov es,ax
lea si,nullimages+3
xor dx,dx
mov dl,11110111b
o1: mov al,dl
out outnum,al
mov al,es:[si]
out outsym,al
dec si
xor al,al
out outsym,al
ror dl,1
loop o1
mov ax,DATA
mov ax,es
mov AX,05050H
MOV AX,0A0A0H
mov dx,bx ;передача параметров
mov bx,0a0ah ;выводим место
CALL outdecimal
lea si,time
mov ax,0f0fh
mov [si],ax
mov [si+2],ax
ret
outnull ENDP
PODGOTOVKA PROC NAER
lea si,time
xor ax,ax
mov cl,4
pd1: mov [si],al
inc si
loop pd1
mov cx,200
lea si,timeuser
mov ax,0ffffh
pd2: mov [si],ax
inc si
inc si
loop pd2
mov ax,01
mov nomberuser,ax ;чистим начальное значение номера пользователя
xor ax,ax
mov mesto,ax ;чистим начальное значение текущего места пользователя
mov obraz,al ;чистим начальное значение образа кнопок
mov old,al ;чистим начальное значение предыдущего состояния кнопок
mov sort,al ;чистим начальное значение флага сортировки / просмотра
mov flagtime,al ;чистим начальное значение флаг генерации задержки
mov starts,al ;чистим начальное значение флаг запуска процесса измерений
mov zamer,al
lea si,nakopitel
mov [si],ax
mov [si+2],ax
mov [si+4],al
mov ax,1497h
mov iadro,ax
ret
PODGOTOVKA ENDP
Start:
mov ax,Data
mov ds,ax
mov es,ax
mov ax,Stk
mov ss,ax
lea sp,StkTop
call PODGOTOVKA
new:
call readkey
call Control
call inuser
call inmesto
call randomize
call priglashenie
call reakcia
call prosmotr
call outtime
jmp new
org RomSize-16
ASSUME cs:NOTHING
jmp Far Ptr Start
Code ENDS
END