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

7 Алгоритмы

7.1 Алгоритмы макроуровня

Алгоритм одноуровневого представления программы изображен на рисунке 7.1. Он отображает распределение исполнителей, выделенных на этапе декомпозиции, по времени. Алгоритм двухуровневого представления изображен на рисунке 7.2. Помимо распределения исполнителей по времени, он отображает уровни вложенности подпрограмм.

Рисунок 7.1 – Алгоритм одноуровневого представления.

Рисунок 7.2 – Алгоритм двухуровневого представления.

7.2 Алгоритмы исполнителей

В данном разделе представлены алгоритмы исполнителей, которые непосредственно вызываются из макроуровня.

1. Модуль «Ввод № Заплыва с клавиатуры цифр»

Рисунок 7.3 – Алгоритм работы модуля «Ввод № Заплыва с клавиатуры цифр»

2. Модуль «Ввод фамилии с клавиатуры букв»

Рисунок 7.4 – Алгоритм модуля «Ввод фамилии с клавиатуры букв»

3. Модуль «Опрос кнопки Стереть текущую фамилию»

Рисунок 7.5 – Алгоритма модуля «Опрос кнопки Стереть текущую фамилию»

4. Модуль «Анализ вывода фамилии»

Рисунок 7.6 – Алгоритм модуля «Анализ вывода фамилии»

5. Модуль «Опрос кнопки Старт»

Рисунок 7.7 – Алгоритм модуля «Опрос кнопки Старт»

6. Модуль «Отсчет времени»

Рисунок 7.8 – Алгоритм модуля «Отсчет времени»

7. Модуль «Анализ нажатия кнопок Финиш»

Рисунок 7.9 – Алгоритм модуля «Анализ нажатия кнопок Финиш»

8. Модуль «Проверки финиша спортсменов»

Рисунок 7.10 – Алгоритм модуля «Проверки финиша спортсменов»

9. Модуль «Опрос кнопки Проанализировать и отсортировать»

Рисунок 7.11 – Алгоритм модуля «Опрос кнопки Проанализировать и отсортировать»

10. Модуль «Сортировка»

Рисунок 7.12 – Алгоритма модуля «Сортировка»

11. Модуль «Вывод номеров мест на дисплей»

Рисунок 7.13 – Алгоритм модуля «Вывод номеров мест на дисплей»

12. Модуль «Вывод номеров дорожек на дисплей»

Рисунок 7.14 – Алгоритм модуля «Вывод номеров дорожек на дисплей»

13. Модуль «Вывод всех фамилий на дисплей»

Рисунок 7.15 – Алгоритм модуля «Вывод всех фамилий на дисплей»

14. Модуль «Вывод результата спортсменов на дисплей»

Рисунок 7.16 – Алгоритм модуля «Вывод результата спортсменов на дисплей»

8 Исходный текст программы

.386

RomSize EQU 4096

Stk SEGMENT use16 AT 100h

DW 100 DUP (?)

StkTop LABEL WORD

Stk ENDS

InitData SEGMENT use16

;Здесь размещаются описания констант

NMAX =50 ;для процедуры дребезга

Dorog_Port_Out1 = 0022h

Dorog_Port_Out2 = 0001h

Result1_Port_Out = 0002h

Mesto_Port_Out = 000Eh

Zapliv_Port_Out1 = 0023h

Zapliv_Port_Out2 = 0011h

KlavZ_Port_Out = 0012h

KlavF_Port_Out = 0014h

KlavZ_Port_In = 0001h

KlavF_Port_In = 0002h

Start_Port_In = 0004h

Finish_Port_In = 0008h

COM_CO_Out = 0010h (code)

COM_D_Out = 0000h (data)

InitData ENDS

Data SEGMENT use16 AT 0

;===Глобальные переменные===================

Nind DW ? ;Nind-номер индикатора; Nstr-номер строки; Nstolb-номер столбца

Nstr DW ?

Nstolb DW ?

OldSledFam DB ? ;

OldStart db ?

NumTekInd db ?

ImageInd11 db 8 dup(?) ;1я фамилия

ImageInd12 db 8 dup(?)

ImageInd13 db 8 dup(?)

ImageInd14 db 8 dup(?)

ImageInd15 db 8 dup(?)

ImageInd16 db 8 dup(?)

ImageInd17 db 8 dup(?)

ImageInd18 db 8 dup(?)

ImageInd21 db 8 dup(?) ;2я фамилия

ImageInd22 db 8 dup(?)

ImageInd23 db 8 dup(?)

ImageInd24 db 8 dup(?)

ImageInd25 db 8 dup(?)

ImageInd26 db 8 dup(?)

ImageInd27 db 8 dup(?)

ImageInd28 db 8 dup(?)

ImageInd31 db 8 dup(?) ;3я фамилия

ImageInd32 db 8 dup(?)

ImageInd33 db 8 dup(?)

ImageInd34 db 8 dup(?)

ImageInd35 db 8 dup(?)

ImageInd36 db 8 dup(?)

ImageInd37 db 8 dup(?)

ImageInd38 db 8 dup(?)

ImageInd41 db 8 dup(?) ;4я фамилия

ImageInd42 db 8 dup(?)

ImageInd43 db 8 dup(?)

ImageInd44 db 8 dup(?)

ImageInd45 db 8 dup(?)

ImageInd46 db 8 dup(?)

ImageInd47 db 8 dup(?)

ImageInd48 db 8 dup(?)

ImageInd51 db 8 dup(?) ;5я фамилия

ImageInd52 db 8 dup(?)

ImageInd53 db 8 dup(?)

ImageInd54 db 8 dup(?)

ImageInd55 db 8 dup(?)

ImageInd56 db 8 dup(?)

ImageInd57 db 8 dup(?)

ImageInd58 db 8 dup(?)

ImageInd61 db 8 dup(?) ;6я фамилия

ImageInd62 db 8 dup(?)

ImageInd63 db 8 dup(?)

ImageInd64 db 8 dup(?)

ImageInd65 db 8 dup(?)

ImageInd66 db 8 dup(?)

ImageInd67 db 8 dup(?)

ImageInd68 db 8 dup(?)

ImageInd71 db 8 dup(?) ;7я фамилия

ImageInd72 db 8 dup(?)

ImageInd73 db 8 dup(?)

ImageInd74 db 8 dup(?)

ImageInd75 db 8 dup(?)

ImageInd76 db 8 dup(?)

ImageInd77 db 8 dup(?)

ImageInd78 db 8 dup(?)

ImageInd81 db 8 dup(?) ;8я фамилия

ImageInd82 db 8 dup(?)

ImageInd83 db 8 dup(?)

ImageInd84 db 8 dup(?)

ImageInd85 db 8 dup(?)

ImageInd86 db 8 dup(?)

ImageInd87 db 8 dup(?)

ImageInd88 db 8 dup(?)

Vremya1 db 6 dup(?) ;Время 1го спортсмена

Vremya2 db 6 dup(?) ;Время 2го спортсмена

Vremya3 db 6 dup(?) ;Время 3го спортсмена

Vremya4 db 6 dup(?) ;Время 4го спортсмена

Vremya5 db 6 dup(?) ;Время 5го спортсмена

Vremya6 db 6 dup(?) ;Время 6го спортсмена

Vremya7 db 6 dup(?) ;Время 7го спортсмена

Vremya8 db 6 dup(?) ;Время 8го спортсмена

;-----Флаг остановки времени спортсменов (0-время 1-результат)--------

FlagVremya1 db ? ;Флаг остановки времени 1го спортсмена

FlagVremya2 db ? ;Флаг остановки времени 2го спортсмена

FlagVremya3 db ? ;Флаг остановки времени 3го спортсмена

FlagVremya4 db ? ;Флаг остановки времени 4го спортсмена

FlagVremya5 db ? ;Флаг остановки времени 5го спортсмена

FlagVremya6 db ? ;Флаг остановки времени 6го спортсмена

FlagVremya7 db ? ;Флаг остановки времени 7го спортсмена

FlagVremya8 db ? ;Флаг остановки времени 8го спортсмена

NumberDorog db 8 dup(?) ;номера дорожек

NumberMesto db 8 dup(?) ;номера мест

FlagCheckFin db ? ;флаг Финиша всех спортсменов 0-еще не закончили(по умолчанию), 1-все финишировали

FlagPA db ?

FlagStart db ?

FlagSortEnd db ?

;=======Переменные для процедуры ввода Заплыва с клавиатуры цифр===============

VKZZnach DB 2 DUP (?) ;2 байта для вывода цифр на индикаторы

VKZKeyboard DB 2 DUP (?) ;массив текущих значений кнопок (индекс элемента - номер строки, хранимое число - сигнал с регистра ввода)

VKZOldznach DB 2 DUP (?)

;=======Переменные для процедуры ввода Фамилии с клавиатуры букв===============

VKFKeyboard DB 4 DUP (?) ;массив текущих значений кнопок (индекс элемента - номер строки, хранимое число - сигнал с регистра ввода)

VKFKodKlav DB ?

VKFOldznach DB 4 DUP (?)

VKFImage1 db 8 dup(?) ;образ буквы А

VKFImage2 db 8 dup(?) ;образ буквы Б

VKFImage3 db 8 dup(?) ;образ буквы В

VKFImage4 db 8 dup(?) ;образ буквы Г

VKFImage5 db 8 dup(?) ;образ буквы Д

VKFImage6 db 8 dup(?)

VKFImage7 db 8 dup(?)

VKFImage8 db 8 dup(?)

VKFImage9 db 8 dup(?)

VKFImage10 db 8 dup(?)

VKFImage11 db 8 dup(?)

VKFImage12 db 8 dup(?)

VKFImage13 db 8 dup(?)

VKFImage14 db 8 dup(?)

VKFImage15 db 8 dup(?)

VKFImage16 db 8 dup(?)

VKFImage17 db 8 dup(?)

VKFImage18 db 8 dup(?)

VKFImage19 db 8 dup(?)

VKFImage20 db 8 dup(?)

VKFImage21 db 8 dup(?)

VKFImage22 db 8 dup(?)

VKFImage23 db 8 dup(?)

VKFImage24 db 8 dup(?)

VKFImage25 db 8 dup(?)

VKFImage26 db 8 dup(?)

VKFImage27 db 8 dup(?)

VKFImage28 db 8 dup(?)

VKFImage29 db 8 dup(?)

VKFImage30 db 8 dup(?) ;образ буквы Э

VKFImage31 db 8 dup(?) ;образ буквы Ю

VKFImage32 db 8 dup(?) ;образ буквы Я

VKFImageInd1 db 8 dup(?) ;образ для вывода на 1й индикатор

VKFImageInd2 db 8 dup(?) ;образ для вывода на 2й индикатор

VKFImageInd3 db 8 dup(?) ;образ для вывода на 3й индикатор

VKFImageInd4 db 8 dup(?) ;образ для вывода на 4й индикатор

VKFImageInd5 db 8 dup(?) ;образ для вывода на 5й индикатор

VKFImageInd6 db 8 dup(?) ;образ для вывода на 6й индикатор

VKFImageInd7 db 8 dup(?) ;образ для вывода на 7й индикатор

VKFImageInd8 db 8 dup(?) ;образ для вывода на 8й индикатор

VKFAddrTekBukv dw ? ;слово для хранения адреса текущей введенной буквы

;=======Переменные для процедуры вывода Времени===============

Taimer DB 6 dup(?) ;сотые секунды 1й индикатор

;=======Переменные для процедуры Сортировки===============

ChangeNum1 db ?

ChangeNum2 db ?

VremyaX db 6 dup(?) ;для обмена данных времени

NumberDorogX db ? ;для обмена номеров дорожек

ImageIndX db ? ;для обмена данных фамилий

Data ENDS

Code segment use16

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

;Образы cимволов для 7ми сегментного индикатора: "0", "1", ... "9"

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

VKZImagesT DB 0BFh,08Ch,0F6h,0DEh,0CDh,0DBh,0FBh,08Eh,0FFh,0DFh

;========3й уровень вложенности подпрограмм=============================================

;========процедура записи в память кода букв=================

SaveConst proc

lea si,VKFImage1 ;записываем код буквы А

mov byte ptr [si],00h

inc si

mov byte ptr [si],78h

inc si

mov byte ptr [si],14h

inc si

mov byte ptr [si],12h

inc si

mov byte ptr [si],12h

inc si

mov byte ptr [si],14h

inc si

mov byte ptr [si],78h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage2 ;записываем код буквы Б

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],4Ah

inc si

mov byte ptr [si],4Ah

inc si

mov byte ptr [si],4Ah

inc si

mov byte ptr [si],32h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage3 ;записываем код буквы В

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],4Ah

inc si

mov byte ptr [si],4Ah

inc si

mov byte ptr [si],4Ah

inc si

mov byte ptr [si],34h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage4 ;записываем код буквы Г

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage5 ;записываем код буквы Д

mov byte ptr [si],00h

inc si

mov byte ptr [si],40h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],40h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage6 ;записываем код буквы Е

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],52h

inc si

mov byte ptr [si],52h

inc si

mov byte ptr [si],52h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage7 ;записываем код буквы Ж

mov byte ptr [si],00h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],24h

inc si

mov byte ptr [si],18h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],18h

inc si

mov byte ptr [si],24h

inc si

mov byte ptr [si],42h

;----------------------------------------------------------------

lea si,VKFImage8 ;записываем код буквы З

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],52h

inc si

mov byte ptr [si],5Ah

inc si

mov byte ptr [si],66h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage9 ;записываем код буквы И

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],20h

inc si

mov byte ptr [si],10h

inc si

mov byte ptr [si],08h

inc si

mov byte ptr [si],04h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage10 ;записываем код буквы Й

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],20h

inc si

mov byte ptr [si],11h

inc si

mov byte ptr [si],09h

inc si

mov byte ptr [si],04h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage11 ;записываем код буквы К

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],08h

inc si

mov byte ptr [si],14h

inc si

mov byte ptr [si],22h

inc si

mov byte ptr [si],40h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage12 ;записываем код буквы Л

mov byte ptr [si],00h

inc si

mov byte ptr [si],70h

inc si

mov byte ptr [si],08h

inc si

mov byte ptr [si],04h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage13 ;записываем код буквы М

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],04h

inc si

mov byte ptr [si],08h

inc si

mov byte ptr [si],08h

inc si

mov byte ptr [si],04h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage14 ;записываем код буквы Н

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],10h

inc si

mov byte ptr [si],10h

inc si

mov byte ptr [si],10h

inc si

mov byte ptr [si],10h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage15 ;записываем код буквы О

mov byte ptr [si],00h

inc si

mov byte ptr [si],3Ch

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],3Ch

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage16 ;записываем код буквы П

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage17 ;записываем код буквы Р

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],12h

inc si

mov byte ptr [si],12h

inc si

mov byte ptr [si],12h

inc si

mov byte ptr [si],0Ch

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage18 ;записываем код буквы С

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],3Ch

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],42h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage19 ;записываем код буквы Т

mov byte ptr [si],00h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],7Eh

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],02h

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы У

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Ф

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Х

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Ц

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Ч

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Ш

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Щ

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Ъ

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Ы

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Ь

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Э

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Ю

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

;----------------------------------------------------------------

lea si,VKFImage20 ;записываем код буквы Я

mov byte ptr [si],00h

inc si

mov byte ptr [si],26h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],48h

inc si

mov byte ptr [si],3Eh

inc si

mov byte ptr [si],00h

inc si

mov byte ptr [si],00h

ret

SaveConst endp

;========Процедурв гашения дребезга====================

;====dx-номер порта ввода=============================

VibrDestr PROC

push bx

push cx

push dx

push si

push di

VD1: mov ah,al

mov bh,0

VD2: in al,dx

cmp ah,al

jne VD1

inc bh

cmp bh,NMAX

jne VD2

mov al,ah

pop di

pop si

pop dx

pop cx

pop bx

ret

VibrDestr ENDP

;==VKF====процедура вывода на матричный индикатор буквы==========

;dl-номер индикатора, si-адрес буквы

;Nind-номер индикатора; Nstr-номер строки; Nstolb-номер столбца

OutputBukva proc NEAR

push bx

push cx

push dx

push si

push di

mov al,dl ;кладем в al значение индикатора кот. необходимо зажечь

mov dx,Nind

out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

mov cl,8

mov ah,01h ;кладем в ah первоночальное значение для 1го столбца

m11: mov al,00000000b ;гасим столбец, чтобы не загоралось старое значение

mov dx,Nstr

out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

mov al,ah

mov dx,Nstolb

out dx,al ;зажигаем столбец

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

mov al,byte ptr [si]

mov dx,Nstr

out dx,al ;зажигаем строку

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

shl ah,1

inc si

loop m11

mov cl,8 ;теперь гасим все индикаторы чтобы не запоминалось старое значение

mov ah,01h

m110: mov al,00000000b ;гасим столбец, чтобы не загоралось старое значение

mov dx,Nstr

out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

mov al,ah

mov dx,Nstolb

out dx,al ;зажигаем столбец

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

mov al,00000000b

mov dx,Nstr

out dx,al ;зажигаем строку

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

shl ah,1

loop m110

pop di

pop si

pop dx

pop cx

pop bx

ret

OutputBukva endp

;=============================================================

;===VKF===Обнуление изображения=========================

;si-адрес изображения

ObnulImageInd proc NEAR

push bx

push cx

push dx

push si

push di

mov cl,8

m1: mov byte ptr [si],0

inc si

loop m1

pop di

pop si

pop dx

pop cx

pop bx

ret

ObnulImageInd endp

;=======================================================

;===VKF=====процедура копирования буквы=================

;si-источник, di-приемник

CopyBukva proc NEAR

push bx

push cx

push dx

push si

push di

mov dx,es

mov ax,ds

mov es,ax

mov cx,8

REP movs byte ptr [di],[si]

mov es,dx

pop di

pop si

pop dx

pop cx

pop bx

ret

CopyBukva endp

;=======================================================

;=========Подпрограмма копирует текущие буквы в нужное положение=============

CopyTekBukv PROC near

push bx

push cx

push dx

push si

push di

mov bl,1 ;Здесь копируем текущую строку, которую получаем из процедуры

mov ch,8 ;в необходимую область памяти для вывода

lea si,VKFImageInd1

lea di,ImageInd11

СTVcicl12: cmp NumTekInd,bl

jne СTVnext21

mov cl,8

СTVcicl11: call CopyBukva

add si,8

add di,8

dec cl

jnz СTVcicl11

jmp CTVExit

СTVnext21: inc bl

lea si,VKFImageInd1

add di,64

dec ch

jnz СTVcicl12

CTVExit: pop di

pop si

pop dx

pop cx

pop bx

ret

CopyTekBukv ENDP

;===========================================================================================

;=======2й уровень вложенности подпрограмм================================================

;=======Процедура ввода с клавиатуры цифр================

VvodKlavZ PROC

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

je VKZExit

VKZreadbut:mov VKZkeyboard,0 ;обнуление массива строк клавиатуры

mov VKZkeyboard+1,0

lea si,VKZkeyboard ;загрузка адреса массива строк клавиатуры

lea di,VKZOldZnach ;загрузка адреса массива предыдущих значений ввода

mov bl,1 ;загрузка адреса 1й строки для регистра вывода

mov cx,2

VKZnextStr:mov al,bl

out KlavZ_Port_Out,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

in al,KlavZ_Port_In ;проверяем, нажата ли хоть одна кнопка в iй строке?

mov dx,1

call VibrDestr ;гасим дребезг

mov dh,al

xor dh,[di] ;выделяем фронты

and dh,al ;выделяем передние фронты

mov [di],al ;сохраняем значение

jz VKZVV1

mov [si],al ;кладем значение клавиши в iй байт образа клавиатуры

jmp VKZAnalis

VKZVV1: inc si ;переходим к следущей строке, если в данной ни одна клавиша не активна

inc di

shl bl,1

loop VKZnextStr

jmp VKZPrint ;если никакая клавиша не была нажата то идем на Print

;----Преобразование из образа клавиатуры в позиционный двоичный код------

VKZAnalis: mov al,VKZZnach ;сохраняем предыдущее значение для вывода на 2й индикатор

mov VKZZnach+1,al

cmp VKZkeyboard,0

je VKZsledk1

mov dl,0 ;значит цифра находится в 1й строке - начинаем с 0

lea si,VKZkeyboard ;будем обрабатывать 1ю строку

jmp VKZnext1

VKZsledk1: cmp VKZkeyboard+1,0

je VKZnext1

mov dl,5 ;значит цифра находится в 2й строке - начинаем с 5

lea si,VKZkeyboard+1 ;будем обрабатывать 2ю строку

jmp VKZnext1

VKZnext1: mov al,[si]

VKZKK1: shr al,1

cmp al,0

je VKZEX1 ;если ничего не осталось в al то выходим

inc dl ;увеличиваем код на 1

jmp VKZKK1 ;крутимся на KK1

VKZEX1: mov VKZZnach,dl

VKZPrint: xor bh,bh

mov bl,VKZZnach+1

mov al,VKZImages[bx]

out Zapliv_Port_Out2,al ;вывод старшей цифры

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

xor bh,bh

mov bl,VKZZnach

mov al,VKZImages[bx]

out Zapliv_Port_Out1,al ;вывод младшей цифры

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

VKZExit: pop di

pop si

pop dx

pop cx

pop bx

ret

VvodKlavZ ENDP

;=======================================================

;=======Процедура ввода с клавиатуры букв================

VvodKlavF PROC

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

je VKFPrint

VKFreadbut:mov VKFkeyboard,0 ;обнуление массива строк клавиатуры

mov VKFkeyboard+1,0

mov VKFkeyboard+2,0

mov VKFkeyboard+3,0

lea si,VKFkeyboard ;загрузка адреса массива строк клавиатуры

lea di,VKFOldZnach ;загрузка адреса массива предыдущих значений ввода

mov bl,1 ;загрузка адреса 1й строки для регистра вывода

mov cx,4

VKFnextStr:mov al,bl

out KlavF_Port_Out,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

in al,KlavF_Port_In ;проверяем, нажата ли хоть одна кнопка в iй строке?

mov dx,2

call VibrDestr ;гасим дребезг

mov dh,al

xor dh,[di] ;выделяем фронты

and dh,al ;выделяем передние фронты

mov [di],al ;сохраняем значение

jz VKFVV1

mov [si],al ;кладем значение клавиши в iй байт образа клавиатуры

jmp VKFAnalis

VKFVV1: inc si ;переходим к следущей строке, если в данной ни одна клавиша не активна

inc di

shl bl,1

loop VKFnextStr

jmp VKFPrint ;если никакая клавиша не была нажата то идем на Print

;---------Анализ того, что лежит в keyboard-----------

VKFAnalis: cmp VKFkeyboard,0

je VKFsledk1

mov dl,0 ;значит буква находится в 1й строке - начинаем с 0

lea si,VKFkeyboard ;будем обрабатывать 1ю строку

jmp VKFPreobr

VKFsledk1: cmp VKFkeyboard+1,0

je VKFsledk2

mov dl,8 ;значит буква находится в 2й строке - начинаем с 8

lea si,VKFkeyboard+1 ;будем обрабатывать 2ю строку

jmp VKFPreobr

VKFsledk2: cmp VKFkeyboard+2,0

je VKFsledk3

mov dl,16 ;значит буква находится в 3й строке - начинаем с 16

lea si,VKFkeyboard+2 ;будем обрабатывать 2ю строку

jmp VKFPreobr

VKFsledk3: cmp VKFkeyboard+3,0

je VKFPreobr

mov dl,24 ;значит буква находится в 4й строке - начинаем с 24

lea si,VKFkeyboard+3 ;будем обрабатывать 2ю строку

jmp VKFPreobr

VKFPreobr: mov al,[si]

VKFKK1: shr al,1

cmp al,0

je VKFEX1 ;если ничего не осталось в al то выходим

inc dl ;увеличиваем код на 1

jmp VKFKK1 ;крутимся на KK1

VKFEX1: mov VKFKodKlav,dl

lea si,VKFImage1

mov al,VKFKodKlav

mov ah,0

shl ax,3 ;умножаем KodKlav на 8 чтобы получить смещение относительно кода первой буквы

lea si,VKFImage1

add si,ax ;получаем начальный адрес нужной нам буквы

mov VKFAddrTekBukv,si ;сохраняем его

lea si,VKFImageInd7 ;Перемещаем буквы на одно положение влево

lea di,VKFImageInd8

call CopyBukva ;т.е. 7->8

lea si,VKFImageInd6

lea di,VKFImageInd7

call CopyBukva ;т.е. 6->7

lea si,VKFImageInd5

lea di,VKFImageInd6

call CopyBukva ;т.е. 5->6

lea si,VKFImageInd4

lea di,VKFImageInd5

call CopyBukva ;т.е. 4->5

lea si,VKFImageInd3

lea di,VKFImageInd4

call CopyBukva ;т.е. 3->4

lea si,VKFImageInd2

lea di,VKFImageInd3

call CopyBukva ;т.е. 2->3

lea si,VKFImageInd1

lea di,VKFImageInd2

call CopyBukva ;т.е. 1->2

mov si,VKFAddrTekBukv

lea di,VKFImageInd1

call CopyBukva ;а новую записываем в 1й индикатор

VKFPrint: pop di

pop si

pop dx

pop cx

pop bx

ret

VvodKlavF ENDP

;=======================================================

;=========Подпрограмма опроса кнопки Стереть Фамилию===============

SteretFam PROC near

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

je StFamExit

in al,00h

cmp al,01h

jne StFamExit

mov cx,8 ;если нажата, то очищаем образ

lea si,VKFImageInd1

StFam1: call ObnulImageInd

add si,8

loop StFam1

StFamExit: pop di

pop si

pop dx

pop cx

pop bx

ret

SteretFam ENDP

;================================================================

;=========Подпрограмма анализа вывода всех фамилий=======================

AnalisFam PROC near

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

je AnFamExit

;---------Ввод и отображение фамилий-----------------------------------------------

in al,00h ;Проверяем нажата ли кнопка "След.Фамилия"

mov dh,al

xor dh,OldSledFam ;выделяем фронты

and dh,al ;выделяем передние фронты

mov OldSledFam,al ;сохраняем значение

jz VFnext12

cmp al,02h

jne VFnext12 ;если не нажата то выводим текущую фамилию

mov cx,8 ;если нажата, то очищаем образ для след. фамилии

lea si,VKFImageInd1

VFNN11: call ObnulImageInd

add si,8

loop VFNN11

cmp NumTekInd,8

je VFnext11 ;если нажата то начинаем выводить следующую

inc NumTekInd ;+1 к счетчику номера текущей фамилии

jmp VFnext12 ;если фамилия последняя (8)

VFnext11: mov NumTekInd,1 ;то начинаем опять с первой

;-----------копируем текущие буквы в нужное положение-----------

VFnext12: call CopyTekBukv

AnFamExit: pop di

pop si

pop dx

pop cx

pop bx

ret

AnalisFam ENDP

;================================================================

;=========Подпрограмма опроса кнопки "Старт"=======================

PressStart PROC near

push bx

push cx

push dx

push si

push di

in al,Start_Port_In ;Проверяем нажата ли кнопка "Старт"

cmp al,01h

jne NoStart

mov FlagStart,1 ;если да, взводим флаг FlagStart

jmp PSExit

NoStart: mov FlagStart,0 ;если нет, то опускаем флаг FlagStart

PSExit:

pop di

pop si

pop dx

pop cx

pop bx

ret

PressStart ENDP

;================================================================

;=========Подпрограмма вывода всех фамилий=======================

VivodFam PROC near

push bx

push cx

push dx

push si

push di

;------Вывод всех фамилий------------------------------

mov Nind,0014h

mov Nstolb,0015h

mov Nstr,0016h

mov cx,8

lea si,ImageInd11

VFnextFam: call VivodIndikator

add si,64

add Nind,3

add Nstolb,3

add Nstr,3

loop VFnextFam

pop di

pop si

pop dx

pop cx

pop bx

ret

VivodFam ENDP

;================================================================

;=========Подпрограмма вывода на индикаторы=============

;si-начало массива i-й фамилии

VivodIndikator PROC near

push bx

push cx

push dx

push si

push di

mov cx,8

mov dl,01h

VInd1: call OutputBukva

shl dl,1

add si,8

loop Vind1

pop di

pop si

pop dx

pop cx

pop bx

ret

VivodIndikator ENDP

;======================================================

;=========Подпрограмма активирования таймера===========

OtschetVremya PROC near

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

jne OtVr1

;----------Установка счетчика в нач. значение-------------------------------

out 0300h,00110000 ;Заносим в счетчик ВИ54 управляющее слово D7D6 00-выбор регистра режима канал 0,

;D5D4 11-чтение/загрузка младший байт затем старший

;D3D2D1 000-режим 0, D0 0-двоичный счетчик

out 0000h,A8h ;Записываем в счетчик число 25000

out 0000h,61h ;-это множитель PCLK*25000=1мс

OtVr1:

pop di

pop si

pop dx

pop cx

pop bx

ret

OtschetVremya ENDP

;=======================================================

;=========Подпрограмма отсчета времени 00:00:00==========

Timer PROC far

inc Taimer[0] ;+1 к MSec1

cmp Taimer[0],10

jne OtVr1

mov Taimer[0],0 ;если MSec1, то MSec1:=0

inc Taimer[1] ;+1 к MSec2

cmp Taimer[1],10

jne OtVr1

mov Taimer[1],0 ;если MSec2, то MSec2:=0

inc Taimer[2] ;+1 к Sec1

cmp Taimer[2],10

jne OtVr1

mov Taimer[2],0 ;если Sec1, то Sec1:=0

inc Taimer[3] ;+1 к Sec2

cmp Taimer[3],6

jne OtVr1

mov Taimer[3],0 ;если Sec2=6, то Sec2:=0

inc Taimer[4] ;+1 к Min1

cmp Taimer[4],10

jne OtVr1

mov Taimer[4],0 ;если Min1, то Min1:=0

inc Taimer[5] ;+1 к Min2

cmp Taimer[5],6

jne OtVr1

mov Taimer[5],0 ;если Sec2=6, то Sec2:=0

reti

Timer ENDP

;=======================================================

;=========Подпрограмма анализа нажатия клавиш ФИНИШ===============

;al-код номера дорожки "ФИНИША" спортсмена

VivodResult PROC near

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

jne ViResExit

lea bx,FlagVremya1 ;1й флаг

mov dl,01h ;номер 1го порта

mov ch,8

mov dh,0 ;счетчик 0,6,12...

ViResCicl1:cmp al,dl ;находим нажатую клавишу

jne ViResNext1

cmp byte ptr [bx],1 ;если время уже было остановлено, то игнорируем нажатие

je ViResExit

mov byte ptr [bx],1 ;взводим FlagVremyaX=1 если клавиша нажата

;---сохранение---------------------------

lea si,Taimer[0] ;загружаем в si текущее время Таймера

lea di,Vremya1[0]

mov ah,0 ;преобразование

mov al,dh ;из байта в слово

add di,ax ;в di - время спортсмена кот нажал ФИНИШ, которое надо сохранить

mov cl,6

ViResCicl2:mov al,[si]

mov [di],al ;сохраняем текущее время

inc si

inc di

dec cl

jnz ViResCicl2

;---сохранение---------------------------

jmp ViResExit

ViResNext1:inc bx

shl dl,1

add dh,6

dec ch

jnz ViResCicl1

ViResExit:

pop di

pop si

pop dx

pop cx

pop bx

ret

VivodResult ENDP

;======================================================

;=========Подпрограмма проверки финиша спортсменов===============

CheckFinish PROC near

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

jne ChFExit2

lea si,FlagVremya1

mov cx,8

ChFCicl1: cmp byte ptr [si],1

jne ChFExit1 ;если один из флагов=0 то общий флаг=0

inc si

loop ChFCicl1

mov FlagCheckFin,1 ;если все флаги=1 то общий флаг=1

jmp ChFExit2

ChFExit1: mov FlagCheckFin,0

ChFExit2: pop di

pop si

pop dx

pop cx

pop bx

ret

CheckFinish ENDP

;======================================================

;=========Подпрограмма опроса кнопки "Проанализировать и отсортировать"=======================

PressPA PROC near

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

jne PAExit

in al,00h ;Проверяем нажата ли кнопка "Проанализировать и отсортировать"

cmp al,04h

jne PAExit

mov FlagPA,1 ;если да, взводим флаг FlagPA

PAExit:

pop di

pop si

pop dx

pop cx

pop bx

ret

PressPA ENDP

;================================================================

;=========Подпрограмма СОРТИРОВКИ===============

Sortirovka PROC near

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

jne SortExit

cmp FlagPA,1

jne SortExit

cmp FlagCheckFin,1

jne SortExit

mov dl,7 ;7 сравнений для 1го;6-для второго......

lea si,Vremya1

mov ChangeNum1,0 ;1е число показывающее номер спортсмена для обмена данными

mov ChangeNum2,0 ;2е число показывающее номер спортсмена для обмена данными

SortCicl3: xor bx,bx

mov ax,si

mov di,ax

add di,6 ;в di-следущее время относительно находящегося в si

mov al,ChangeNum1

mov ChangeNum2,al

inc ChangeNum2

mov ch,dl

SortCicl2: mov bx,5 ;начинаем сравнивать с min2

mov cl,6

SortCicl1: mov al,[di][bx]

cmp [si][bx],al

jb SortNext2 ;если меньше то ничего не меняем и перходим к следующему времени

cmp [si][bx],al

je SortNext1 ;если равны то смотрим следущую цифру времени

;-------если больше то меняем местами-------------------

push bx

push cx

push dx

push si

push di

;---обмен результатом---

mov cx,6

mov bx,0

SortObmen1:mov al,[di][bx]

mov VremyaX[bx],al ;копируем во врем память VremyaX из 2го времени(di)

mov al,[si][bx]

mov [di][bx],al ;из si в di

mov al,VremyaX[bx]

mov [si][bx],al ;из VremyaX в si

inc bx

loop SortObmen1

;---обмен дорожкой---

mov ah,0

mov al,ChangeNum1

mov si,ax ;в si ChangeNum1

mov ah,0

mov al,ChangeNum2

mov di,ax ;в di ChangeNum2

mov al,NumberDorog[si]

mov NumberDorogX,al ;si в NumberDorogX

mov al,NumberDorog[di]

mov NumberDorog[si],al ;di в si

mov al,NumberDorogX

mov NumberDorog[di],al ;NumberDorogX в di

;---обмен фамилией---

lea si,ImageInd11 ;Fam1

mov ah,0

mov al,ChangeNum1

shl ax,6 ;Умножаем на 64-смещение относительно Fam1

add si,ax ;прибавляем смещение-выходим на начало адреса Fam1

lea di,ImageInd11 ;Fam2

mov ah,0

mov al,ChangeNum2

shl ax,6 ;Умножаем на 64-смещение относительно Fam2

add di,ax ;прибавляем смещение-выходим на начало адреса Fam2

mov cx,64

mov bx,0

SortObmen3:mov al,[si][bx]

mov ImageIndX,al ;сохраняем во врем память чтобы не переписать

mov al,[di][bx]

mov [si][bx],al

mov al,ImageIndX

mov [di][bx],al ;меняем местами побайтно

inc bx

loop SortObmen3

pop di

pop si

pop dx

pop cx

pop bx

jmp SortNext2 ;если обменяли то смотрим след. время

;------------------------------------------------------

SortNext1: dec bx ;переход к след цифре времени

dec cl

jnz SortCicl1

SortNext2: add di,6 ;переход к след. времени

inc ChangeNum2

dec ch

jnz SortCicl2

add si,6 ;переход к след. не отсортир. времени

inc ChangeNum1

dec dl ;меньше на одно сравнение

lea bx,Vremya8

cmp si,bx ;если si указывает на 8е время то все отсортировано

jne SortCicl3

mov FlagSortEnd,1

mov FlagPA,0

SortExit: pop di

pop si

pop dx

pop cx

pop bx

ret

Sortirovka ENDP

;======================================================

;========процедура вывода номеров мест=================

;si-начальный адрес NumberMesto

;dx-номер 1го порта для вывода

VivodNumMesto proc NEAR

push bx

push cx

push dx

push si

push di

cmp FlagSortEnd,1

jne VNMExit

xor bh,bh

mov cx,8

VNMCicl1: mov bl,[si]

mov al,VKZImages[bx]

out dx,al ;вывод iй дорожки

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

inc dx

loop VNMCicl1

VNMExit: pop di

pop si

pop dx

pop cx

pop bx

ret

VivodNumMesto endp

;=======================================================

;========процедура вывода номеров дорожек=================

;si-начальный адрес NumberDorog

;dx-номер 1го порта для вывода

VivodNumDorog proc NEAR

push bx

push cx

push dx

push si

push di

xor bh,bh

mov cx,8

VNDCicl1: mov bl,[si]

mov al,VKZImages[bx]

out dx,al ;вывод iй дорожки

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

inc dx

loop VNDCicl1

pop di

pop si

pop dx

pop cx

pop bx

ret

VivodNumDorog endp

;=======================================================

;=========Подпрограмма вывода времени на дисплеи===============

VivodVremya PROC near

push bx

push cx

push dx

push si

push di

cmp FlagStart,1

jne ViVrExit

;-------Вывод на индикаторы время/результат---------------

xor bx,bx

;-----------Вывод 1го спортсмена---

mov dx,Result1_Port_Out ;порт ms2

cmp FlagVremya1,1

jne ViResNext11

lea si,Vremya1[0] ;если флаг=1 то выводим результат

jmp ViResOut11 ;и прыгаем на вывод результата

ViResNext11:lea si,Taimer[0] ;если флаг=0 то выводим текущее время

ViResOut11:mov cx,6

ViResCicl11:mov bl,[si]

cmp cx,4

jne ViResT11

mov al,VKZImagesT[bx] ;если это 4й индикатор то выводим с точкой

jmp ViResT13

ViResT11: cmp cx,2

jne ViResT12

mov al,VKZImagesT[bx] ;если это 2й индикатор то выводим с точкой

jmp ViResT13

ViResT12: mov al,VKZImages[bx] ;все остальные без точки

ViResT13: out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

dec dx

loop ViResCicl11

;-----------Вывод 2го спортсмена---

mov dx,Result2_Port_Out

cmp FlagVremya2,1 ;Вывод 2го спортсмена

jne ViResNext22

lea si,Vremya2[0]

jmp ViResOut22

ViResNext22:lea si,Taimer[0]

ViResOut22:mov cx,6

ViResCicl22:mov bl,[si]

cmp cx,4

jne ViResT21

mov al,VKZImagesT[bx] ;если это 4й индикатор то выводим с точкой

jmp ViResT23

ViResT21: cmp cx,2

jne ViResT22

mov al,VKZImagesT[bx] ;если это 2й индикатор то выводим с точкой

jmp ViResT23

ViResT22: mov al,VKZImages[bx] ;все остальные без точки

ViResT23: out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

dec dx

loop ViResCicl22

;-----------Вывод 3го спортсмена---

mov dx,Result3_Port_Out

cmp FlagVremya3,1 ;Вывод 3го спортсмена

jne ViResNext33

lea si,Vremya3[0]

jmp ViResOut33

ViResNext33:lea si,Taimer[0]

ViResOut33:mov cx,6

ViResCicl33:mov bl,[si]

cmp cx,4

jne ViResT31

mov al,VKZImagesT[bx] ;если это 4й индикатор то выводим с точкой

jmp ViResT33

ViResT31: cmp cx,2

jne ViResT32

mov al,VKZImagesT[bx] ;если это 2й индикатор то выводим с точкой

jmp ViResT33

ViResT32: mov al,VKZImages[bx] ;все остальные без точки

ViResT33: out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

dec dx

loop ViResCicl33

;-----------Вывод 4го спортсмена---

mov dx,Result4_Port_Out

cmp FlagVremya4,1 ;Вывод 4го спортсмена

jne ViResNext44

lea si,Vremya4[0]

jmp ViResOut44

ViResNext44:lea si,Taimer[0]

ViResOut44:mov cx,6

ViResCicl44:mov bl,[si]

cmp cx,4

jne ViResT41

mov al,VKZImagesT[bx] ;если это 4й индикатор то выводим с точкой

jmp ViResT43

ViResT41: cmp cx,2

jne ViResT42

mov al,VKZImagesT[bx] ;если это 2й индикатор то выводим с точкой

jmp ViResT43

ViResT42: mov al,VKZImages[bx] ;все остальные без точки

ViResT43: out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

dec dx

loop ViResCicl44

;-----------Вывод 5го спортсмена---

mov dx,Result5_Port_Out

cmp FlagVremya5,1 ;Вывод 5го спортсмена

jne ViResNext55

lea si,Vremya5[0]

jmp ViResOut55

ViResNext55:lea si,Taimer[0]

ViResOut55:mov cx,6

ViResCicl55:mov bl,[si]

cmp cx,4

jne ViResT51

mov al,VKZImagesT[bx] ;если это 4й индикатор то выводим с точкой

jmp ViResT53

ViResT51: cmp cx,2

jne ViResT52

mov al,VKZImagesT[bx] ;если это 2й индикатор то выводим с точкой

jmp ViResT53

ViResT52: mov al,VKZImages[bx] ;все остальные без точки

ViResT53: out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

dec dx

loop ViResCicl55

;-----------Вывод 6го спортсмена---

mov dx,Result6_Port_Out

cmp FlagVremya6,1 ;Вывод 6го спортсмена

jne ViResNext66

lea si,Vremya6[0]

jmp ViResOut66

ViResNext66:lea si,Taimer[0]

ViResOut66:mov cx,6

ViResCicl66:mov bl,[si]

cmp cx,4

jne ViResT61

mov al,VKZImagesT[bx] ;если это 4й индикатор то выводим с точкой

jmp ViResT63

ViResT61: cmp cx,2

jne ViResT62

mov al,VKZImagesT[bx] ;если это 2й индикатор то выводим с точкой

jmp ViResT63

ViResT62: mov al,VKZImages[bx] ;все остальные без точки

ViResT63: out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

dec dx

loop ViResCicl66

;-----------Вывод 7го спортсмена---

mov dx,Result7_Port_Out

cmp FlagVremya7,1 ;Вывод 7го спортсмена

jne ViResNext77

lea si,Vremya7[0]

jmp ViResOut77

ViResNext77:lea si,Taimer[0]

ViResOut77:mov cx,6

ViResCicl77:mov bl,[si]

cmp cx,4

jne ViResT71

mov al,VKZImagesT[bx] ;если это 4й индикатор то выводим с точкой

jmp ViResT73

ViResT71: cmp cx,2

jne ViResT72

mov al,VKZImagesT[bx] ;если это 2й индикатор то выводим с точкой

jmp ViResT73

ViResT72: mov al,VKZImages[bx] ;все остальные без точки

ViResT73: out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

dec dx

loop ViResCicl77

;-----------Вывод 8го спортсмена---

mov dx,Result8_Port_Out

cmp FlagVremya8,1 ;Вывод 8го спортсмена

jne ViResNext88

lea si,Vremya8[0]

jmp ViResOut88

ViResNext88:lea si,Taimer[0]

ViResOut88:mov cx,6

ViResCicl88:mov bl,[si]

cmp cx,4

jne ViResT81

mov al,VKZImagesT[bx] ;если это 4й индикатор то выводим с точкой

jmp ViResT83

ViResT81: cmp cx,2

jne ViResT82

mov al,VKZImagesT[bx] ;если это 2й индикатор то выводим с точкой

jmp ViResT83

ViResT82: mov al,VKZImages[bx] ;все остальные без точки

ViResT83: out dx,al

out COMIns_Port_Out,al ;выводим эти же данные на большое табло

mov al,00000000b ;

out COMIns_Port_Out,al ;записываем WR=0 - передача данных

inc si

dec dx

loop ViResCicl88

;-------------------------------------

ViVrExit: pop di

pop si

pop dx

pop cx

pop bx

ret

VivodVremya ENDP

;======================================================

;=========Подпрограмма подготовки===============

Podgotovka PROC near

push bx

push cx

push dx

push si

push di

;------Подготовка для подпрограммы ввода Заплыва---------

mov VKZZnach,0

mov VKZZnach+1,0

;------Подготовка для подпрограммы ввода Фамилии---------

mov cx,8

lea si,VKFImageInd1

NN1: call ObnulImageInd

add si,8

loop NN1

mov cx,64

lea si,ImageInd11

NN2: call ObnulImageInd

add si,8

loop NN2

mov VKFKodKlav,0

call SaveConst

mov OldSledFam,0

mov NumTekInd,1

;------Подготовка для подпрограммы вывода Дорожек---------

lea si,NumberDorog

mov al,1

mov cx,8

NN4: mov [si],al

inc si

inc al

loop NN4

;------Подготовка для вывода Места---------

lea si,NumberMesto

mov al,1

mov cx,8

NN5: mov [si],al

inc si

inc al

loop NN5

;------Подготовка для подпрограммы вывода времени---------

mov OldStart,0

mov cx,48

lea si,Vremya1

NN3: mov byte ptr [si],0

inc si

loop NN3

mov Taimer[0],0 ;------Обнуление секундомера------------

mov Taimer[1],0

mov Taimer[2],0

mov Taimer[3],0

mov Taimer[4],0

mov Taimer[5],0

mov FlagVremya1,0 ;-----По-умолчанию-0-вывод времени

mov FlagVremya2,0

mov FlagVremya3,0

mov FlagVremya4,0

mov FlagVremya5,0

mov FlagVremya6,0

mov FlagVremya7,0

mov FlagVremya8,0

;------Подготовка для подпрограммы проверки финиша---------

mov FlagCheckFin,0

mov FlagStart,0

mov FlagPA,0

mov FlagSortEnd,0

;---------Инициализация адреса обработчика прерывания NMI----------------------

CLI ;запрет маскируемых прерываний

mov bx,00008h ;адрес ветора прерывания по NMI 00008h

lea ax,Timer ;запись offset

mov [bx],ax ;подпрограммы

mov ax,SEG Timer ;запись segment

mov [bx+2],AX ;подпрограммы по адресу вектора прерывания

STI ;разрешение маскируемых прерываний

;-------------------------------------------------------------------------------

;------Программирование интерфейса КР580ВВ51А---------

mov al,01001101b ;Программируем D7D6 01-длина стоп-бита:1, D5D4 00-нет контроля четности

out COM_CO_Out,al ;D3D2 11-длина слова 8 бит, D1D0 01-асинхронный режим 1:1

mov al,00000001b ;Программируем D0 1-передача информации возможна

out COM_CO_Out,al ;D2 0-прием информации невозможен

;--------------------------------------------------------

pop di

pop si

pop dx

pop cx

pop bx

ret

Podgotovka ENDP

;******************************************************************************************

;******************************МАКРОУРОВЕНЬ ПРОГРАММЫ**********************************

;******************************************************************************************

call Podgotovka

Start1: call VvodKlavZ ;Вводим заплыв

call VvodKlavF ;Вводим фамилии

call SteretFam ;опрашиваем кнопку стереть фамилию

call AnalisFam ;анализируем все кнопки и упорядочиваем фамилии для вывода

call PressStart ;анализ нажатия кнопки "Старт"

call OtschetVremya ;запуск таймера

in al,Finish_Port_In ;параметры

call VivodResult ;Считываем кнопки "Финиш"

call CheckFinish ;процедура проверки Финиша всех спортсменов

call PressPA ;анализ нажатия кнопки "проанализировать и отсортировать"

call Sortirovka ;процедура сортировки

lea si,NumberMesto ;параметры

mov dx,Mesto_Port_Out

call VivodNumMesto ;Выводим номера мест

lea si,NumberDorog ;параметры

mov dx,Dorog_Port_Out

call VivodNumDorog ;Выводим номера дорожек

call VivodFam ;выводим все фамилии

call VivodVremya ;Выводим время/результат

jmp Start1

;*********************************************************************************************

;*********************************************************************************************

;*********************************************************************************************

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

org RomSize-16-((SIZE InitData+15) AND 0FFF0h)

ASSUME cs:NOTHING

jmp Far Ptr Start

Code ENDS

END

Заключение

В результате выполнения данной курсовой работы, была спроектирована МПС, реализующая функцию электронного фотофиниша. В процессе разработки аппаратного обеспечения, был выполнен анализ ТЗ, который определил основные требования к устройству. На основании этих требований была спроектирована архитектура основных узлов МПС. Затем были созданы структурная, функциональная и принципиальная схемы устройства и был проведен расчет дискретных элементов. В процессе разработки программного обеспечения была выполнена декомпозиция общей задачи и построена статическая модель программы, определившая состав программных модулей, необходимых для решения поставленной задачи. После этого была разработана структура данных программы и выполнена ее алгоритмизация. Далее было выполнено кодирование разработанных алгоритмов на языке ассемблера.

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

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

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

  3. Комаров В. М. Микропроцессорные системы [Текст] : Учебное пособие / В. М. Комаров – Рыбинск: РГАТА, 2006. – 92 с.

  4. СТП 1.01 – 2002. Текстовые документы. Общие требования к оформлению учебных документов [Текст]. – введ. 2002 – 01 – 01. – Рыбинск : РГАТА, 2002. – 28 с.

  5. СТП 1.02 – 2002. Общие требования к оформлению учебных документов. Графические документы [Текст]. – введ. 2003 – 10 – 10. – Рыбинск : РГАТА, 2003. –31 с.

Приложение А

Приложение Б

Приложение В

Приложение Г

Приложение Д

Приложение Е

Приложение Ж

Приложение З

94