99735

Электронный фотофиниш

Курсовая

Информатика, кибернетика и программирование

Микропроцессорная система по своей структуре схожа с ПК, но имеет усеченный объем памяти и ограниченный набор средств сопряжения с внешним миром. В основе ее строения лежит программно-аппаратный принцип. Меняя программу, одну и туже стандартную МПС можно использовать во многих устройствах.

Русский

2016-10-10

3.75 MB

0 чел.

Федеральное агентство по образованию

РЫБИНСКАЯ ГОСУДАРСТВЕННАЯ АВИАЦИОННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ имени П. А. Соловьева

Факультет радиотехники, электроники и информатики

Кафедра вычислительных систем

КУРСОВОЙ ПРОЕКТ

по дисциплине

Микропроцессорные системы

на тему

«Электронный фотофиниш»

Студент группы

ВС-07

Лобов М.Е.

Руководитель

канд. техн. наук, проф.

Комаров В.М.

Рыбинск 2011

Содержание


Введение

Микропроцессоры и микропроцессорные системы внесли в развитие вычислительной техники качественно новые свойства. Целиком выполненные по интегральной технологии на миниатюрном кристалле, они легко встраиваются в станок,  электронные весы, кухонную печь, в автомобиль, светофор и во многие другие устройства, возможности которых могут быть существенно расширены благодаря применению такого «электронного мозга».

Микропроцессорная система по своей структуре схожа с ПК, но имеет усеченный объем памяти и ограниченный набор средств сопряжения с внешним миром. В основе ее строения лежит программно-аппаратный принцип. Меняя программу, одну и туже стандартную МПС можно использовать во многих устройствах.

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

1 Анализ технического задания 

На данном этапе вырабатываются требования, определяющее каким характеристикам должно соответствовать проектируемое устройство.

  1.  Функции устройства. Устройство должно обеспечивать:
  •  До 8ми участников в заплыве;
  •  Длина фамилии каждого участника – до 8ми литер;
  •  Номер заплыва от 0 до 99;
  •  Время/результат каждого участника в формате минуты:секунды:сотые доли секунды;
  •  Вывод места спортсмена по результатам финиша всего заплыва;
  •  Запуск таймера по кнопке «Старт» (до нажатия кнопки «Старт» отображаются нули;
  •  Фиксация в памяти результата спортсмена при нажатии кнопки «Финиш-Х», где X-номер дорожки;
  •  Сортировка спортсменов при нажатии кнопки «Сортировка».
  1.  Функциональный смысл входной и выходной информации;

Входная информация:

  •  Номер заплыва(вводится с клавиатуры);
  •  Фамилии каждого из участников(вводятся с клавиатуры);

    Выходная информация:

  •  Номер заплыва(отображаются на индикаторах);
  •  Номер дорожки;
  •  Фамилии каждого из участников(отображаются на индикаторах) ;
  •  Время/результат спортсменов в формате минуты:секунды:сотые доли секунды;
  •  Место спортсмена по результатам заплыва.
  1.  Типы устройств ввода/вывода и форма представления информации;

Устройства ввода:

  •  Цифровая клавиатура 2*5 для ввода номера заплыва;
  •  Цифровая клавиатура 4*8 для ввода фамилии спортсмена;
  •  Кнопки управления: «Старт», «Финиш-Х»(где Х-номер дорожки), «Ввести следующую фамилию», «Стереть текущую фамилию», «Проанализировать и отсортировать».

Устройства вывода:

  •  2 семисегментных индикаторов для отображения номера заплыва;
  •  8 семисегментных индикаторов для отображения номера дорожки;
  •  64 (8 фамилий * 8 литер) матричных индикатора для отображения фамилий спортсменов;
  •  48 (8 спортсменов * 6 индикаторов времени) семисегментных индикаторов для отображения времени/результата спортсмена;
  •  8 семисегментных индикаторов для отображения места спортсмена;
  •  Интерфейс ВВ51А для вывода информации на большое информационное табло.
  1.  Диапазон измерения и точность представления входной и выходной информации:
  •  Номер заплыва вводится в диапазоне от 0 до 99;
  •  Время/результат отображаются на 6 индикаторах (2 индикатора - минуты, 2 – секунды, 2 – сотые доли секунды), единица счета – 0,01 секунды, диапазон времени от 00:00:00 до 59:59:99;
  •  Кол-во литер фамилии от 0 до 8;
  1.  Системные требования;
  •  устранение дребезга контактов.
  1.  Необходимость контроля и типы обнаруживаемых ошибок;
  •  Невозможность ввода данных после нажатии кнопки «Старт»;
  •  Невозможность сортировки спортсменов до их финиша.
  1.  Особые случаи и реакция на них;
  •  При попытке ввода данных после нажатия кнопки «Старт» эти данные игнорируются;
  •  при попытке отсортировать спортсменов до финиша всех участников это действие игнорируется – сортировка не производится .


1.1 Представление устройства в виде «черного ящика»

Представление устройства в виде «черного ящика» изображено на рисунке 1.1.

Рисунок 1.1 – Представление устройства в виде черного ящика.


2 Разработка архитектуры системы

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

2.1 Архитектура процессора

Архитектуру процессора полностью определяет тип выбранного микропроцессора, так как К1810ВМ88 является однокристальным микропроцессором.

2.2 Архитектура памяти

Проектируемая МПС содержит два типа запоминающих устройств: оперативное запоминающее устройство (ОЗУ, подтип статическое ОЗУ), для хранения данных, которые часто меняют свои значения и перепрограммируемое постоянное устройство (ПЗУ), для хранения программы и данных.

Поскольку не требуется строгого разделения адресного пространства между ОЗУ и ПЗУ, ввиду их малого объема, то разделение производится на две равные половины,  размером 512 Кбайт с помощью старшей адресной линии А19.

Архитектура памяти приведена на рисунке 2.1. Необходимо учитывать, что ОЗУ должно располагаться по младшим адресам, а ПЗУ по старшим. Такое разграничение обусловлено тем, что ОЗУ содержит таблицу векторов прерываний, а ПЗУ точку входа в программу, которая располагается в последнем параграфе памяти (по адресу 0FFFF0h).

Рисунок 2.1 – Архитектура памяти проектируемой МПС.

2.3 Архитектура ввода/вывода

Для обмена с устройствами ввода/вывода выбрана синхронная структура интерфейса. Синхронный обмен выбран потому, что все устройства ввода/вывода проектируемой МПС всегда готовы к обмену.

Архитектура ввода представляет собой две клавиатуры(матричное включение): клавиатура цифр (0-9) для ввода номера заплыва и клавиатура букв (А-Я) для ввода фамилий спортсменов, а также кнопки управления(линейное включение). Архитектура ввода представлена на рисунках 2.2-2.4.

Рисунок 2.2 – Клавиатура букв (А-Я) для ввода фамилий спортсменов

Рисунок 2.3 – Клавиатура цифр (0-9) для ввода номера заплыва


Рисунок 2.4 – Кнопки управления

Архитектура вывода представлена на рисунках 2.5-2.6. Дисплей состоит из 66 семисегментных индикаторов и 64 матричных индикаторов, которые для уменьшения аппаратных затрат включены по схеме динамической подсветки.

Рисунок 2.5 – Подключение семисегментных индикаторов.

Рисунок 2.6 – Подключение матричных индикаторов.


3 Разработка аппаратного обеспечения устройства

В данном разделе описывается процесс разработки аппаратной части устройства. Разработка включает в себя следующие этапы:

  •  разработка структурной схемы – обобщенное представление структуры аппаратной части;
  •  разработка электрической функциональной схемы;
  •  разработка электрической принципиальной схемы;
  •  расчет дискретных элементов;

3.1 Структурная схема устройства

Структурная схема устройства представлена в приложении А.

3.2 Функциональная схема устройства

Функциональная схема устройства представлена в приложении Б.

3.3 Принципиальная схема устройства

Принципиальная схема устройства состоит из двух модулей, схемы которых представлены в приложении В.

3.4 Схема подключения модулей

Схема подключения модулей представлена в приложении Г.

3.5 Расчет дискретных элементов

На принципиальной схеме необходимо подать уровень логической единицы на пять входов:   (1 вход),  (2 входа),  (1 вход),  (1 вход). По второму закону Кирхгофа получим формулу для расчета уровня логической единицы:

(3.1)

Примем , ,  и подставим в формулу (3.1), получим:

(3.2)

На основе данных, полученных из формулы (3.2), выбран резистор : .

RC-цепь автоматического сброса рассчитывается по следующим формулам:

(3.3)

Примем ,  и подставим в формулу (3.3), получим:

,

где – временная константа;

(3.4)

Из формулы (3.4) следует: . Так как конденсаторы имеют меньший диапазон значений, сначала выберем конденсатор : . Соответственно сопротивление : .

Ниже рассчитываются дискретные элементы клавиатуры.

Для контура, когда ни одна кнопка не нажата:

(3.5)

Примем ,  и подставим в формулу (3.5), получим:

(3.6)

Для контура, когда нажата кнопка:

(3.7)

Примем , ,  и подставим в формулу (3.7), получим:

(3.8)

На основе данных формул (3.6) и (3.8) выбраны резисторы …:  и диоды ..: .

Так как кнопки управления и финиша спортсменов включены по схеме схожей со схемой включения кнопок клавиатуры, поэтому в соответствии с результатом формулы (3.6) резисторы …:.

Ниже рассчитываются дискретные элементы дисплея.

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

(3.9)

Из технических характеристик выбранных знакосинтезирующих индикаторов следует, что , всего индикаторов в дисплее , в каждом по  сегментов. Подставим значения в формулу (3.9):

(3.10)

Из (3.10) следует, что для транзисторов … , поэтому выбираем , у которого .

Рассчитаем сопротивление в цепи базы … транзисторов …:

(3.11)

Примем , , ,  и подставим в формулу (3.11), получим:

(3.12)

Таким образом, резисторы …: 

Транзисторы …, активируют отдельный сегмент на знакосинтезирующем индикаторе. При динамической индикации ток через один сегмент рассчитывается по формуле:

(3.13)

При , получим:

(3.14)

Из (3.14) следует, что для транзисторов … , поэтому выбираем  с .

Резисторы , ,  …  , ,  ограничивают ток через сегмент.

По второму закону Кирхгофа:

(3.15)

Примем ,  и подставим в формулу (3.15), получим:

(3.16)

На основе данных (3.16) выбраны резисторы , ,  …  , , : .

Резисторы , ,  …  , ,  создают рабочий ток базы. По второму закону Кирхгофа:

(3.17)

и подставим в (3.17), получим:

(3.18)

На основе данных формулы (3.18) выбраны резисторы , ,  …  , , : С2-23-0,125-1 кОм ± 10 %

Транзисторы .. осуществляют выбор матричного индикатора.

Поскольку схема включения динамическая,  то анодный ток рассчитывается по следующей формуле:

(3.19)

Из технических характеристик выбранных индикаторов следует, что , всего индикаторов в дисплее , в каждом по  сегментов. Подставим значения в формулу (3.9):

(3.20)

Из (3.20) следует, что для транзисторов .. , поэтому выбираем , у которого .

Рассчитаем сопротивление в цепи базы … транзисторов ..:

(3.21)

Подставим значения и получим:

(3.22)

Таким образом, резисторы …:

Транзисторы ..осуществляют выбор столбца/сроки матричного индикатора. При динамической индикации ток через один сегмент рассчитывается по формуле:

(3.23)

При , получим:

(3.24)

Из (3.24) следует, что для транзисторов .. , поэтому выбираем , у которого .

Резисторы , ,  …  , ,  ограничивают ток через сегмент.

По второму закону Кирхгофа:

(3.25)

Примем ,  и подставим в формулу (3.25), получим:

(3.26)

На основе данных (3.26) выбраны резисторы , ,  …  , , : .

Резисторы , ,  …  , ,  создают рабочий ток базы. По второму закону Кирхгофа:

(3.27)

и подставим в (3.27), получим:

(3.28)

На основе данных формулы (3.28) выбраны резисторы , ,  …  , , : С2-23-0,25-100 Ом ± 10 %


3.6 Интерфейс ВВ51А

По условиям технического задания устройство должно включать в себя интерфейс для вывода информации на большое информационное табло. Для этого была выбрана микросхема КР580ВВ51А – универсальный синхронно-асинхронный приемопередатчик, предназначенный для аппаратной реализации последовательного протокола обмена. Микросхема преобразует параллельный код, получаемый от центрального процессора в последовательный поток символов. Условное графическое обозначение приведено на рис. 3.1

Рисунок 3.1 – Условное графическое обозначение КР580ВВ51А

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

Подключение выводов мс КР580ВВ51А показано на рисунке 3.2

Рисунок 3.2 – Подключение выводов мс КР580ВВ51А

Адресация интерфейса осуществляется подачей на вход CO/D адресного выхода AB4. Соответсвенно адрес при записи инструкции COM_CO_Out = 0010h (0001 0000b), при передаче данных COM_D_Out = 0000h (0000 0000b).

Программирование интрерфейса осуществляется следующим образом:

1) Записываем инструкцию режима:

Для этого подаем следующие сигналы на вход мс:

CO/D = 1(записываем инструкцию), WR = 0 (активируем вход записи), CS=0, SR=0. И по шине данных передаем код инструкции режима, в нашем случае:

биты D7D6=01 – устанавливаем длину стоп-бита 1;

биты D5D4=00 – нет контроля четности;

биты D3D2=11 – длина слова 8 бит;

биты D1D0=10 – асинхронный режим работы 1:1.

2) Записываем инструкцию команды:

Для этого подаем следующие сигналы на вход мс:

CO/D = 1(записываем инструкцию), WR = 0 (активируем вход записи), CS=0, SR=0. И по шине данных передаем код инструкции команды, в нашем случае:

бит D0=1 – передача информации возможна;

бит D2=0 – прием информации невозможен(т.к. нам необходимо только передавать информацию);

остальные биты =0 – нас в данном случае не интересуют.

 

Код программирования интерфейса:

 mov   al,01001101b

 out   COM_CO_Out,al

 mov   al,00000001b

 out   COM_CO_Out,al

Код вывода данных:

mov   al,VKZImages[bx]

out   COM_D_Out,al


4 Представление программы устройства в виде «черной сферы»

 

Представление программы проектируемой МПС в виде «черной сферы» приведено на рисунке 4.1.

Рисунок 4.1 – Представление программы в виде «черной сферы».


5 Статическая модель программы

Первый этап декомпозиции приведен в приложении Д;

Второй этап декомпозиции приведен в приложении Е;

Третий этап декомпозиции приведен в приложении Ж;

Статическая модель системы приведена в приложении З.


6 Структура данных

Наименование данных

Символьное имя

Формат данных

Кодирование данных

Примечание

D7

D6

D5

D4

D3

D2

D1

D0

Адрес порта для активации матр. индикатора

Nind

Слово

0

0

0

0

0

0

0

1

1й индикатор

Адрес порта для активации строки в матр. индикаторе

Nstr

Слово

0

0

0

0

0

0

0

1

1я строка

Адрес порта для активации столбца в матр. индикаторе

Nstolb

Слово

0

0

0

0

0

0

0

1

1й столбец

Переменная для хранения признака нажата ли кнопка "Следующая фамилия"

OldSledFam

байт

0

0

0

0

0

0

0

0

Не нажата

0

0

0

0

0

0

1

0

Нажата

Переменная для хранения признака нажата ли кнопка "Старт"

OldStart

байт

0

0

0

0

0

0

0

0

Не нажата

0

0

0

0

0

0

0

1

Нажата

Номер текущей вводимой фамилии

NumTekInd

байт

0

0

0

0

0

0

0

1

1я фамилия

Образы 8ми фамилий для вывода на матричные индикаторы

ImageInd11

Массив байт

*

*

*

*

*

*

*

*

Данные 1го индикатора

*

*

*

*

*

*

*

*

ImageInd88

*

*

*

*

*

*

*

*

Данные 64го индикатора

Время спортсменов

Vremya1

Массив байт

*

*

*

*

*

*

*

*

Время 1го спортсмена

*

*

*

*

*

*

*

*

Vremya8

*

*

*

*

*

*

*

*

Время 8го спортсмена

Флаг остановки времени спортсменов

FlagVremya1

Массив байт

0

0

0

0

0

0

0

0

Выводится Время

FlagVremya8

0

0

0

0

0

0

0

1

Выводится Результат

Номера дорожек

NumberDorog

Массив байт

*

*

*

*

*

*

*

*

Данные о номерах дорожек

Номера мест

NumberMesto

Массив байт

0

0

0

0

0

0

0

1

1е место

0

0

0

0

1

0

0

0

8е место

Флаг финиша всех спортсменов

FlagCheckFin

байт

0

0

0

0

0

0

0

0

Еще не все финишировали

0

0

0

0

0

0

0

1

Все финишировали

Номер заплыва

VKZZnach

Массив байт

*

*

*

*

*

*

*

*

2 байта для вывода цифр на индикаторы

Код клавиатуры цифр

VKZKeyboard

Массив байт

*

*

*

*

*

*

*

*

Код клавиатуры цифр

Предыдущее значение клавиши из клавиатуры цифр

VKZOldZnach

Массив байт

*

*

*

*

*

*

*

*

Данные о предыдущем значении клавиши из клавиатуры цифр

Код клавиатуры букв

VKFKeyboard

Массив байт

*

*

*

*

*

*

*

*

Данные клавиатуры букв

Смещение для нажатой клавиши

VKFKodKlav

байт

0

0

0

0

0

0

0

0

Код смещения буквы "А"

Предыдущее значение нажатой клавиши

VKFOldZnach

Массив байт

*

*

*

*

*

*

*

*

Данные о предыдцщем значении нажатой клавиши

Образы для букв русского алфавита

VKFImage1

Массив байт

*

*

*

*

*

*

*

*

Данные образа букв русского алфавита

*

*

*

*

*

*

*

*

VKFImage32

*

*

*

*

*

*

*

*

Образы для вывода одной фамилии на 8 матр. индикаторов

VKFImageInd1

Массив байт

*

*

*

*

*

*

*

*

Данные образы для вывода одной фамилии на 8 матр. индикаторов

*

*

*

*

*

*

*

*

VKFImageInd8

*

*

*

*

*

*

*

*

Адрес текущей введенной буквы

VKFAddrTekBukv

Слово

*

*

*

*

*

*

*

*

Данные об адресе текущей введенной буквы

Таймер

Taimer

Массив байт

*

*

*

*

*

*

*

*

Данные о текущем времени таймера

Переменная для обмена данными для первого спортсмена

ChangeNum1

байт

*

*

*

*

*

*

*

*

 

Переменная для обмена данными для второго спортсмена

ChangeNum2

байт

*

*

*

*

*

*

*

*

 

Переменная для обмена данных времени

VremyaX

Массив байт

*

*

*

*

*

*

*

*

 

Переменная для обмена данных дорожек

NumberDorogX

байт

*

*

*

*

*

*

*

*

 

Переменная для обмена данных фамилий

ImageIndX

байт

*

*

*

*

*

*

*

*

 

Коды цифр для 7сегментного индикатора

VKZImages

Массив байт

1

1

1

1

1

1

1

1

Цифра "0"

Коды цифр для 7сегментного индикатора

VKZImagesT

Массив байт

1

0

1

1

1

1

1

1

Цифра "0."

Флаг нажатия кнопки "Старт"

FlagStart

байт

0

0

0

0

0

0

0

0

Кнопка "Старт" не нажата

0

0

0

0

0

0

0

1

Кнопка "Старт" нажата

Флаг нажатия кнопки "Проанализировать и отсортировать"

FlagPA

байт

0

0

0

0

0

0

0

0

Кнопка "Проанализировать и отсортировать" не нажата

0

0

0

0

0

0

0

1

Кнопка "Проанализировать и отсортировать" нажата

Флаг окончания программы Сотрировки

FlagSortEnd

байт

0

0

0

0

0

0

0

0

Сортировки не было

0

0

0

0

0

0

0

1

Сортировка была


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 с.


Приложение А

Приложение Б

Приложение В

Приложение Г

Приложение Д


Приложение Е


Приложение Ж


Приложение З


 

А также другие работы, которые могут Вас заинтересовать

62412. Общество как система. Подсистемы общества и их взаимосвязь 280.21 KB
  Подсистемы общества и их взаимосвязь Время 2 часа Вопросы: Общество как целостная динамичная система. Краткая характеристика подсистем общества и их взаимосвязь Первый вопрос: Общество как целостная динамичная система Социология наука изучающая общество.
62414. ПОНЯТИЕ ОБЩЕСТВЕННОГО ПРОГРЕССА 27.5 KB
  Общественный прогресс – совокупность всех поступательных изменений в обществе, его развитие от простого к сложному, переход с более низкого уровня на более высокий. Периоды развития общества: прогресс (от лат. progressus – движение вперед) – направление развития, для которого характерен переход от низшего к высшему...