- •1 Анализ технического задания
- •1.1 Представление устройства в виде «черного ящика»
- •2 Разработка архитектуры системы
- •2.1 Архитектура процессора
- •2.2 Архитектура памяти
- •2.3 Архитектура ввода/вывода
- •3.6 Интерфейс вв51а
- •4 Представление программы устройства в виде «черной сферы»
- •5 Статическая модель программы
- •6 Структура данных
- •7 Алгоритмы
- •7.1 Алгоритмы макроуровня
- •7.2 Алгоритмы исполнителей
- •8 Исходный текст программы
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
Заключение
В результате выполнения данной курсовой работы, была спроектирована МПС, реализующая функцию электронного фотофиниша. В процессе разработки аппаратного обеспечения, был выполнен анализ ТЗ, который определил основные требования к устройству. На основании этих требований была спроектирована архитектура основных узлов МПС. Затем были созданы структурная, функциональная и принципиальная схемы устройства и был проведен расчет дискретных элементов. В процессе разработки программного обеспечения была выполнена декомпозиция общей задачи и построена статическая модель программы, определившая состав программных модулей, необходимых для решения поставленной задачи. После этого была разработана структура данных программы и выполнена ее алгоритмизация. Далее было выполнено кодирование разработанных алгоритмов на языке ассемблера.
Список использованных источников
Комаров В. М. Микропроцессорные системы. Проектирование аппаратного и программного обеспечения [Текст] : Учебное пособие. – 2 изд., перераб. И доп. / В. М. Комаров – Рыбинск: РГАТА, 2004. – 175 с.
Комаров В. М. Микропроцессорные системы. Программирование на ассемблере [Текст] : Учебное пособие. – 2 изд., перераб. И доп. / В. М. Комаров – Рыбинск: РГАТА, 2004. – 163 с.
Комаров В. М. Микропроцессорные системы [Текст] : Учебное пособие / В. М. Комаров – Рыбинск: РГАТА, 2006. – 92 с.
СТП 1.01 – 2002. Текстовые документы. Общие требования к оформлению учебных документов [Текст]. – введ. 2002 – 01 – 01. – Рыбинск : РГАТА, 2002. – 28 с.
СТП 1.02 – 2002. Общие требования к оформлению учебных документов. Графические документы [Текст]. – введ. 2003 – 10 – 10. – Рыбинск : РГАТА, 2003. –31 с.
Приложение А
Приложение Б
Приложение В
Приложение Г
Приложение Д
Приложение Е
Приложение Ж
Приложение З
