95103

Бортовое информационное табло для городского транспорта

Курсовая

Коммуникация, связь, радиоэлектроника и цифровые приборы

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

Русский

2015-09-20

4.03 MB

3 чел.

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

Рыбинская государственная авиационная технологическая академия имени П. А. СОЛОВЬЕВА

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

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

Курсовой проект

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

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

на тему

«Бортовое информационное табло для городского транспорта»

Студент группы ВС2 – 06  ……………………………… Винокурова М. А.

  (Подпись, дата)   

Руководитель канд. техн. наук, проф. ……………………   Комаров В. М.

 (Подпись, дата)

Нормоконтролер канд. техн. наук, проф. ………………..   Комаров В. М.

 (Подпись, дата)

Рыбинск  2010

Содержание

[1] Введение

[2] 4.1 Представление программы в виде «черной сферы»

[3] Рисунок 4.2 – Представление программы работы бортового информационного табло в виде «черной сферы»

[3.1] 4.2 Декомпозиция программы

[3.2]
4.3 Разработка структуры данных программы

[3.3] 4.4 Алгоритмизация программы

[3.4] 4.5 Кодирование программы

[4]
5 Руководство пользователя

[5]
Заключение

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

[7]
Приложение А

[8] Приложение Б

 

Введение

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

Процесс проектирования микропроцессорных систем содержит две ветви (разработка программных средств и разработка аппаратных средств), которые могут выполняться параллельно. При этом решается задача целесообразного разделения функций по обработке информации между аппаратурой и программой. Разработка МПС - достаточно трудоемкий процесс, сопряженный с трудностями отладки аппаратных и программных средств, а затем комплексной отладки всей системы. Эффективность этого процесса напрямую зависит от грамотности  и опыта разработчика.

Настоящий курсовой проект позволяет получить достаточные знания для освоения микропроцессоров К1810ВМ86/ВМ88 и применения их в разработках микропроцессорных систем.


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

МПС, как и любое устройство вычислительной техники, выполняет некоторое преобразование входной информации с целью получения требуемого результата. Разрабатываемое бортовое информационное табло для городского транспорта может быть представлено в виде «черного ящика» (рисунок 1.1). Такое представление позволяет четко выделить входную и выходную информацию МПС и осмыслить поставленную задачу.

Рисунок 1.1 – Представление бортового информационного табло в виде «черного ящика»

Необходимо точно сформулировать требования к разрабатываемому устройству.

1. Функции устройства.

Устройство должно обеспечивать:

  1.   работу в двух режимах – работа и редактирование;
  2.   запись информации о маршруте, остановках, а также другой информации в соответствующее место в памяти (в режиме редактирования);
  3.   модификацию адресов памяти, по которым располагается необходимая информация;
  4.   отображение информации о маршруте, остановках, а также другой введенной информации (в режиме работы) в зависимости от режима работы;
  5.   задание режима работы.

2. Функциональный смысл входной и выходной информации.

Входная информация имеет следующий смысл:

  1.   числовая информация, определяющая вводимые символы в соответствии с их кодами;
  2.   информация о режиме работы – работа или редактирование;
  3.   информация о режиме работы – I, II, III, каждый из которых соответствует определенной информации;
  4.   управление редактируемой информацией – перемещение по редактируемой строке, а также выбор нужной строки.

Выходная информация имеет следующий смысл:

  1.   визуальное отображение информации, соответствующей выбранному маршруту (в режиме работы);
  2.   визуальное отображение редактируемой информации (в режиме редактирования);
  3.   индикация режима работы устройства.

3. Типы устройств ввода/вывода и форма представления информации.

В качестве устройства ввода использовать:

  1.   клавиатуру типа «матрица сухих контактов»;
  2.   кнопку без фиксации для ввода сигнала перехода к следующей остановке.

В качестве устройств вывода использовать:

  1.   для отображения номера маршрута, информации об остановках, времени и стоимости проезда, другой введенной информации – матричные индикаторы;
    1.   для отображения режима работы – двоичные индикаторы (светодиоды).

4. Диапазон изменения и точность представления входной и выходной информации.

Диапазон изменения информации:

  1.   Объем вводимых в одну выбранную строку данных – не более 8 байт;
    1.  Количество остановок в маршруте – не более 30;
      1.  Количество хранимых маршрутов – не более 50;
      2.  Входные сигналы о режимах работы однобитные;
      3.  Выходной сигнал о режимах работы однобайтный.

Точность представления информации в данной задаче не имеет смысла.

5. Системные требования.

  1.   Ввод информации (текста сообщения) в выбранное поле в позицию курсора (поддержка смещения курсора на одну позицию влево, вправо);
    1.   Отображение одного символа в одном матричном индикаторе;
      1.   Период следования информации при вводе не менее – 0,1 с;
      2.   Устранение дребезга клавиатуры.

6. Необходимость контроля и типы обнаруживаемых ошибок.

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

7. Особые случаи и реакция на них.

При возникновении ошибки включения двух или более клавиш клавиатуры на матричные индикаторы информационного табло выводится сообщение об ошибке. При вводе неверного кода символа отображаемая на индикаторах информация не изменяется.

8. Лицевая панель устройства.

Анализируя сформулированные требования, не представляет труда изобразить эскиз лицевой панели устройства, приведенный на рисунке 1.2. Он дает наглядное представление об элементах ввода/вывода, с которыми должна взаимодействовать программа, и позволяет чётко определить порядок работы с разрабатываемым устройством.

Рисунок 1.2 – Лицевая панель бортового информационного табло

  1.  Разработка архитектуры устройства

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

Поскольку основой любой МПС является микроЭВМ, то разработка ее архитектуры сводится к разработке архитектуры процессора, архитектуры памяти и архитектуры интерфейса (ввода/вывода).

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

Архитектура процессора полностью определяется типом используемого микропроцессора. Поскольку тип микропроцессора К1810ВМ88 задан, то архитектура процессора полностью определена (рисунок 2.1). 

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

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

Архитектура памяти представлена на рисунке 2.2. Система строится на базе процессора ВМ88, поэтому память организуется в виде одного банка. В состав банка входят ПЗУ и ОЗУ.  Распределение адресного пространства между ПЗУ и ОЗУ осуществляется с помощью одной старшей линии адреса  А19.  ОЗУ располагается по младшим, а ПЗУ  по старшим адресам. Из архитектуры памяти следует, что ОЗУ выбирается при А19=0, а ПЗУ – при А19=1.

Рисунок 2.2 – Архитектура памяти

2.3 Архитектура интерфейса

Архитектура интерфейса разрабатывается на основе схемы представления устройства в виде «черного ящика» (рисунок 1.1). Поскольку эта схема полностью определяет номенклатуру внешних устройств, то остается лишь выбрать соответствующие порты ввода/вывода и методы обмена данными с этими устройствами, определить разрядность внешних устройств и распределить их по разрядам портов ввода/вывода.

Ввод данных будем осуществлять с клавиатуры типа «матрица сухих контактов» размером 4×5, поскольку в устройстве используется 20 функциональных клавиш. Для этого используются два порта – KbdPort и  InPort.  Механизм сканирования клавиатуры следующий: активируется одна из строк клавиатуры портом вывода KbdPort путем подачи на нее нулевого уровня. Все остальные строки должны быть пассивны, это обеспечивается путем подачи на них с порта вывода KbdPort единичных уровней. Затем производится ввод состояния активной строки через порт ввода InPort. Если в активной строке есть включенная кнопка, то на соответствующем столбце будет нулевое значение за счет соединения его со строкой. Полная информация о состоянии клавиатуры считывается перебором всех ее строк. Код нажатой кнопки формируется программно.

Кнопка «Signal» является одноразрядным устройством ввода. Поскольку у порта ввода InPort заняты не все разряды, то возможно подключить эту кнопку к свободному входу данного порта.

Возможно использование одного или нескольких информационных табло в одном транспортном средстве. Значение с кнопки «Signal» необходимо подавать на каждое из них. Для этого в каждом табло будет установлен разъем, через который и будет получено значение с кнопки. Соответствующая схема соединения изображена на рисунке 2.3.

Рисунок 2.3 – Схема соединения

Для отображения символьной информации будем использовать матричные индикаторы размером 8×8 точек. Для вывода информации на них будем использовать динамическую индикацию с целью уменьшения количества портов вывода. Для динамической индикации подобного числа индикаторов необходимо 5 портов вывода: 3 порта активации индикаторов (это порты DispPort2, DispPort3, DispPort4) и 2 информационных порта (DispPort0 и DispPort1).

Для отображения информации о режиме работы устройства будем использовать двоичные индикаторы. Это одноразрядные устройства вывода.  Они подключаются к выходам порта вывода OutPort.

С учетом вышесказанного можно изобразить архитектуру интерфейса. На рисунке 2.4 изображена архитектура ввода, на рисунке 2.5 – архитектура вывода информации на двоичные индикаторы, на рисунке 2.6 – архитектура вывода информации на матричные индикаторы. Данная архитектура  показывает подключение всех внешних устройств к портам ввода/вывода. На архитектуре приведены символьные имена всех портов, которые будут использованы в программе для обращения к этим портам. Разработанная архитектура устройства является основой для проектирования его аппаратного и программного обеспечения.

Рисунок 2.4 – Архитектура ввода

Рисунок 2.5 – Архитектура вывода информации на двоичные индикаторы

Рисунок 2.6 – Архитектура вывода информации на матричные индикаторы

 

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

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

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

  1.  разработка структурной схемы устройства;
  2.  разработка функциональной схемы устройства;
  3.  разработка принципиальной схемы устройства;
  4.  расчет дискретных элементов.

На разработку электрических схем основное влияние оказывает используемая элементная база. Основная элементная база определяется типом микропроцессора. Поскольку тип микропроцессора К1810ВМ88 указан в задании, то в качестве основной элементной базы для построения устройства будем использовать микросхемы МПК БИС К1810, к которому относится этот микропроцессор.

3.1 Разработка структурной электрической схемы

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

Центральный процессор (ЦП) является основной частью устройства, так как именно он производит обработку входных и формирование выходных сигналов, а также непосредственно управляет всеми остальными блоками системы. Управление производится с помощью  шины управления (ШУ), по линиям которой передаются управляющие сигналы для других устройств. Данные для обработки и ее результаты передаются между ЦП и другими частями системы по шине данных (ШД), а адресация памяти и периферийных устройств, производится адресными линиями шины адреса (ША).  В качестве ЦП будем использовать микропроцессор ВМ88, что определяет использование однобайтной ШД.

ОЗУ необходимо для хранения данных в процессе работы устройства. Необходимый объем запоминающего устройства – 2 Кбайта. Таким образом, на ОЗУ, от ЦП, поступают: адрес (адресные линии А0..А10 с ША), строб чтения из памяти MEMR и строб записи в память MEMW с ШУ. Также подведена двунаправленная шина данных D0..D7.

В ПЗУ хранится программа, по которой осуществляется работа ЦП и всей системы в целом, а также данные, сохранность которых должна обеспечиваться при отключенном питании. Требуемый объем – 64 Кбайта, который определяется объемом программного кода и объемом хранимых данных. Сюда так же, как и в ОЗУ, от ЦП поступает адрес по ША (адресные линии A0..A15). Чтение из памяти осуществляется при помощи строба чтения MEMR, запись в память – при помощи строба MEMW.  Данные передаются по ШД (линии D0..D7). Разделение адресного пространства между ОЗУ и ПЗУ происходит за счет адресной линии А19.

В совокупности ЦП, ОЗУ и ПЗУ составляют микроЭВМ, которая связана с устройствами ввода/вывода посредством интерфейса. Все внешние устройства: кнопки управления, клавиатура, двоичные и матричные индикаторы – подключены к интерфейсу в нераскрытом виде. К интерфейсу подводятся адресные линии с ША, двунаправленная ШД D0..D7, строб чтения IOR  и строб записи IOW.

Разработанная структурная схема – КП.МПС.58.00Э1.

3.2 Разработка функциональной электрической схемы

Функциональная схема устройства разрабатывается в соответствии со структурной схемой.

Для разрабатываемой системы достаточно использования минимального режима работы МП ВМ88. Тогда в состав процессора, кроме МП (CPU), должны входить генератор тактовых импульсов (SG), адресный регистр-защелка (RGA), шинные буферы (BD), дешифратор управляющих сигналов (DC) и цепь автоматического сброса.

Задающий генератор SG обеспечивает формирование тактовой импульсной последовательности CLK, обеспечивающей функционирование всего устройства. Кроме того, он формирует сигнал готовности READY, поступающий на вход микропроцессора CPU, и сигнал системного сброса RESET, который используется для установки микропроцессора в начальное состояние после включения устройства.

Для формирования сигналов управления системной шиной служит дешифратор DC. Он формирует сигналы MEMR – чтение из памяти, MEMW – запись в память, IOR – ввод из портов интерфейса, IOW – вывод в порты интерфейса.

Для демультиплексирования шины адреса/данных (линии AD0 – AD7) и буферирования шины адреса системы необходим регистр-защелка (RGA), который обеспечивает хранение адреса в течение всего цикла шины МП. На выходе регистра формируется буферированная шина адреса BA19 – BA0, к которой подключаются устройства памяти и множество портов интерфейса.

Шину данных необходимо буферировать. Это позволяет подключить к ней элементы памяти и множество портов ввода/вывода. Для этой цели используем буфер данных BD. Передача данных через буфер осуществляется по стробу данных DEN, а направление передачи определяется сигналом OP/IP. На выходах буфера формируется буферированная шина данных, через которую и передаются данные от всех блоков устройства.

Память устройства реализована на функциональных элементах FlashMemory и RAM. FlashMemory представляет собой репрограммируемое ПЗУ с электрическим стиранием и записью информации, а RAM статическое ОЗУ. Разрядность шины адреса ПЗУ равна 16 (адресация ячеек памяти производиться с помощью адресных линий А0..А15), а ОЗУ – 11 (адресация ячеек памяти производиться с помощью адресных линий А0..А10). Это определяется их объемом в 64 Кбайта и 2 Кбайта соответственно.  Распределение адресов между ОЗУ и ПЗУ производиться с помощью адресной линии А19. При А19=1 происходит обращение к ПЗУ, а при А19=0 происходит обращение к ОЗУ.

Операции чтения и записи стробируются сигналами MEMR и MEMW.  ИМС RAM и ROM объединены по линиям данных и через общий шинный формирователь подключены к шине данных. Буфер данных предназначен для соблюдения гальванического и ёмкостного согласования ЗУ с системной шиной.

Для ввода информации предназначены клавиатура и кнопка «Signal», а для вывода – матричные и двоичные индикаторы. Все порты ввода/вывода  и их подключение к внешним устройствам соответствуют ранее разработанной архитектуре интерфейса устройства (рисунки 2.4, 2.5, 2.6). Для удобства на функциональной схеме приведены символьные имена всех портов и соответствующие им номера.

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

Сигналы обращения к портам формируются с помощью логических элементов И. Поскольку на входы этих элементов все сигналы обращения поступают в инверсной форме, а для их работы необходимо представление сигналов в прямой форме, то на каждом входе логических элементов показано дополнительное инвертирование входных сигналов. Сигналы обращения к портам ввода поступают на их входы выборки EO в инверсной форме, а к портам вывода – на входы записи STB в прямой форме, что соответствует уровням активности этих входов.

Выходы портов вывода и входы портов ввода подключены к устройствам вывода и устройствам ввода соответственно.

Для реализации часов реального времени используется интервальный таймер (PIT). С его выхода OUT0 сигнал будет поступать на вход прерываний процессора. Для обеспечения работы таймера нужно сначала загрузить в него управляющее слово, а затем данные. Выбор куда именно поступает информация в данный момент осуществляется при помощи входов адреса А0 и А1.

Разработанная функциональная схема – КП.МПС.58.00Э2.

3.3 Разработка принципиальных электрических схем

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

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

 

Принципиальная схема модуля обработки информации

 

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

Для построения процессора в основном использованы элементы МПК БИС К1810.

Системный генератор SG реализован на микросхеме К1810ГФ84 (DD1), микропроцессор CPU – на микросхеме К1810ВМ88 (DD3), дешифратор управляющих сигналов DС – на микросхеме К555ИД7 (DD7), адресный регистр RGA – на микросхемах К1810ИР82 (DD8,  DD9,  DD10), буфер данных – на микросхеме К1810ВА86 (DD4). Цепь автоматического сброса реализована на элементах R2, C2, VD1. Элементы R2, C2 представляют собой интегрирующую цепь, обеспечивающую плавное нарастание напряжения на входе RES генератора SG. Выбирая соответствующим образом постоянную времени этой цепи можно обеспечить заданную длительность сигнала сброса RESET (необходимо, чтобы длительность первоначального сигнала сброса была не менее 50 мкс). Диод VD1 служит для быстрого восстановления состояния цепи автоматического сброса при кратковременном пропадании питающего напряжения.

Для построения ПЗУ использована микросхема AT49F512 (DD11), а для построения ОЗУ – микросхема К537РУ25А (DD12).

Порты ввода/вывода реализованы на микросхемах К1810ИР82. При этом порты ввода представляют собой следующие микросхемы: InPortDD14. Порты вывода построены на следующих микросхемах: OutPortDD15, KbdPortDD16, DispPort0DD17, DispPort1DD18, DispPort2DD19, DispPort3DD20, DispPort4DD21.

Для выборки портов ввода/вывода использованы микросхемы К555ЛЕ1 (DD5, DD13). Эти элементы являются элементами ИЛИ с инверсным выходом, но за счет двойственности логических элементов реализуют логическую операцию И для инверсно кодированных входных сигналов. Для порта ввода необходим активный единичный уровень на входе STB, поэтому нужно проинвертировать полученное значение  с помощью элемента НЕ (DD6).

Для инвертирования линии ВА19 при обращении к ПЗУ используется оставшийся свободным логический элемент НЕ (DD6.2).

Для формирования временных интервалов используется программируемый интервальный таймер ВИ54 (DD2). Для его выбора используем адресный разряд А8. С помощью А7 будем выбирать канал 0 либо управляющую команду. Так, чтобы загрузить в таймер управляющее слово, необходимо подать на шину адреса значение FEFFh, а для выбора канала 0 нужно значение FE7Fh. Запуск таймера осуществляется подачей 1 на вход G0 (вход разрешения счета). Декрементирование константы происходит каждый раз при получении  логической  единицы на вход тактовых сигналов (CLK0). При достижении нуля, на выходе счетчика/таймера (OUT0) формируется логическая единица и поступает на вход прерывания микропроцессора NMI.

Все элементы принципиальной схемы модуля обработки информации соединены в соответствии с функциональной схемой.

Для передачи всех сигналов, внешних по отношению к модулю обработки информации, используется разъем СНП58-64/919В-23-2В (Х1), представляющий собой 64-контактный разъем для печатного монтажа. В модуле обработки информации используется вилка этого разъема.

Для уменьшения высокочастотных помех в шине питания на каждый корпус микросхем памяти и процессора ставится керамический конденсатор (C4..C6) емкостью 0,1мкФ, для других корпусов микросхем, используемых в данном устройстве,  ставятся   керамический конденсатор (C7..C9) емкостью 68000пФ на 4-5 корпусов микросхем.

Разработанная принципиальная схема – КП.МПС.58.01Э3.

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

В состав принципиальной схемы устройства входит модуль обработки информации, включаемый в разъем СНП58-64/919В-23-2В (Х1). Здесь используется розетка этого разъема.

Интерфейс устройства содержит 22 матричных индикатора. К ним подключены транзисторы: VT1 – VT8 – выбор индикатора; VT9 – VT206 – передача данных. В качестве двоичных индикаторов используются светодиоды (VD1…VD6). Светодиоды зажигаются логической единицей.  

Диоды VD7…VD10 предотвращают замыкание выходов порта вывода при одновременном включении кнопок одного столбца.

Для подключения внешних источников питания используется 4х контактный разъем  для объемного монтажа 2РМ 14/4/1 (Х2). Вилка этого разъема устанавливается на корпусе прибора.

С целью исключения ошибок при подключении внешних цепей к разрабатываемому устройству необходимо использовать разъемы разного типа для разных цепей. Поэтому подключение кнопки «Signal» осуществляется через 3-контактный разъем СРЦ 14/3 (Х3). Розетка этого разъема устанавливается на корпусе прибора.

Разработанная принципиальная схема – КП.МПС.58.00Э3.

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

Выберем кварцевый резонатор, определяющий рабочую частоту устройства в соответствии с выражением . Отсюда следует, что частота кварцевого резонатора выбирается исходя из требуемой рабочей частоты устройства. Как правило, более критичными по быстродействию являются элементы памяти. Для выбранных ПЗУ и ОЗУ время выборки адреса нс  и  нс  соответственно. Для нормальной работы максимальное из них должно быть меньше периода задающей частоты . Тогда получим, что . Отсюда . Исходя из этого, выберем . Тогда . Возьмем кварцевый резонатор РК169МВ-7АП-15МГц.  Последовательно с кварцевым резонатором включен конденсатор С1 на 10пФ, служащий для компенсации индуктивности резонатора и снятия с него постоянной составляющей напряжения. Выберем конденсатор КМ-5б-П33-10пФ±5%.

Рассчитаем элементы цепи автоматического сброса. Длительность импульса, формируемая этой цепью при первоначальном включении должна составлять не менее 50 мкс. Это обеспечивается выбором постоянной времени τ=. Найдем эту постоянную из формулы . Подставляя  , получим  Выберем значение R2=100 K, тогда С2=τ/R2=10 мкФ. Из справочника выбираем резистор С2-23-0,125-100кОм 5 %, а в качестве конденсатора – конденсатор К53-14-25В-10мкФ 10 %. Для быстрого разряда конденсатора и восстановления исходного состояния цепи автоматического сброса при пропадании напряжения питания используется диод КД522 (VD1).

Резистор R3 задает уровень логической единицы на входах микросхем. Его значение рассчитывается из условия обеспечения этого уровня при протекании через него входного тока подключенных к нему входов микросхем. Формула для вычисления, полученная из уравнения Кирхгофа . Подставляя в эту формулу известные Е=5 В, =2,4 В, =20 мкА,  n=4, получим резистор R3<32 К. Выберем резистор С2-23-0,125-10кОм  5 %.

На схеме устройства необходимо рассчитать резисторы R15 – R19 для ограничения тока светодиодных индикаторов VD1 - VD6. По второму закону Кирхгофа для одноконтурной цепи можно записать . Отсюда . Для выбранного светодиода АЛ307БМ  ICB=10 мА, UCB=2 В. Тогда R = (5 – 2 ) *1000 / 10 = 300 Ом. В качестве резисторов R215 – R219 выберем резисторы С2-23-0,125-330 Ом  5 %.

В качестве устройства ввода выступают кнопки, подключенные по матричной схеме. Диоды VD7 – VD10 (КД522А) предотвращают замыкание выходов порта вывода при одновременном включении кнопок одного столбца. Ток через диоды ограничивают резисторы R220 – R224. Произведем их расчет. Резисторы должны удовлетворять условиям:

,

.

Таким образом, в качестве резисторов  R220 – R224 выберем резисторы       С2-23-0,125-10 кОм 5%.

В схеме динамической индикации полный цикл обслуживания индикаторов занимает время равное kTи секунд, где k – количество столбцов, а Tи – время включения одного столбца. С энергетической точки зрения одинаковая яркость свечения сегмента при динамической и статической индикации обеспечивается при равенстве динамической Wдин и статической Wстат энергий, выделяемых током в светящемся элементе в пределах цикла обслуживания индикаторов, поэтому импульсный ток, протекающий через один светодиод, равен:

.

Расчет транзисторов VT9 – VT30.

Они осуществляют выбор конкретного индикатора. Их расчет имеет вид: , т.е. в качестве VT9..VT30 берем транзисторы КТ720А (IK MAX = 1.5 A,  ß=20, UБ-Э нас = 0,5 В, UК-Э нас = 0,6 В).

.

Таким образом, номиналы резисторов R9..R30 в цепях базы транзисторов рассчитываются следующим образом:

т.е. R9..R30 – резисторы С2-23-0,125-75Ом5%.

Расчет транзисторов VT31 – VT206.

Они  осуществляют выбор столбца индикатора, и их расчет имеет вид:

, т.е. в качестве VT31..VT206 берем транзисторы КТ720А.

.

Таким образом, номиналы резисторов R31..R206 в цепях базы транзисторов рассчитываются следующим образом:

т.е. R31..R206 – резисторы С2-23-0,125-68Ом5%.

Расчет транзисторов VT1 – VT8.

Транзисторы VT1 – VT8 выступают в качестве усилителей, берем ГТ403А (IK MAX = 1,25A, ß=20, UБ-Э нас = 0,8В, UК-Э нас = 0,5 В). Рассчитаем номиналы резисторов R1 - R8:

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

 

Таким образом, R1 – R8 – резистор С2-23-0,125-27Ом5%

Номиналы резисторов в цепи эмиттера R207 – R214:

Таким образом, R207 – R214 – резистор С2-23-0,125-11Ом5%.

3.5 Расчет потребляемой мощности

Таблица 3.1

Элементы

Параметры

Мощность одного элемента

мВт

Количество элементов

Мощность всех однотипных элементов

мВт

Формула

U, B

I, A

РПОТР=I*U

К1810ГФ84:

5

0,1400

700,000

1

700,000

К1810ВМ88:

5

0,3400

1700,000

1

1700,000

К1810ИР82:

5

0,1600

800,000

11

8800,000

К1810ВА86:

5

0,1600

800,000

1

800,000

КР537РУ25А:

5

0,0550

275,000

1

275,000

AT49F512:

5

0,0300

150,000

1

150,000

КР1531ИД7:

5

0,0280

140,000

1

140,000

КР1531ЛН1:

5

0,0153

76,500

1

76,500

КР1531ЛЕ1:

5

0,0130

65,000

2

130,000

К1810ВИ54:

5

0,1700

850,000

1

850,000

U, B

R, Ом

РПОТР=U2/R

С2-23-0,125-1К

5

1000

25

1

25

С2-23-0,125-100К

5

100000

0,25

1

0,25

С2-23-0,125-10К

5

10000

2,5

1

2,5

Суммарная мощность блока микроЭВМ (мВт):

13649,25

IК, А

UИНД

Pпотр=UИНД *IК

АЛС347А

0,08

2,4

192,000

22

4224,000

I, А

R, Ом

РПОТР=I2*R

С2-23-0,125-27Ом

0,004

27

0,432

8

3,456

С2-23-0,125-75Ом

0,053

75

210,675

22

4634,85

С2-23-0,125-68Ом

0,053

68

191,012

176

33618,112

Окончание таблицы 3.1

Элементы

Параметры

Мощность одного элемента,

мВт

Количество элементов

Мощность всех однотипных элементов,

мВт

С2-23-0,125-11К

0,08

11

70,4

8

563,2

С2-23-0,125-330Ом

0,010

330

33

5

165

С2-23-0,125-10кОм

0,002

10000

40

5

200

IК, А

UКЭ, В

Pпотр=UКЭ *IК

КТ720А

1,061

0,6

636,6

8

5092,8

КТ720А

1,061

0,6

636,6

22

14005,2

ГТ403А

0,08

0,5

40

176

7040

IПР, А

UПР, В

РПОТР=IПР*UПР

КД522А

0,1

1

100

4

400

АЛ307БМ

0,01

2

20

6

120

Суммарная мощность модуля устройства (без микроЭВМ) (мВт):

70066,618

Суммарная мощность устройства (мВт):

83715,868

Таким образом суммарная мощность потребляемая устройством Р=83,7 Вт


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

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

Программа представляет собой некоторый функциональный преобразователь, реализующий заданную функцию преобразования  входных данных  в требуемый результат . В общем случае программу можно представить в виде «чёрной сферы» (рисунок 4.1). 

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

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

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

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

4.2 Декомпозиция программы

Анализируя требования к программе, получим исходную схему представления поставленной задачи, приведенной на рисунке 4.3.

Рисунок 4.3 – Исходная схема представления задачи «Бортовое информационное табло для городского транспорта»

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

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

Рисунок 4.4 – Статическая модель программы «Бортовое информационное табло для городского транспорта»

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

Подзадача «Рабочий процесс» является сложной и требует дальнейшей декомпозиции. Для простоты целесообразно представить его в виде двух подзадач: «Обработка входной информации» и «Обработка выходной информации» (рисунок 4.5).

Рисунок 4.5 – Статическая модель программы «Бортовое информационное табло для городского транспорта» (после первого этапа декомпозиции)

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

Статическая модель программы после второго этапа декомпозиции приведена на рисунке 4.6.

Подзадача «Ввод с кнопки» осуществляет анализ состояния кнопки и установку соответствующего флага в заданное значение.

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

Подзадача «Вывод информации о режимах» выполняет вывод информации из набора «Информация о режимах» на двоичные индикаторы.

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

Подзадача «Формирователь информации» в зависимости от состояния управляющих признаков, считываемых их набора данных «Информация о режимах», формирует адреса, буферные данные или записывает введенные данные по запомненному адресу в рабочую область памяти.

Подзадача «Формирователь массивов отображения» формирует по полученным буферным данным массивы отображения в форме, которая необходима для вывода на матричные индикаторы.

Подзадача «Вывод информации» выводит символьную информацию из массивов отображения на матричные индикаторы.

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

Анализируя выделенные в результате второго этапа декомпозиции подзадачи (рисунок 4.6), можно сделать вывод, что все они имеют четко определенные функции и не требуют дальнейшей детализации.

Следовательно, декомпозиция программы «Бортовое информационное табло для городского транспорта» выполнена полностью, в результате чего построена ее статическая модель, представленная на рисунке 4.6.

Рисунок 4.6 – Статическая модель программы «Бортовое информационное табло для городского транспорта» (после второго этапа декомпозиции)


4.3 Разработка структуры данных программы

Разработка структуры данных программы сводится к четкому представлению всех данных, входящих в наборы данных статической модели.

Из статической модели программы проектируемого устройства (рисунок 4.6) следует, что данные в ней представлены следующими наборами:

– «Образ кнопки»;

– «Образ клавиатуры»;

– «Очередная цифра»;

– «Очередной символ»;

– «Информация о режимах»;

– «Флаг ошибки клавиатуры»;

– «Флаг неактивной клавиатуры»;

– «Флаг неверного кода символа»;

– «Флаг секунды»;

– «Данные в памяти»;

– «Адреса»;

– «Буферные данные»;

– «Массивы отображения».

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

Результаты разработки структуры данных программы проектируемого устройства приведены в таблице 4.1.

Таблица 4.1 – Структура данных программы «Устройство управления световой рекламой»

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

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

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

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

Примечание

D7

D6

D5

D4

D3

D2

D1

D0

Кнопка I

FirstBtn

Флаговый байт

0

0

0

0

0

0

0

0

Не нажата

0

0

0

0

0

0

0

1

Нажата

Кнопка II

SecondBtn

Флаговый байт

0

0

0

0

0

0

0

0

Не нажата

0

0

0

0

0

0

0

1

Нажата

Кнопка III

ThirdBtn

Флаговый байт

0

0

0

0

0

0

0

0

Не нажата

0

0

0

0

0

0

0

1

Нажата

Работа/Редакти-рование

Edit

Флаговый байт

0

0

0

0

0

0

0

0

Работа

0

0

0

0

0

0

0

1

Редактирование

Кнопка

EditLeft

Флаговый байт

0

0

0

0

0

0

0

0

Пассивно

0

0

0

0

0

0

0

1

Нажата

Кнопка

EditRight

Флаговый байт

0

0

0

0

0

0

0

0

Пассивно

0

0

0

0

0

0

0

1

Нажата

Кнопка Tab

EditTab

Флаговый байт

0

0

0

0

0

0

0

0

Пассивно

0

0

0

0

0

0

0

1

Нажата

Кнопка <l

LeftStation

Флаговый байт

0

0

0

0

0

0

0

0

Пассивно

0

0

0

0

0

0

0

1

Нажата

Кнопка l>

RightStation

Флаговый байт

0

0

0

0

0

0

0

0

Пассивно

0

0

0

0

0

0

0

1

Нажата

Кнопка Save

Save

Флаговый байт

0

0

0

0

0

0

0

0

Пассивно

0

0

0

0

0

0

0

1

Нажата

Образ клавиатуры

KbdImage

Массив байтов

-

-

-

1

1

1

1

1

Строка 0

-

-

-

1

1

1

1

1

Строка 1

-

-

-

1

1

1

1

1

Строка 2

-

-

-

1

1

1

1

1

Строка 3

Образ кнопки

BtnImage

Флаговый байт

0

0

0

0

0

0

0

0

Пассивно

0

0

0

0

0

0

0

1

Нажата

Очередная цифра

NextDig

Байт

0

0

0

0

0

0

0

1

Цифра «1»

Очередной символ

NextSymb

Байт

0

0

0

1

0

0

0

1

Символ «А»

Адрес начала маршрута

Addr

Слово

*

*

*

*

*

*

*

*

Младший байт

*

*

*

*

*

*

*

*

Старший байт

Адрес след. остановки

AddrNextStation

Слово

*

*

*

*

*

*

*

*

Младший байт

*

*

*

*

*

*

*

*

Старший байт

Вспомогательн. адрес 1

HelpAddr1

Слово

*

*

*

*

*

*

*

*

Младший байт

*

*

*

*

*

*

*

*

Старший байт

Вспомогательн. адрес 2

HelpAddr2

Слово

*

*

*

*

*

*

*

*

Младший байт

*

*

*

*

*

*

*

*

Старший байт

Буферные данные для 2 индикаторов

BufData2

2 байта

*

*

*

*

*

*

*

*

Младший байт

*

*

*

*

*

*

*

*

Старший байт

Буферные данные для 4 индикаторов

BufData4

4  байтa

0

0

0

1

0

0

0

0

Младший байт

.

.

.

.

.

.

.

.

0

0

0

0

0

0

0

1

Старший байт

Буф. данные для первых 8 индикаторов

BufData8_1

8  байт

0

0

1

0

1

0

0

1

Младший байт

.

.

.

.

.

.

.

.

0

0

1

0

1

0

0

0

Старший байт

Буф. данные для вторых 8 индикаторов

BufData8_2

8  байт

0

0

0

1

0

0

0

0

Младший байт

.

.

.

.

.

.

.

.

0

0

1

0

0

1

1

0

Старший байт

Данные в памяти

RomData

Массив байтов

*

*

*

*

*

*

*

*

Объем 32 Кбайт

.

.

.

.

.

.

.

.

*

*

*

*

*

*

*

*

Окончание таблицы 4.1

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

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

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

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

Примечание

D7

D6

D5

D4

D3

D2

D1

D0

Массив отображения для 2 индикаторов

DataDisp2

16 байтов

*

*

*

*

*

*

*

*

Младший байт

.

.

.

.

.

.

.

.

*

*

*

*

*

*

*

*

Старший байт

Массив отображения для 4 индикаторов

DataDisp4

32  байтa

*

*

*

*

*

*

*

*

Младший байт

.

.

.

.

.

.

.

.

*

*

*

*

*

*

*

*

Старший байт

Массив отобр. для первых 8 индикаторов

DataDisp8_1

64 байта

*

*

*

*

*

*

*

*

Младший байт

.

.

.

.

.

.

.

.

*

*

*

*

*

*

*

*

Старший байт

Массив отобр. для вторых 8 индикаторов

DataDisp8_2

64  байта

*

*

*

*

*

*

*

*

Младший байт

.

.

.

.

.

.

.

.

*

*

*

*

*

*

*

*

Старший байт

Ошибка ввода с клавиатуры

KbdErr

Флаговый байт

0

0

0

0

0

0

0

0

Нет ошибки

0

0

0

0

0

0

0

1

Ошибка

Пустая клавиатура

EmpKbd

Флаговый байт

0

0

0

0

0

0

0

0

Непустая кл-ра

0

0

0

0

0

0

0

1

Клав-ра пуста

Неверный код символа

SymErr

Флаговый байт

0

0

0

0

0

0

0

0

Верный код

0

0

0

0

0

0

0

1

Неверный код

Флаг секунды

FlagInt

Флаговый байт

0

0

0

0

0

0

0

0

Не прошла

0

0

0

0

0

0

0

1

Секунда прошла

Флаги представляют собой флаговые байты, которые могут принимать 2 значения. При наличии ситуации, соответствующей названию флага, флаговый байт принимает активное значение (код 01h), а при отсутствии – пассивное значение (код 00h).

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

4.4 Алгоритмизация программы

Для решения поставленной задачи необходимы следующие программные модули:

– «Функциональная подготовка» (FuncPrep);

– «Ввод с кнопки» (BtnInput);

– «Ввод с клавиатуры» (KbdInput);

– «Контроль ввода с клавиатуры» (KbdContr);

– «Преобразование информации о режимах» (InfModeTrf);

– «Вывод информации о режимах» (InfModeOut);

– «Вывод сообщения об ошибке» (ErrMesOut);

– «Преобразование очередной цифры» (NxtDigTrf);

– «Формирователь символа» (SymbolForm);

– «Формирователь информации» (InfoForm);

– «Формирователь массивов отображения» (DispForm);

– «Формирователь времени» (TimeForm);

– «Вывод информации» (InfOut).

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

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

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

Построенная с учетом этого ГСА программы приведена на рисунке 4.7.

Рисунок 4.7 – Алгоритм программы «Бортовое информационное табло для городского транспорта» (одноуровневое представление)

Недостатком приведенной ГСА является ее одноуровневый характер, не позволяющий получить четко структурированную документацию. Для устранения этого недостатка необходимо перейти к двухуровневой ГСА, представленной на рисунке 4.8. В этом случае на макроуровне располагаются лишь вызовы программных исполнителей, а сами исполнители находятся на нижнем уровне управления.

Рисунок 4.8 – Алгоритм программы «Бортовое информационное табло для городского транспорта» (двухуровневое представление)

1. Модуль «Ввод с кнопки» (BtnInput)

Задачей этого модуля является считывание состояния кнопки «Signal», формирование в соответствии с ним значения флага BtnInput. Данный алгоритм представлен на рисунке 4.9 в форме ГСА.

Рисунок 4.9 – Алгоритм модуля «Ввод с кнопки»:

а) общий алгоритм; б) алгоритм гашения дребезга контактов


2. Модуль «Ввод с клавиатуры» (
KbdInput)

Задачей этого модуля является считывание состояния клавиатуры с формированием ее образа в памяти. Считывание информации с клавиатуры сводится к последовательному выбору ее строк и вводу их состояния в память. Эта идея реализована в ГСА модуля KbdInput, приведенной на рисунке 4.10.

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

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

3. Модуль «Контроль ввода с клавиатуры» (KbdContr)

Этот модуль предназначен для анализа информации, считанной с клавиатуры, и формирования флага ошибки ввода. При этом интересует факт включения более одной и ни одной кнопки клавиатуры. Необходимо подсчитать количество активных битов в наборе данных «Образ клавиатуры» и сравнить результат с интересующим числом. Эта идея реализована в ГСА модуля KbdContr, приведенной на рисунке 4.11.

Рисунок 4.11 – Алгоритм модуля «Контроль ввода с клавиатуры»

4. Модуль «Преобразователь информации о режимах» (InfModeTrf)

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

Эта идея реализована в ГСА модуля InfModeTrf, приведенной на рисунке 4.11. Преобразование не должно выполняться при наличии ошибки ввода с клавиатуры. Поэтому флаг KbdErr, информирующий об этой ситуации, является управляющим ключом на выполнение модуля. При активном состоянии этого флага модуль преобразования не выполняется, и управление передается сразу же на его выход. В противном случае осуществляется заданное преобразование.

Рисунок 4.12 – Алгоритм модуля «Преобразование информации о режимах»

5. Модуль «Вывод информации о режимах» (InfModeOut)

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

ГСА модуля приведена на рисунке 4.13.

 

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


6. Модуль «Вывод сообщения об ошибках» (
ErrMesOut)

Задачей  этого модуля является вывод на матричные индикаторы сообщения об ошибке на основании анализа признаков ошибок ввода с клавиатуры.

ГСА модуля ErrMesOut приведена на рисунке 4.14.

Рисунок 4.14 – Алгоритм модуля «Вывод сообщения об ошибке»

7. Модуль «Преобразование очередной  цифры» (NxtDigTrf).

Этот модуль осуществляет преобразование единично-шестнадцатеричного кода очередной введенной цифры из набора KbdImage в двоичный код.

ГСА модуля приведена на рисунке 4.15.

Рисунок 4.15 – Алгоритм модуля «Преобразование очередной цифры»

8. Модуль «Формирователь символа» (SymbolForm).

Этот модуль осуществляет соединение кодов двух последовательно введенных цифр в один код символа.

ГСА модуля приведена на рисунке 4.16.

Рисунок 4.16 – Алгоритм модуля «Формирователь символа»

9. Модуль «Формирователь массивов отображения» (DispForm).

Этот модуль предназначен для распаковки буферных данных в форму, удобную для вывода на матричные индикаторы.  Процесс осуществляется циклически.

ГСА модуля приведена на рисунке 4.17.

Рисунок 4.17 – Алгоритм модуля «Формирователь массивов отображения»

10. Модуль «Вывод информации» (InfOut).

Этот модуль служит для вывода информации из массивов отображения на матричные индикаторы. Применяется метод динамической индикации.

ГСА модуля приведена на рисунке 4.18.

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

11. Модуль «Формирователь времени» (TimeForm).

Этот модуль служит для реализации работы часов реального времени.

ГСА модуля приведена на рисунке 4.19.

Рисунок 4.19 – Алгоритм модуля «Формирователь времени»

12. Модуль «Формирователь информации» (InfoForm).

Этот модуль наиболее сложен. Он обеспечивает формирование в различных режимах адреса, буферных данных и массива данных в памяти.

ГСА модуля приведена на рисунке 4.20.

Рисунок 4.20 – Алгоритм модуля «Формирователь информации» (первая часть)

Рисунок 4.20 – Алгоритм модуля «Формирователь информации» (вторая часть)

13. Модуль «Функциональная подготовка» (FuncPrep)

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

Для определенности в подготовке будем устанавливать режим работы в состояние «Редактирование», а также «I,II,III режимы не выбраны». Кроме того, установим адрес маршрута на адрес первого маршрута в памяти.

ГСА модуля FuncPrep приведена на рисунке 4.21.

Рисунок 4.21 – Алгоритм модуля «Функциональная подготовка»

4.5 Кодирование программы

В соответствии с разработанной архитектурой, структурами данных и алгоритмами произведено кодирование программы (приложение А).


5 Руководство пользователя

Работа устройства начинается после его включения. Исходный режим устройства – режим редактирования. Переключение режима осуществляется с помощью кнопки «Edit».

Управление работой устройства осуществляется следующими клавишами:

– сдвиг курсора влево;

– сдвиг курсора вправо;

Tab – переход к редактированию другой (из двух) строки;

Save – сохранение введенных данных;

l> – переход к редактированию следующей остановки;

<l – переход к редактированию предыдущей остановки;

I – выбор первого режима;

II – выбор второго режима;

III – выбор третьего режима;

Кнопка Signal – переход к отображению следующей остановки.

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

Состояние системы отражается на двоичных индикаторах.


Заключение

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

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

В процессе работы над данным курсовым проектом были освоены основы проектирования МПС.


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

  1.  Комаров, В. М. Микропроцессорные системы. Проектирование аппаратного и программного обеспечения [Текст]: Учебное пособие. – 2 изд., перераб. и доп. – Рыбинск: РГАТА, 2004. – 176 с.
  2.  Комаров, В. М. Микропроцессорные системы [Текст]: Учебное пособие. – Рыбинск: РГАТА, 2006. – 92 с.
  3.  СТП 1.01 – 2002. Общие требования к оформлению учебных документов. Текстовые документы [Текст]. – Введ. с 01.02.2003. – 28 с.
  4.  Микропроцессоры и микропроцессорные комплекты интегральных микросхем: Справочник. В 2 т./В.-Б.Б.Абрайтис, Н.Н. Аверьянов, А.И. Белоус и др.; Под ред. В.А. Шахнова.-М.: Радио и связь,1988.-т.1.-386 с.
  5.  Транзисторы для аппаратуры широкого применения: Справочник / К.М. Брежнева, Е.И. Гантман, Т.И. Давыдова и др. Под ред. Б.Л. Перельмана. – М.: Радио и связь, 1981. – 656с., ил.


Приложение А

(обязательное)

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

.386

RomSize    EQU   64*1024

InPort  =0FFFEh  ; ввод с клавиатуры и кнопки

OutPort  =0FFFEh  ; вывод на двоичные индикаторы

KbdPort =0FFFDh  ; активация строк клавиатуры

DispPort0 =0FFFBh  ; активация строк матричного инд-ра

DispPort1 =0FFF7h  ; активация столбцов матричного инд-ра

DispPort2 =0FFEFh  ; выбор матричного индикатора

DispPort3 =0FFDFh  ; выбор матричного индикатора

DispPort4 =0FFBFh  ; выбор матричного индикатора

PitDataPort =0FE7Fh  ; для данных интервального таймера

PitUPort =0FEFFh  ; для управления интервальным таймером

nmax        =50   ; константа гашения дребезга

maxkolm =50   ; максимальное число маршрутов

addrm  =508   ; количество байт в одном маршруте

IntTable   SEGMENT AT 0 use16

IntTable   ENDS

Data1   SEGMENT AT 100h use16

firstbtn   db    ?     ; структура данных программы

secondbtn  db    ?

thirdbtn   db    ?

edit       db    ?

editleft   db    ?

editright  db    ?

edittab    db    ?

leftstation db   ?

rightstation db  ?

save       db    ?

kbdimage   db    4 dup (?)

btnimage   db    ?

nextdig    db    ?

nextsymb   db    ?

symflag    db    ?

notsymin   db    ?

addr       dw    ?

addrnextstation dw ?

helpaddr1  dw    ?

helpaddr2  dw    ?

bufdata2   db    2 dup (?)

bufdata4   db    4 dup (?)

bufdata8_1 db   8 dup (?)

bufdata8_2 db   8 dup (?)

datadisp2  db    16 dup(?)

datadisp4  db    32 dup (?)

datadisp8_1 db  64 dup (?)

datadisp8_2 db  64 dup (?)

empkbd     db    ?

kbderr     db    ?

flagtab    db    ?

flag       db    ?

flag8      db    ?

flagint   db    ?

KolInt   dw    ?

SecKolInt     dw    ?

flaged     db    ?

stationcount db  ?

numberm    dw    ?

chisloostaddr db ?

symerr     db    ?

tmSec      db    ?

tmMin      db    ?

tmHor      db    ?

tmSec8     db    ?

Data1       ENDS

Data2   SEGMENT AT 0F0000h use16

kolm       dw    ?

romdata    db    32768 dup (?)   ;формируемые данные

chisloostanovok db 40 dup (?)

Data2   ENDS

Stk      SEGMENT AT 500h use16

          dw    100 dup(?)

StkTop     Label word

Stk      ENDS

Code       SEGMENT use16

          ASSUME cs:Code,ds:Data1,es:Data2,ss:stk

Letters  db 00000000b,01111110b,11111111b,10000001b,10000001b,11111111b,01111110b,00000000b

db 00000000b,00000000b,00000000b,10000110b,11111111b,11111111b,10000000b,00000000b

db 00000000b,11000011b,11100011b,11110001b,11011001b,11001111b,11000111b,00000000b

db 00000000b,11000011b,11000011b,10011001b,10011001b,11111111b,11100111b,00000000b

db 00000000b,00111000b,00111100b,00100110b,00100011b,11111111b,11111111b,00000000b

db 00000000b,10001111b,10001111b,10001001b,10001001b,11111001b,11111001b,00000000b

db 00000000b,01111110b,11111111b,10001001b,10001001b,11111001b,01110000b,00000000b

db 00000000b,00000001b,00000001b,11110001b,11111001b,00001111b,00000111b,00000000b

  db 00000000b,01110110b,11111111b,10001001b,10001001b,11111111b,01110110b,00000000b

db 00000000b,00001110b,10011111b,10010001b,10010001b,11111111b,01111110b,00000000b

db 00000000b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b

db 00000000b,11111100b,00100010b,00100001b,00100001b,00100010b,11111100b,00000000b

db 00000000b,11111111b,10001001b,10001001b,10001001b,10001001b,01110001b,00000000b

db 00000000b,11111111b,10001001b,10001001b,10001001b,10001110b,11111000b,00000000b

db 00000000b,11111111b,00000001b,00000001b,00000001b,00000001b,00000011b,00000000b

db 00000000b,11000000b,01111110b,01000001b,01000001b,01111110b,11000000b,00000000b

db 00000000b,11111111b,10001001b,10001001b,10001001b,10001001b,10000001b,00000000b

db 00000000b,11000011b,00100100b,00011000b,01111110b,00011000b,00100100b,11000011b

db 00000000b,01000010b,10000001b,10001001b,10001001b,10001001b,01110110b,00000000b

db 00000000b,11111111b,01000000b,00100000b,00010000b,00001000b,11111111b,00000000b

db 00000000b,11111111b,01000000b,00100001b,00010001b,00001000b,11111111b,00000000b

db 00000000b,11111111b,00001000b,00010100b,00100010b,01000001b,10000000b,00000000b

db 00000000b,11100000b,00010000b,00001000b,00000100b,00000010b,11111111b,00000000b

db 00000000b,11111111b,00000010b,00001100b,00001100b,00000010b,11111111b,00000000b

db 00000000b,11111111b,00010000b,00010000b,00010000b,00010000b,11111111b,00000000b

db 00000000b,01111110b,10000001b,10000001b,10000001b,10000001b,01111110b,00000000b

db 00000000b,11111111b,00000001b,00000001b,00000001b,00000001b,11111111b,00000000b

db 00000000b,11111111b,00010001b,00010001b,00010001b,00010001b,00001110b,00000000b

db 00000000b,01111110b,10000001b,10000001b,10000001b,10000001b,01000010b,00000000b

db 00000001b,00000001b,00000001b,11111111b,00000001b,00000001b,00000001b,00000000b

db 00000000b,10000111b,10001000b,10010000b,10010000b,01010000b,00111111b,00000000b

db 00000000b,00011100b,00100010b,00100010b,11111111b,00100010b,00100010b,00011100b

db 00000000b,11000011b,00100100b,00011000b,00011000b,00100100b,11000011b,00000000b

db 00000000b,01111111b,01000000b,01000000b,01000000b,01111111b,11000000b,00000000b

db 00000000b,00001111b,00010000b,00010000b,00010000b,00010000b,11111111b,00000000b

db 00000000b,11111111b,10000000b,10000000b,11111110b,10000000b,10000000b,11111111b

db 01111111b,01000000b,01000000b,01111110b,01000000b,01000000b,01111111b,11000000b

db 00000000b,00000001b,11111111b,10001000b,10001000b,10001000b,01110000b,00000000b

db 00000000b,11111111b,10001000b,10001000b,01110000b,00000000b,11111111b,00000000b

db 00000000b,11111111b,10001000b,10001000b,10001000b,10001000b,01110000b,00000000b

db 00000000b,10001001b,10001001b,10001001b,10001001b,10001001b,01111110b,00000000b

db 00000000b,11111111b,00001000b,01111110b,10000001b,10000001b,01111110b,00000000b

db 00000000b,10000110b,11001001b,01101001b,00111001b,00011001b,11111111b,00000000b

db 00000000b,00000000b,11000000b,11000000b,00000000b,00000000b,00000000b,00000000b

db 00000000b,00000000b,00000000b,11001100b,11001100b,00000000b,00000000b,00000000b

 db 00000000b,11111110b,00000100b,00000010b,00000010b,00000010b,00000100b,00000000b

                       

; ОПИСАНИЕ ПРОГРАМНЫХ МОДУЛЕЙ

btninput PROC NEAR   ;подмодуль «ввод с кнопки»

          mov btnimage,0

          mov dx,InPort

          in al,dx

          call vibrdestr

          and al,80h

          cmp al,00h

          jnz bi1

          mov btnimage,1

bi1:     ret

btninput ENDP

vibrdestr PROC NEAR   ;подмодуль «Гашение дребезга»

vd1:    mov ah,al

          mov bh,0

vd2:    in al,dx

          cmp ah,al

          jne vd1

          inc bh

          cmp bh,10

          jne vd2

          mov al,ah

          ret

vibrdestr ENDP

kbdinput PROC NEAR   ;модуль «Ввод с клавиатуры»

         lea si,kbdimage   ;загрузка адреса 

          mov cx,length kbdimage  ;счетчика циклов 

         mov bl,0feh   ;и номера исходной строки   

ki4:    mov al,bl       

         mov dx, KbdPort      

         out dx,al    ;активация строки    

 mov dx,InPort

         in al,dx    ;ввод строки   

          or al,80h    ;объединение с кнопкой «Signal»   

         cmp al,0ffh   ;пустая строка?  

         jz ki1    ;переход если да   

         call vibrdestr   ;гашение дребезга    

         mov [si],al   ;запись строки    

ki2:    in al,dx    ;ввод строки

         or al,80h

         cmp al,0ffh

         jnz ki2

         call vibrdestr   ;гашение дребезга

         jmp short ki3

ki1:    mov [si],al   ;запись строки

ki3:    inc si    ;модиф. адреса

         rol bl,1

         loop ki4    ;переход к след. строке

         ret

kbdinput ENDP

kbdcontr PROC NEAR   ;модуль «Контроль ввода с клавиатуры»

         mov symerr,0

         call symerrcontr

          lea bx,kbdimage   ;загрузка адреса

           mov cx,4    ;и счетчика циклов

         mov empkbd,0

         mov kbderr,0

         mov dl,0

kic2:  mov al,[bx]

         mov ah,5

kic1:  shr al,1

         cmc

         adc dl,0    ;увеличение счетчика активных битов

         dec ah    

         jnz kic1

         inc bx

         loop kic2

         cmp dl,0

         jz kic3

         cmp dl,1

         jz kic4

         mov kbderr,01h   ;ошибка ввода с клавиатуры

         jmp short kic4   

kic3:  mov empkbd,01h   ;пустая клавиатура

kic4:  ret    

kbdcontr ENDP

symerrcontr PROC NEAR  ;подмодуль проверки на правильность кода символа

          lea bx,kbdimage

          mov dx,0

          mov al,[bx]

          cmp al,0ffh   ;строка пуста?

          jnz sctr2    ;переход если нет

          inc bx

          mov al,[bx]

          cmp al,0ffh   ;строка пуста

          jz sctr1    ;переход если да

sctr5:  shr al,1

          jnc sctr4

          inc dl

          jmp short sctr5

sctr4:  mov cl,5

          add cl,dl

          jmp sctr6

sctr2:  shr al,1

          jnc sctr7

          inc dl

          jmp short sctr2

sctr7:  mov cl,0

          add cl,dl

sctr6:  cmp symflag,1   ;введен код символа полностью?

          jnz sctr3    ;переход если нет

          cmp cl,4    ;код меньше 44?

          jbe sctr1    ;переход если да

          mov symerr,1   ;неверный код символа

          jmp sctr1

sctr3:  cmp nextdig,4   ;код >50?

          jnz sctr1    ;переход если нет

          cmp cl,4

          jbe sctr1

          mov symerr,1   ;неверный код символа

sctr1:  ret

symerrcontr ENDP       

   

infmodetrf PROC NEAR  ;модуль «Преобразование информации о режимах»

          cmp kbderr,1   ;ошибка?

          jz imt1    ;переход если да

          mov editleft,0   ;обнуление режимов

          mov editright,0

          mov leftstation,0

          mov rightstation,0

          mov save,0

          mov edittab,0

           lea bx,kbdimage   ;загрузка адреса

          inc bx

          inc bx

          cmp symflag,1   ;символ введен полностью?

          jnz imt1    ;переход если нет

          mov al,[bx]

          cmp al,0feh   ;проверка нажатия кнопки

          jnz imt3    ;переход если не нажата

          not edit

          and edit,1

          mov firstbtn,0

          mov secondbtn,0

          mov thirdbtn,0

          mov stationcount,1

          mov si,addr

          add si,28

          mov addrnextstation,si

imt3:   mov al,[bx+1]

          cmp al,0fbh   ;проверка нажатия кнопки

          jnz imt4    ;переход если не нажата

          not firstbtn

          and firstbtn,00000001b

          cmp firstbtn,1

          jnz imt4

          cmp edit,1

          jnz imt4

          mov secondbtn,0

          mov thirdbtn,0

          jmp imt1

imt4:   mov al,[bx+1]

          cmp al,0fdh   ;проверка нажатия кнопки

          jnz imt5    ;переход если не нажата

          not secondbtn

          and secondbtn,00000001b

          cmp secondbtn,1

          jnz imt5

          cmp edit,1

          jnz imt5

          mov firstbtn,0

          mov thirdbtn,0

          jmp imt1

imt5:   mov al,[bx+1]

          cmp al,0feh   ;проверка нажатия кнопки 

          jnz imt6    ;переход если не нажата

          not thirdbtn

          and thirdbtn,00000001b

          cmp thirdbtn,1

          jnz imt6

          cmp edit,1

          jnz imt6

          mov firstbtn,0

          mov secondbtn,0

          jmp imt1

imt6:   mov al,[bx+1]

          cmp al,0efh   ;проверка нажатия кнопки

          jnz imt7    ;переход если не нажата

          mov leftstation,1

imt7:   mov al,[bx+1]

          cmp al,0f7h   ;проверка нажатия кнопки

          jnz imt2    ;переход если не нажата

          mov rightstation,1

imt2:   mov al,[bx]

          cmp al,0fbh   ;проверка нажатия кнопки

          jnz imt8    ;переход если не нажата

          mov edittab,1

imt8:   mov al,[bx]

          cmp al,0fdh   ;проверка нажатия кнопки

          jnz imt9    ;переход если не нажата

          mov save,1

imt9:   mov al,[bx]

          cmp al,0efh   ;проверка нажатия кнопки

          jnz imt10   ;переход если не нажата

          mov editleft,1

imt10: mov al,[bx]

          cmp al,0f7h   ;проверка нажатия кнопки

          jnz imt1    ;переход если не нажата

          mov editright,1

imt1:   mov al,firstbtn

          and al,secondbtn

          and al,thirdbtn

          cmp al,1

          jnz immmmt1

          mov thirdbtn,0

immmmt1:   ret

infmodetrf ENDP

infmodeout PROC NEAR  ;модуль «Вывод информации о режимах»

          cmp kbderr,1

          jz imo1

          mov al,10h       ;00010000  - исходное сообщение

          cmp edit,1

          jz imo2

          mov al,08h       ;00001000 – изменение сообщения

imo2:  cmp firstbtn,0

          jz imo3

          xor al,01h   ;изменение сообщения

imo3:  cmp secondbtn,0

          jz imo4

          xor al,02h   ;изменение сообщения

imo4:  cmp thirdbtn,0

          jz imo5

          xor al,04h   ;изменение сообщения

imo5:  mov dx,OutPort

out dx,al   ;вывод сообщения

imo1:  ret

infmodeout ENDP

errmesout PROC NEAR  ;модуль «Вывод сообщения об ошибке»

          cmp kbderr,1

          jnz emo1

          lea   bx,letters

          add   bx,128

          mov   al,0

          mov dx,dispport1

          out   dx,al           ;отключить столбцы

          mov   al,20h

          mov dx,dispport4 

          out   dx,al           ;включить текущий индикатор

          mov   cl,1           ;счетчик столбцов

qOutNextColq:  mov   al,0

          mov dx,dispport1

          out   dx,al           ;отключить столбцы

          mov   al,[bx]

          mov dx,dispport0

          out   dx,al           ;загрузить строки

          mov   al,cl

          mov dx,dispport1

          out   dx,al           ;включить текущий столбец

          shl   cl,1

          inc   bx

          jnc   qOutNextColq

           lea   bx,letters

          add   bx,360

          mov   al,0

          out   dx,al          ;выключить столбцы

          mov   al,10h

           mov dx,dispport4

          out   dx,al          ;включить текущий индикатор

          mov   cl,1          ;счетчик столбцов

qOutNextCol1q:   mov   al,0

          mov dx,dispport1

          out   dx,al           ;отключить столбцы

          mov   al,[bx]

          mov dx,dispport0

          out   dx,al          ;загрузить строки

          mov   al,cl

          mov dx,dispport1

          out   dx,al          ;включить текущий столбец

          shl   cl,1

          inc   bx

          jnc   qOutNextCol1q

emo1: ret

errmesout ENDP

nxtdigtrf PROC NEAR  ;модуль «Преобразование очередной цифры»

          cmp symerr,1

          jz ndt1

          cmp empkbd,1

          jz ndt1

          cmp kbderr,1

          jz ndt1

          lea bx,kbdimage  ;загрузка адреса

          mov dx,0

          mov al,[bx]   ;чтение строки

          cmp al,0ffh   ;строка пуста

          jnz ndt2   ;переход если нет

          inc bx

          mov al,[bx]   ;чтение строки

          cmp al,0ffh   ;строка пуста

          jz ndt3    ;переход если да

          mov notsymin,0

ndt5:   shr al,1

          jnc ndt4

          inc dl    ;код столбца

          jmp short ndt5

ndt4:  mov cl,5

          add cl,dl   ;код цифры

          jmp ndt6

ndt2:   mov notsymin,0

ndt8:   shr al,1

          jnc ndt7

          inc dl    ;код столбца

          jmp short ndt8

ndt7:   mov cl,0

          add cl,dl   ;код цифры

ndt6:   mov nextdig,0

          add nextdig,cl   ;запись кода цифры

          not symflag

          and symflag,00000001b

          jmp ndt1

ndt3:   mov notsymin,1  ;введен не символ

ndt1:   ret

nxtdigtrf ENDP

symbolform PROC NEAR   ;модуль «Формирователь символа»

          cmp symerr,1

          jz sf1

          cmp empkbd,1

          jz sf1

          cmp kbderr,1

          jz sf1

          cmp symflag,1

          jz sf2

          mov dl,nextdig   ;очередная цифра

          mov nextsymb,dl

          shl nextsymb,4   ;сдвиг первой цифры

          jmp sf1

sf2:     mov dh,nextdig  ;очередная цифра

          add nextsymb,dh  ;запись второй цифры

sf1:     ret

symbolform ENDP

dispform PROC NEAR  ;модуль «Формирователь массивов отображения»

          cmp symerr,1

          jz df1

          cmp kbderr,1

          jz df1

          cmp edit,1

          jz df2

          mov cx,4   ;счетчик

          lea di,datadisp4  ;адрес массива отображения

          lea bx,letters

          lea si,bufdata4   ;адрес соотв. буферн.данных

df4:     mov ah,[si]

          mov dh,ah

          and ah,0fh   ;далее получение смещения

          mov al,8   ;символа в массиве letters

          mul ah

          add bx,ax

          mov ah,dh

          and ah,0f0h

          shr ah,4

          mov al,50h

          mul ah

          add bx,ax   ;получено смещение

          push cx

          mov cx,8

df3:     mov al,[bx]   ;чтение столбца из letters

          mov [di],al   ;запись в массив отображения

          inc di

          inc bx

          dec cx

          jnz df3

          inc si

          lea bx,letters

          pop cx

          dec cx

          jnz df4

          mov cx,8   ;то же самое для других

          lea di,datadisp8_1  ;массивов отображения

          lea bx,letters

          lea si,bufdata8_1

df5:     mov ah,[si]

          mov dh,ah

          and ah,0fh

          mov al,8

          mul ah

          add bx,ax

          mov ah,dh

          and ah,0f0h

          shr ah,4

          mov al,50h

          mul ah

          add bx,ax

          push cx

          mov cx,8

df6:     mov al,[bx]

          mov [di],al

          inc di

          inc bx

          dec cx

          jnz df6

          inc si

          lea bx,letters

          pop cx

          dec cx

          jnz df5

          

          mov cx,8

          lea di,datadisp8_2

          lea bx,letters

          lea si,bufdata8_2

df7:     mov ah,[si]

          mov dh,ah

          and ah,0fh

          mov al,8

          mul ah

          add bx,ax

          mov ah,dh

          and ah,0f0h

          shr ah,4

          mov al,50h

          mul ah

          add bx,ax

          push cx

          mov cx,8

df8:    mov al,es:[bx]

          mov [di],al

          inc di

          inc bx

          dec cx

          jnz df8

          inc si

          lea bx,letters

          pop cx

          dec cx

          jnz df7

          

          

          jmp df1    ;то же самое для режима

df2:     mov cx,2   ;редактирования

          lea di,datadisp2

          lea bx,letters

          lea si,bufdata2

df9:     mov ah,[si]

          mov dh,ah

          and ah,0fh

          mov al,8

          mul ah

          add bx,ax

          mov ah,dh

          and ah,0f0h

          shr ah,4

          mov al,50h

          mul ah

          add bx,ax

          push cx

          mov cx,8

df10:   mov al,[bx]

          mov [di],al

          inc di

          inc bx

          dec cx

          jnz df10

          inc si

          lea bx,letters

          pop cx

          dec cx

          jnz df9

df1:     ret

dispform ENDP

infout PROC NEAR   ;модуль «Вывод информации»

          cmp kbderr,1

          jz io1

          cmp edit,1

          jz io2

          mov ch,1

          lea si,datadisp4  ;адрес массива отображения

outnextind:mov   al,0

          mov dx,dispport1

          out   dx,al   ;отключение столбцов

          mov   al,ch

          mov dx,dispport4

          out   dx,al   ;включение текущего индикатора

          mov   cl,1

outnextcol:mov   al,0

          mov dx,dispport1

          out   dx,al

          mov   al,[si]

           mov dx,dispport0

          out   dx,al   ;вывод информации

          mov   al,cl

          mov dx,dispport1

          out   dx,al

          shl   cl,1

          inc   si

          jnc   OutNextCol  ;переход к следующему столбцу

          shl ch,1

          cmp ch,16

                                      jnz outnextind ;переход к следующему ;индикатору

          xor  al,al

          mov dx,dispport4

          out  dx,al

                     

          mov ch,1   ;то же самое для других

          lea si,datadisp8_1  ;массивов отображения

outnextind1:mov   al,0

          mov dx,dispport1

          out   dx,al

          mov   al,ch

          mov dx,dispport3

          out   dx,al

          mov   cl,1

outnextcol1:mov   al,0

           mov dx,dispport1

          out   dx,al

          mov   al,[si]

          mov dx,dispport0

          out   dx,al

          mov   al,cl

          mov dx,dispport1

          out   dx,al

          shl   cl,1

          inc   si

          jnc   OutNextCol1

          shl ch,1

          jnc outnextind1

          xor  al,al

          mov dx,dispport3

          out  dx,al

                                

          mov ch,1

          lea si,datadisp8_2

outnextind3:   mov   al,0

          mov dx,dispport1

          out   dx,al

          mov   al,ch

          mov dx,dispport2

          out   dx,al

          mov   cl,1

outnextcol3:  mov   al,0

          mov dx,dispport1

          out   dx,al

          mov   al,[si]

          mov dx,dispport0

          out   dx,al

          mov   al,cl

          mov dx,dispport1

          out   dx,al

          shl   cl,1

          inc   si

          jnc   OutNextCol3

          shl ch,1

          jnc outnextind3

          xor  al,al

          mov dx,dispport2

          out  dx,al

          jmp io1

          

io2:     mov ch,10000b

          lea si,datadisp2

outnextind5:  mov   al,0

          mov dx,dispport1

          out   dx,al

          mov   al,ch

          mov dx,dispport4

          out   dx,al

          mov   cl,1

outnextcol5:   mov   al,0

          mov dx,dispport1

          out   dx,al

          mov   al,[si]

          mov dx,dispport0

          out   dx,al

          mov   al,cl

          mov dx,dispport1

          out   dx,al

          shl   cl,1

          inc   si

          jnc   OutNextCol5

          shl ch,1

          cmp ch,40h

          jnz outnextind5      

io1:     ret

infout ENDP           

;модуль «Функциональная подготовка»

funcprep PROC NEAR

    ;формирование критических

          mov kbderr,0   ;данных

          mov firstbtn,0

          mov secondbtn,0

          mov thirdbtn,0

          mov edit,1

          mov editleft,0

          mov editright,0

          mov edittab,0

          mov leftstation,0

          mov rightstation,0

          mov save,0

          mov flag,0

          mov flag8,0

          mov flaged,0

          mov notsymin,0

          mov symflag,1

          mov btnimage,0

          mov nextsymb,11h

          mov flagtab,0

          mov stationcount,1

          mov kolm,1

          mov tmsec,0

          mov tmmin,0

          mov tmhor,0

          mov tmsec8,0

  mov kolint,0

  mov seckolint,50

                     

          lea si,romdata

          add si,16

          mov addr,si

          lea di,bufdata4

          mov cx,4

fp1:     mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop fp1

          lea di,bufdata4

          add di,3

          mov helpaddr1,di

          mov si,addr

          mov helpaddr2,si

          add si,28

          mov addrnextstation,si

          

          mov numberm,1   ;массив

          mov chisloostaddr,0   ;в котором хранятся

          mov cx,maxkolm   ;количества остановок

          lea di,chisloostanovok   ;для каждого маршрута

metka4:   mov al,0

          mov es:[di],al

          inc di

          loop metka4

          mov si,addrnextstation

          add si,7

metka1:    mov al,es:[si]

          cmp al,10h

          jz metka2

          add si,8

          inc chisloostaddr

          cmp chisloostaddr,30

          jz metka2

          jmp metka1

metka2:    lea di,chisloostanovok                     

          add di,word ptr numberm

          dec di

          cmp chisloostaddr,0

          jnz metka3

          mov chisloostaddr,1

metka3:    mov dl,chisloostaddr

          mov es:[di],dl

          ret

funcprep ENDP

;модуль «Формирование информации»

infoform PROC NEAR

          cmp kbderr,1    ;проверка флагов ошибок

          jz qif1

          cmp edit,1

          jz mmm4

          

          cmp flaged,0    ;режим работы

                                      jz mmm1 ;если перешли не только что

          mov cx,8

          lea si,bufdata8_1

          lea bx,bufdata8_2

klm1:  mov [si],byte ptr 10h

          mov [bx],byte ptr 10h

          inc bx

          inc si

          loop klm1           

          

                                 mov si,addr ;загрузка начальных ;адресов для этого режима

          add si,28

          mov addrnextstation,si

          mov flag,0

          mov flag8,0

          mov flaged,0

          mov stationcount,1

          

                                  mov al,chisloostaddr ;формирование массива остановок

          shl al,1

          dec al

          mov dl,8

          mul dl

          mov di,addr

          add di,28

          add di,ax

          mov cx,0

          mov cl,chisloostaddr

mmm3:  push cx

          mov cx,8

mmm2:  mov al,es:[si]

          mov es:[di],al

          inc si

          inc di

          loop mmm2

          pop cx

          

          sub di,16

          loop mmm3

          jmp qif1

mmm1:  cmp btnimage,1   ;обработка нажатия кнопки ”Signal”

          jnz if3

          cmp secondbtn,1

          jnz if3

          mov dl,chisloostaddr

          shl dl,1

          cmp stationcount,dl

          jz r1

          add addrnextstation,8

          inc stationcount

          jmp if3

r1:       mov stationcount,1

          mov si,addr

          add si,28

          mov addrnextstation,si

if3:      cmp leftstation,1   ;обработка нажатия <|

          jnz if4

          cmp secondbtn,1

          jnz if4

          cmp stationcount,1

          jz if4

          dec stationcount

          sub addrnextstation,8

          jmp if5

if4:      cmp rightstation,1   ;обработка нажатия |>

          jnz if5

          cmp secondbtn,1

          jnz if5

          mov dl,chisloostaddr

          shl dl,1

          cmp stationcount,dl

          jz r2

          add addrnextstation,8

          inc stationcount

          jmp if5

r2:       mov stationcount,1

          mov si,addr

          add si,28

          mov addrnextstation,si

if5:      mov cx,4

          mov si,addr

          lea di,bufdata4

if6:       mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop if6

          cmp firstbtn,1    ;определения текущего режима

          jz if7                                 

          cmp secondbtn,1

          jz if8

          cmp thirdbtn,1

          jz if9

          mov cx,8    ;не выбраны режимы I,II,III

          lea di,bufdata8_1   ;формирование буферных данных

mm1:  mov [di],byte ptr 10h

          inc di

          loop mm1

          mov cx,8

          lea di,bufdata8_2

mm2:  mov [di],byte ptr 10h

          inc di

          loop mm2

          mov flag8,0

          mov flag,0

          jmp qif1

if9:       mov flag8,0    ;режим III

          mov flag,11b    ;формирование буферных данных

          mov cx,8

          lea si,romdata

          lea di,bufdata8_1

mm3:  mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop mm3                                            

          mov cx,8

          lea di,bufdata8_2

mm4:  mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop mm4

          jmp qif1

if8:      cmp thirdbtn,1    ;режим II

          jz if10

dz1:     mov flag,10b    ;формирование буферных данных

          mov flag8,0

          mov cx,8

          lea di,bufdata8_1

          mov si,addr

          add si,20

mm5:  mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop mm5

          mov cx,8

          lea di,bufdata8_2

          mov si,addrnextstation

mm6:  mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop mm6

          jmp qif1

if10:    cmp flag8,1

          jnz qif1

          mov flag8,0

          cmp flag,10b

          jnz dz1

          jmp if9

if7:      cmp secondbtn,1   ;режим I

          jz if13

          cmp thirdbtn,1    ;формирование буферных данных

          jz if14

dz2:     mov flag,01b

          mov flag8,0

          mov cx,8

          lea di,bufdata8_1

          mov si,addr

          add si,4

mm11:  mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop mm11

          mov cx,8

          lea di,bufdata8_2

mm12: mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop mm12

          jmp qif1

if14:    cmp flag8,1

          jnz qif1

          mov flag8,0

          cmp flag,01b

          jnz dz2

          jmp if9

if13:    cmp thirdbtn,1

          jz if17

ifa1:    cmp flag8,1

          jnz qif1

          mov flag8,0

          cmp flag,01b

          jnz dz2

          jmp dz1

if17:    jmp ifa1

mmm4:    cmp flaged,01   ;режим редактирования

          jz qif2

          mov si,addr    ;формирование данных если

          add si,28    ;только что перешли в этот

          mov addrnextstation,si  ;режим

          lea si,bufdata4

          add si,3

          mov helpaddr1,si

          mov si,addr

          mov helpaddr2,si

          mov firstbtn,0

          mov secondbtn,0

          mov thirdbtn,0

          mov flag,00b

          mov flagtab,0

          mov flaged,01

          mov stationcount,1

          mov symflag,1

          mov notsymin,1

          mov cx,4

          mov si,addr

          lea di,bufdata4

mmm5: mov al,es:[si]

          mov [di],al

          inc si

          inc di

           loop mmm5

          mov si,helpaddr1

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h  

          mov al,chisloostaddr

          mov dl,8

          mul dl

          mov di,addr

          add di,28

          add di,ax

          mov cx,0

          mov cl,chisloostaddr

zqw1:  push cx

          mov cx,8

zqw2:  mov es:[di],byte ptr 10h

          inc di

          loop zqw2

          pop cx

          loop zqw1

qif2:    cmp empkbd,1

          jz qif1

          cmp symflag,1

          jnz qif1

          cmp notsymin,1

          jz ifw1

          mov si,helpaddr1

          mov dl,nextsymb

          mov [si],dl

          lea si,bufdata2

          mov dl,nextsymb

          mov [si],dl

          jmp qif1                    

ifw1:   cmp firstbtn,1    ;определение текущего режима

          jz ifw3

          cmp secondbtn,1

          jz ifw4

          cmp thirdbtn,1

          jz ifw5

          cmp flag,00b

          jz ifw6

          mov flag,00b    ;режим – ничего не нажато

          mov flagtab,0

          lea si,bufdata4    ;формирование буферных данных

          add si,3

          mov helpaddr1,si

          mov si,addr

          mov helpaddr2,si

          mov cx,4

          mov si,addr

          lea di,bufdata4

s1:      mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop s1

          mov si,helpaddr1

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h           

ifw6:   cmp editright,1   ;обработка нажатия клавиш

          jnz ifw7    ;  , , save

          lea si,bufdata4

          cmp helpaddr1,si

          jz ifw7

          dec helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov al,[si+1]

          mov [di+1],al

          jmp qif1

ifw7:   cmp editleft,1                      

          jnz ifw8

          lea si,bufdata4

          add si,3

          cmp helpaddr1,si

          jz ifw8

          dec si

          cmp helpaddr1,si

          jnz s2

          inc helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp ifw8  

s2:      inc helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]           

          mov [di],al

          mov al,[si+1]

          mov [di+1],al

          jmp qif1

ifw8:   cmp save,1

          jnz qif1

          lea si,romdata

          add si,16

          lea di,bufdata4

          mov numberm,1

s4:       mov ax,es:[si]

          mov dx,[di]

          cmp ax,dx

          jnz s3

          mov ax,[si+2]

          mov dx,[di+2]

          cmp ax,dx

          jnz s3

          mov addr,si

          add si,28

          mov addrnextstation,si

          mov si,addr

          mov helpaddr2,si

          jmp kkk1

s3:       inc numberm

          lea bx,romdata

          add bx,16

          mov ax,kolm

          dec ax

          mov dx,addrm

          mul dx

          add bx,ax

          cmp si,bx

          jz s5

          add si,addrm

          jmp s4

s5:      mov dl,byte ptr maxkolm

          cmp dl,byte ptr kolm

          jz s6

          add si,addrm

          mov addr,si

          inc kolm

          mov helpaddr2,si

          mov ax,[di]

          mov es:[si],ax

          mov ax,[di+2]

          mov [si+2],ax

          add si,28

          mov addrnextstation,si

          mov chisloostaddr,1

          lea di,chisloostanovok

          add di,word ptr numberm

          dec di

          mov dl,chisloostaddr

          mov es:[di],dl

          jmp qif1

s6:      mov numberm,1

          lea bx,romdata

          add bx,16

          mov addr,bx

          mov helpaddr2,bx

          mov si,bx

          add bx,28

          mov addrnextstation,bx

          lea di,bufdata4

          mov ax,es:[si]

          mov [di],ax

          mov ax,es:[si+2]

          mov [di+2],ax

          add di,3

          mov helpaddr1,di

          lea si,bufdata2

          mov al,[di]

          mov [si],al

          mov [si+1],byte ptr 10h           

kkk1:  mov chisloostaddr,0   ;пересчет числа остановок 

          mov si,addrnextstation  ;в данном маршруте

          add si,7

mkkk1:  mov al,es:[si]

          cmp al,10h

          jz mkkk2

          add si,8

          inc chisloostaddr

          cmp chisloostaddr,30

          jz mkkk2

          jmp mkkk1

mkkk2: lea di,chisloostanovok

          add di,word ptr numberm

          dec di

          cmp chisloostaddr,0

          jnz mkkk3

          mov chisloostaddr,1

          mov dl,chisloostaddr

mkkk3: mov es:[di],dl

          jmp qif1

ifw5:    cmp flag,11b    ;режим III

          jz s7

          mov flag,11b

          mov flagtab,0

                                  lea si,bufdata8_1 ;формирование буферных ;данных

          add si,7

          mov helpaddr1,si

          lea si,romdata

          mov helpaddr2,si

          mov cx,8

          lea di,bufdata8_1

s8:       mov al,es:[si]

          mov [di],al

          inc si

          inc di

          loop s8

          mov si,helpaddr1

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

s7:      cmp editright,1    ;обработка 

          jnz s9

          lea si,bufdata8_1

          cmp helpaddr1,si

          jz s9

          dec helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov al,[si+1]

          mov [di+1],al

          jmp qif1

s9:      cmp editleft,1    ;обработка

          jnz s10

          lea si,bufdata8_1

          add si,7

          cmp helpaddr1,si

          jz s10

          dec si

          cmp helpaddr1,si

          jnz s11

          inc helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp s10

s11:    inc helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov al,[si+1]

          mov [di+1],al

          jmp qif1

s10:    cmp save,1    ;обработка save

          jnz s12

          lea si,bufdata8_1

          mov di,helpaddr2

          mov cx,8

s13:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop s13

          jmp qif1

s12:    cmp edittab,1    ;обработка tab

          jnz qif1

          cmp flagtab,0

          jnz s14

          mov flagtab,1

          lea si,romdata

          add si,8

          mov helpaddr2,si

          lea di,bufdata8_1

          mov cx,8

s15:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop s15

          lea si,bufdata8_1

          add si,7

          lea di,bufdata2

          mov helpaddr1,si

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp qif1

s14:    mov flagtab,0

          lea si,romdata

          mov helpaddr2,si

          lea di,bufdata8_1

          mov cx,8

s16:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop s16

          lea si,bufdata8_1

          add si,7

          mov helpaddr1,si

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp qif1

ifw4:  cmp flag,10b    ; режим II

          jz bb1

          mov flag,10b    ;если только что перешли

          mov flagtab,0

          mov stationcount,1

          lea si,bufdata8_1

          add si,7

          mov helpaddr1,si

          mov si,addr

          add si,20

          mov helpaddr2,si

          add si,8

          mov addrnextstation,si

          sub si,8

          mov cx,8

          lea di,bufdata8_1

bb2:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop bb2

          mov si,helpaddr1

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

bb1:    cmp editright,1   ;обработка 

          jnz bb3

          lea si,bufdata8_1

          cmp helpaddr1,si

          jz bb3

          dec helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov al,[si+1]

          mov [di+1],al

          jmp qif1

bb3:    cmp editleft,1    ;обработка 

          jnz bb4

          lea si,bufdata8_1

          add si,7

          cmp helpaddr1,si

          jz bb4

          dec si

          cmp helpaddr1,si

          jnz bb5

          inc helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp bb4

bb5:    inc helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov al,[si+1]

          mov [di+1],al

          jmp qif1

bb4:    cmp save,1    ;обработка save

          jnz bb6

          lea si,bufdata8_1

          mov di,helpaddr2

          mov cx,8

bb7:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop bb7

          mov si,addr    ;пересчет числа остановок

          add si,28    ;для данного маршрута

          add si,7

          mov chisloostaddr,0

aa1:    mov al,[si]

          cmp al,10h

          jz aa2

          add si,8

          inc chisloostaddr

          cmp chisloostaddr,30

          jz aa2

          jmp aa1

aa2:    lea di,chisloostanovok

          add di,word ptr numberm

          dec di

          cmp chisloostaddr,0

          jnz aa3

          mov chisloostaddr,1

          mov dl,chisloostaddr

aa3:    mov [di],dl

          jmp qif1

bb6:    cmp edittab,1    ;обработка tab

          jnz bb8

          cmp flagtab,0

          jnz bb10

          mov flagtab,1

          mov si,addr

          add si,28

          mov addrnextstation,si

          mov helpaddr2,si

          mov stationcount,1

          lea di,bufdata8_1

          mov cx,8

bb9:    mov al,[si]

          mov [di],al

          inc di

          inc si

          loop bb9

          lea si,bufdata8_1

          add si,7

          lea di,bufdata2

          mov helpaddr1,si

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp qif1

bb10:  mov flagtab,0

          mov si,addr

          add si,20

          mov helpaddr2,si

          lea di,bufdata8_1

          mov cx,8

bb11:  mov al,[si]

          mov [di],al

          inc si

          inc di

           loop bb11

          lea si,bufdata8_1

          add si,7

          mov helpaddr1,si

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp qif1

bb8:    cmp rightstation,1   ;обработка |>

          jnz bb12

          cmp stationcount,30

          jz qif1

          add addrnextstation,8

          inc stationcount

          mov si,addrnextstation

          mov helpaddr2,si

          mov cx,8

          lea di,bufdata8_1

nn1:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop nn1

          lea di,bufdata8_1

          add di,7

          mov helpaddr1,di

          mov si,helpaddr1

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp qif1

bb12:  cmp leftstation,1   ;обработка <|

          jnz qif1

          cmp stationcount,1

          jz qif1

          dec stationcount

          sub addrnextstation,8

          mov si,addrnextstation

          mov helpaddr2,si                                                                                                                                                                                

          mov cx,8

          lea di,bufdata8_1

nn2:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop nn2

          lea di,bufdata8_1

          add di,7

          mov helpaddr1,di

          mov si,helpaddr1

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp qif1    

ifw3:  cmp flag,01b    ; режим I

          jz iw2

          mov flag,01b    ;только что перешли

          mov flagtab,0

          lea si,bufdata8_1

          add si,7

          mov helpaddr1,si

          mov si,addr

          add si,4

          mov helpaddr2,si

          mov cx,8

          lea di,bufdata8_1

iw1:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop iw1

          mov si,helpaddr1

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

iw2:    cmp editright,1   ;обработка клавиш, как

          jnz iw3     ;и в предыдущих режимах

          lea si,bufdata8_1

          cmp helpaddr1,si

          jz iw3

          dec helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov al,[si+1]

          mov [di+1],al

          jmp qif1

iw3:    cmp editleft,1

          jnz iw4

          lea si,bufdata8_1

          add si,7

          cmp helpaddr1,si

          jz iw4

          dec si

          cmp helpaddr1,si

          jnz iw5

          inc helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp iw4

iw5:    inc helpaddr1

          lea di,bufdata2

          mov si,helpaddr1

          mov al,[si]

          mov [di],al

          mov al,[si+1]

          mov [di+1],al

          jmp qif1

iw4:    cmp save,1

          jnz iw6

          lea si,bufdata8_1

          mov di,helpaddr2

          mov cx,8

iw7:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop iw7

          jmp qif1

iw6:    cmp edittab,1

          jnz qif1

          cmp flagtab,0

          jnz iw8

          mov flagtab,1

          mov si,addr

          add si,12

          mov helpaddr2,si

          lea di,bufdata8_1

          mov cx,8

iw9:    mov al,[si]

          mov [di],al

          inc si

          inc di

          loop iw9

          lea si,bufdata8_1

          add si,7

          lea di,bufdata2

          mov helpaddr1,si

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp qif1

iw8:    mov flagtab,0

          mov si,addr

          add si,4

          mov helpaddr2,si

          lea di,bufdata8_1

          mov cx,8

iw10:  mov al,[si]

          mov [di],al

          inc si

          inc di

          loop iw10

          lea si,bufdata8_1

          add si,7

          mov helpaddr1,si

          lea di,bufdata2

          mov al,[si]

          mov [di],al

          mov [di+1],byte ptr 10h

          jmp qif1

qif1:    ret

infoform ENDP        

;Инициализация вектора прерывания

IntPrep  PROC

cli

push ds     ;сохраняем старое значение ds

xor ax,ax

mov ds,ax    ;таблица векторов прерываний по адресу 0000:0000

mov bx,8    ;нужный вектор прерывания по адресу 0000:0008

lea ax,IntForm    ;смещение обработчика прерывания

mov [bx],ax

mov ax,Seg IntForm   ;сегмент в котором находится обработчик

mov [bx+2],ax

pop ds     ;восстанавливаем старое значение

call UTimer    ;первый запуск таймера

sti

ret

IntPrep  ENDP

;Программирование таймера

UTimer  PROC

Mov al,00110000b   ;загрузка управляющего слова

Out PitUPort,al

Mov al,50h    :загрузка константы (младший байт)

 Out PitDataPort,al   ;константа C350h=50000

 Mov al,0C3h    ;загрузка константы (старший байт)

 Out PitDataPort,al

ret

UTimer  ENDP

IntForm PROC     ;Обработчик прерывания

Push ax

push bx

push cx

push dx

 pushf

inc KolInt    ;количество произошедших прерываний

mov ax,SecKolInt

mov flagint,0    ;сброс флага прошедшей секунды

cmp ax,KolInt    ;сравнение количества произошедших прерываний

;с количеством прерываний за секунду

jne IF1

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

mov KolInt,0   

 mov flagint,1    ;прошла секунда

IF1: popf

Pop dx

pop cx

pop bx

pop ax

iret

IntForm ENDP

;модуль «Формирователь времени»

timeform PROC NEAR

cmp flagint,1    ;секунда прошла?

jne  tff1

           lea si,romdata    ;загрузка адреса

          add si,12

          mov al,es:[si]

          shl al,4

          add al,es:[si-1]

          mov tmmin,al    ;чтение количества минут

          inc si

          inc si

          inc si

          mov al,es:[si]

          shl al,4

          add al,es:[si-1]

          mov tmhor,al    ;чтение количества часов

          inc   tmSec

          mov al,tmsec

          daa

          mov tmsec,al

          cmp   tmSec,60h   ;преобразование текущего 

     ;времени

          jb    TimeEnd

          mov   tmSec,0

          inc   tmMin

          mov al,tmmin

          daa

          mov tmmin,al

          cmp   tmMin,60h

          jb    TimeEnd

          mov   tmMin,0

          inc   tmHor

          mov al,tmhor

          daa

          mov tmhor,al

          cmp   tmHor,24h

          jb    TimeEnd

          mov   tmHor,0

TimeEnd:   cmp   flag8,1   ;флаг переключения информации

          jz   Flag8End    ;когда выбрано одновременно 2

     ;режима при работе

          inc   tmSec8

          cmp   tmSec8,8

          jb    Flag8End

          mov   tmSec8,0

          mov   flag8,1

Flag8End:  call time                 

Tff1:   ret

timeform ENDP

time PROC NEAR

         mov al,tmmin

         and al,0fh

         lea si,romdata

         add si,11

          mov es:[si],al

          mov al,tmmin

          and al,0f0h

          shr al,4

          inc si

          mov es:[si],al

          mov al,tmhor

          and al,0fh

          inc si

          inc si

          mov es:[si],al

          mov al,tmhor

          and al,0f0h

          shr al,4

          inc si

          mov es:[si],al           

          ret

time ENDP           

          

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

Start:   mov   ax,Data1   ;системная подготовка

          mov   ds,ax    ;инициализация сегментных

          mov   ax,Data2   ;регистров

          mov   es,ax

          mov   ax,Stk

          mov   ss,ax

          lea   sp,StkTop

          

          call funcprep

call intprep

main:  call btninput

          call kbdinput

          call kbdcontr

          call infmodetrf

          call infmodeout

          call errmesout

          call nxtdigtrf

          call symbolform

          call infoform

          call dispform

          call infout

          call timeform

          jmp main    ;замыкание программного кольца

          

          org RomSize-16

          assume cs:nothing

          jmp Far Ptr Start

Code ENDS

END


Приложение Б

(обязательное)

Перечни элементов

В приложении приводятся перечни элементов для принципиальной схемы модуля обработки информации (КП.МПС.58.01Э3) и для принципиальной схемы бортового информационного табло (КП.МПС.58.00Э3). Перечни элементов имеют соответствующие шифры:

  •  КП.МПС.58.01ПЭ3;
  •  КП.МПС.58.00ПЭ3.


 

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

6084. Изгиб. Понятие об изгибе 33.5 KB
  Изгиб. Понятие об изгибе Весьма часто стержни подвергаются действию поперечной нагрузки или внешних пар. При этом в поперечных сечениях стержня возникают изгибающие моменты, т. е. внутренние моменты, плоскость действия которых перпендикулярна плоско...
6085. Растяжение и сжатие. Продольные силы в поперечных сечениях 66.5 KB
  Растяжение и сжатие. Продольные силы в поперечных сечениях Растяжением или сжатием называется такой вид нагружения, при котором в поперечных сечениях стержня возникает только один внутренний силовой фактор - продольная сила N. Продольная сила, ...
6086. Расчет балок на прочность 63.5 KB
  Расчет балок на прочность. Внешняя нагрузка обычно задана, поэтому для нахождения всех действующих на балку сил необходимо вычислить реакции опор. Напомним, что наименьшее число связей, обеспечивающее неподвижность балки по отношению к основанию в о...
6087. Определение напряжений и деформаций при кручении вала круглого сечения 38.5 KB
  Определение напряжений и деформаций при кручении вала круглого сечения При анализе деформаций кручения будем основываться на следующих гипотезах: При кручении круглого вала поперечные сечения, плоские до деформации вала, остаются плоскими и пе...
6088. Инвестиционная политика государства 32.45 KB
  Введение На современном этапе развития российской экономики многие экономисты ставят вопросы о продуманной экономической политике государства. Правильная экономическая политика государства является залогом успешного развития страны в целом, немалова...
6089. Стандартизация и взаимозаменяемость деталей машин 40 KB
  Стандартизация и взаимозаменяемость деталей машин Стандартизацией называется процесс установления в применения стандартов - документов, содержащих обязательные нормы, правила и требования, относящиеся к различным сторонам человеческой деятельно...
6090. Схеми на операційних підсилювачах 27.74 KB
  Схеми на операційних підсилювачах У даній роботі досліджується ряд схем, побудованих на основі операційних підсилювачів (ОП). Ідеальний ОП характеризується коефіцієнтом підсилення та вхідним опором, що прямують до нескінченості, вихідним опором, що ...
6091. Прессовые соединения 37 KB
  Прессовые соединения Прессовым называется соединение составных частей изделий с гарантированным натягом вследствие того, что размер охватываемой детали больше соответствующего размера охватывающей детали. Прессовые соединения передают рабочие нагруз...
6092. Механические муфты. Назначение и классификация муфт 33 KB
  Механические муфты. Назначение и классификация муфт Приводными муфтами (обычно просто муфтами) называются устройства, служащие для кинематической и силовой связи валов в приводах машин и механизмов. Муфты передают с одного вала на другой вращающий м...