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

Страницы работы

Содержание работы

Расчётно-графическое задание

По дисциплине «Микропроцессорная техника»


Факультет: АВТ

Группа: АТ-73

Студенты: Кабак Е.С.

Вариант №2

Преподаватель: Матушкин Г.Г.


Задание:

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

Главная улица

Боковая улица

Длительность свечения огней

Зеленый

Красный

10 сек.

Желтый

Красный и желтый

3 сек.

Красный

Зеленый

5 сек.

Красный и желтый

Желтый

3 сек.

Код программы

;--------------------Макрос, рисует светофор с заданными цветами----------------

SETCOLOR  MACRO     MG,MY,MR,NG,NY,NR

; Рисуем горизонтальный светофор

MOV       AH,02         ; Устанавливаем позицию курсора

MOV       BH,00         ; Номер видео страницы

MOV       DH,14         ; Строка

MOV       DL,24         ; Колонка

INT       10H           ; Прерывание 10h ROM-BIOS (видео сервис)

MOV       AH,09         ; Пишем символ в текущей позиции курсора

MOV       AL,219        ; Код символа

MOV       BL,NG         ; Цвет символа

MOV       CX,2          ; Счетчик (сколько экзем-ов символа записать)

INT       10H           ; Прерывание 10h ROM-BIOS (видео сервис)

MOV       AH,02         ; Устанавливаем позицию курсора

INC       DL            ; Увеличиваем на 1 номер колонки

INC       DL            ; Увеличиваем на 1 номер колонки

INT       10H           ; Прерывание 10h ROM-BIOS (видео сервис)

MOV       AH,09         ; Пишем символ в текущей позиции курсора

MOV       BL,NY         ; Цвет символа

INT       10H           ; Прерывание 10h ROM-BIOS (видео сервис)

MOV       AH,02         ; Устанавливаем позицию курсора

INC       DL            ; Увеличиваем на 1 номер колонки

INC       DL            ; Увеличиваем на 1 номер колонки

INT       10H           ; Прерывание 10h ROM-BIOS (видео сервис)

MOV       AH,09         ; Пишем символ в текущей позиции курсора

MOV       BL,NR         ; Цвет символа

INT       10H           ; Прерывание 10h ROM-BIOS (видео сервис)

; Рисуем вертикальный светофор

MOV       AH,02

MOV       DH,17

          MOV       DL,44

          INT       10H

          MOV       AH,09

          MOV       BL,MR

          INT       10H

          MOV       AH,02

          INC       DH

          INT       10H

          MOV       AH,09

          MOV       BL,MY

          INT       10H

          MOV       AH,02

          INC       DH

          INT       10H

          MOV       AH,09

          MOV       BL,MG

          INT       10H

          ENDM

;---------------------Присваиваем переменным значения цветов--------------------

RED      EQU   00000100B

          GREEN    EQU   00000010B

          YELLOY   EQU   00001110B

          WHITE    EQU   00000111B

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

STACKSG   SEGMENT  PARA  STACK  'Stack'

          DW       256   DUP(?)

STACKSG   ENDS

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

INTTAB    SEGMENT  AT    0H        ; Таблица векторов прерываний

          ORG      1CH*4          

TIMEADR   LABEL    DWORD           ; Пользовательское прерывание от таймера

INTTAB    ENDS

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

DATASG    SEGMENT  PARA  'Data'

          TIME     DB    0         ; Время в тиках

          STAT     DB    1         ; Состояние светофора

                                   ; 1 - 4 соотвествущие строки в таблице

                                   ; 5 - 6 ночной режим   

          TIMESAV  DD    ?         ; Адрес старого обработчика

DATASG    ENDS

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

CODESG    SEGMENT  PARA  'Code'

;--------------------------Начинаем выполнение задачи---------------------------

BEGIN     PROC     FAR

ASSUME    CS:CODESG, DS:DATASG, SS:STACKSG, ES:INTTAB

          PUSH     DS

          SUB      AX,AX

          PUSH     AX

          MOV      AX,DATASG

          MOV      DS,AX

          MOV      AX,INTTAB

          MOV      ES,AX

          CALL     INIT            ; Рисуем улицу

NEXT1:  CMP      STAT,1          ; Проверяем состояние свет-ра (не первое ли?)

          JNE      NEXT2           ; Если нет, то переходим на проверку второго

          CMP      TIME,182        ; Смотрим, не прошло ли 10 сек.

          JB       X1              ; Если не прошло 10 сек. перейти на метку X1 

MOV      TIME,0          ; Обнуляем таймер

MOV      STAT,2          ; Переводим состояние светофора во второе

SETCOLOR WHITE,YELLOY,WHITE,WHITE,YELLOY,RED

     X1:  JMP      KB              ; В любом случае переходим на метку KB

NEXT2:  CMP      STAT,2          ; Проверяем состояние свет-ра (не второе ли?)

          JNE      NEXT3           ; Если нет, то переходим на проверку третьего

          CMP      TIME,55         ; Смотрим, не прошло ли 3 сек.

          JB       X2              ; Если не прошло 3 сек. перейти

MOV      TIME,0          ; Обнуляем таймер

MOV      STAT,3          ; Переводим состояние светофора в третье

SETCOLOR WHITE,WHITE,RED,         GREEN,WHITE,WHITE

     X2:  JMP      KB              ; В любом случае переходим на метку KB

NEXT3:  CMP      STAT,3        ; Проверяем состояние свет-ра (не третие ли?)

          JNE      NEXT4         ; Если нет, то переходим на проверку четвертого

          CMP      TIME,91       ; Смотрим, не прошло ли 5 сек.

          JB       X3            ; Если не прошло 5 сек. перейти

MOV      TIME,0        ; Обнуляем таймер

MOV      STAT,4        ; Переводим состояние светофора в четвертое

SETCOLOR WHITE,YELLOY,RED,WHITE,YELLOY,WHITE

     X3:  JMP      KB            ; В любом случае переходим на метку KB

Похожие материалы

Информация о работе