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

Заключение

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

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

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

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

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

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

  3. Комаров В. М. Микропроцессорные системы. Программирование на ассемб-лере: Учебное пособие. – 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

2