Некоммерческое акционерное общество

АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ  И СВЯЗИ

Кафедра «Электроника» 

 

 

 

ЦИФРОВЫЕ УСТРОЙСТВА И МИКРОПРОЦЕССОРЫ

 8085 -СИМУЛЯТОР  

Методические указания к выполнению лабораторных работ

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

5В070400 – Вычислительная техника и программное обеспечение

 

Алматы 2010

СОСТАВИТЕЛЬ: Б.С. Байкенов. 8085-симулятор. Методические указания к выполнению лабораторных работ  по дисциплине «Цифровые устройства и микропроцессоры» для студентов всех форм обучения специальности 5В070400 – Вычислительная техника и программное обеспечение. – Алматы: АУЭС, 2010. – 24 с.

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

 Методическая разработка составлена в целях закрепления лекционного материала и предназначена для всех форм обучения специальности 5В070400 – Вычислительная техника и программное обеспечение.  

 

ВВЕДЕНИЕ 

Основной целью данных методических указаний является закрепление знаний по проектированию микропроцессорных систем (МПС) и приобретение практических навыков программирования на симуляторе, оснащенном ассемблером микропроцессора i8085 фирмы INTEL.

МПС представляет собой совокупность аппаратных (Hard Ware) и программных средств (Soft Ware). Причем аппаратные средства обеспечивают максимальную производительность или быстродейст­вие, а программные средства - расширение круга решаемых задач.

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

МПС решает следующие основные задачи:

- сбор информации;

- обработка;

- представление результатов измерения и (в случае необходимости) передача этих данных по каналу связи.

8085 Simulator IDE - это приложение с удобной графической средой разработки для Windows с интегрированным компилятором BASIC, ассемблером, симулятором, отладчиком и дизассемблером для Intel 8085.

Главное окно программы показывает внутреннюю структуру МП 8085, содержание регистров и флагов, последние выполненные и последующие команды, такты и инструкции счетчика команд PC и интерфейс прерываний.

В меню Tools содержатся следующие основные опции:

- Memory editor (редактор памяти) - это графический интерфейс доступа к памяти процессора 8085 размером 64K;

- Peripheral Devices (периферийные устройства) - это инструмент для мониторинга и контроля команд IN и OUT;

- Assembler  (ассемблер) - эта команда запускает комплексный ассемблер. Исходные файлы Ассемблера можно отредактировать, собрать и загрузить в память в той же графической среде. По умолчанию расширение ASM. После успешного процесса сборки создаются 2 новых файла: один в двоичном коде с OBJ расширением непосредственно загружается в память процессора, а другой - ассемблерный листинг с LST расширением, используется с отладчиком.

Меню Options содержит команды, обеспечивающие нормальное (запланированное) выполнение программы пользователя.

В данной методической разработке рассмотрены методы программирования МПС  в ассемблере симулятора 8085 Simulator IDE, основным достоинством которого является простота и универсальность применения при выполнении РГР, курсового и дипломного проектирования.

1 Лабораторная работа №1. Арифметические и логические команды

 

Цель работы: изучение арифметических и логических команд микропроцессора i8085.

 

1.1 Основные команды микропроцессора i8085

 

1.1.1 Команды пересылки.

MOV r1, r2 – однобайтная команда пересылки содержимого регистра r2 в регистр r1. Например, MOV A, B  (В → А).

MVI A, байт – двухбайтная команда пересылки указанного байта  ячейки памяти, адрес которой непосредственно следует за адресом кода команды, в аккумулятор. Например, MVI A, 56H   (56H A).

STA адрес памяти – трехбайтная команда пересылки из аккумулятора в адрес которой указан во 2 и 3 байтах команды. Например, STA 8200  (A→8200).

LDA адрес памяти - трехбайтная команда пересылки из памяти, адрес которой указан во 2 и 3 байтах, в аккумулятор. Например, LDA 8200 (8200→A).

IN адрес порта – двухбайтная команда пересылки байта из порта ввода в аккумулятор. Например, IN 01H  (порт 01→ А).

OUT адрес порта - двухбайтная команда пересылки байта из аккумулятора в порта вывода. Например, IN 01H  (А → порт 01).

 

1.1.2 Арифметические команды.    

АDD r  - команда "сложение", которая складывает содержимое регистра r с содержимым аккумулятора А, а результат сбрасывается из АЛУ в аккумулятор (А = А + r). В зависимости от места нахождения данных, команды сло­жения могут быть с памятью и А (АDD М), данными и А (АDI байт).

INR r – команда инкрементирования: содержимое регистра r увеличивается на 1. Например, INR A – содержимое аккумулятора увеличится на 1  (A = A + 1).

INX rp – команда инкрементирования пары регистров rp. В листинге программы пара обозначается только старшим регистром. Например, INX B – содержимое пары ВС увеличится на 1 (ВС = ВС + 1).

Операция "вычитание" осуществляется командой SUB r, при кото­рой из содержимого регистра А вычитается содержимое регистра r. Аналогично команды вычитания могут быть с памятью и A (SUI байт).

DCR r – команда инкрементирования: содержимое регистра r увеличивается на 1. например, DCR A – содержимое аккумулятора уменьшится на 1  (A = A – 1).

DCX rp – команда инкрементирования пары регистров rp. В листинге программы пара обозначается только старшим регистром. Например, DCX B – содержимое пары ВС уменьшится на 1 (ВС = ВС – 1).

 

1.1.3  Логические команды.

ОRА, r - команда выполняет функцию ИЛИ побитно без переносов: объединяет по "ИЛИ" содержимое регистров А и r. Например, ORA B (А = А v B).

ANA r -  однобайтная команда реализует функцию И: содержимое аккумулятора логически умножается (побитно) на содержимое регистра r. Например, ANA B – (A = AB).

СМА – однобайтная команда реализует функцию НЕ, т.е. инвертирует содержимое аккумулятора (А=). 

XRA, r - команда реализует функцию "Исключающая ИЛИ": выполняет логическую функцию над содержимым регистров А и r. Например, XRA A   осуществляет очистку аккумулятора, т.к. дает нулевой ре­зультат в каждом бите.

i8085 позволяет работать с двоично-десятичным кодом (ВСD), в котором десятичные числа каждого разряда представляются двоичны­ми. Вследствие этого двоичные числа, превышающие 9 (1001+1111), не­допустимы в ВСD.

DАА -  команда осуществляет десятичную коррекцию: если полубайт содержимого аккумулятора больше 9, то прибавляется 6. Как правило, десятичная коррекция выполняется после операции сложения.                                                                                                                          

СМР r – команда осуществляет сравнение содержимого аккумулятора и регистра r путем вычитания одного из другого, не изменяя при этом содержимое А, т.е. из АЛУ разность не сбрасывается в аккумулятор. Результат сравнения определяется по битам фла­гов: нуля Z = 1, если А = r, переноса CY = 1, если А ≠ r.

RLC – однобайтная команда выполняет циклический сдвиг влево: содержимое аккумулятора сдвигается влево на один разряд.

RRC - однобайтная команда выполняет циклический сдвиг вправо: содержимое аккумулятора сдвигается вправо на один разряд.

RAL и RAR - команды отличаются тем, что циклический сдвиг влево (вправо)  содержимого аккумулятора осуществляется через бит флага переноса С (carry - перенос).

CMC - команда инвертирует бит флага переноса C регистра признаков F.

 

1.2 Моделирование в 8085 Simulator IDE

 

1.2.1 Арифметические команды.

Необходимо выполнить следующие действия:

- запустить 8085 симулятор IDE;

- в меню Tools выбрать команду “Assembler”;

- в окне Assembler меню File выбрать команду “New”.

Отступив не менее 8 пробелов (под Options), набрать первую команду из таблицы 1. Перейдя на второй адрес ячейки памяти с помощью Enter, набрать 2-ю команду и т.д.

- в этом же окне Assembler в меню Tools выбрать команду “Assemble” для формирования файла с расширением asm. В появившемся окне Save Assembler Source As дать имя, например, tr1 и нажать «Сохранить». После чего симулятор создаст два файла: tr1.lst (ассемблер листинг) и tr1.obj (ассемблер в двоичном коде  для загрузки в память);

- в этом же окне Assembler в меню Tools выбрать команду “Assemble&Load” - начнется загрузка программного файла tr1.obj в память 8085 симулятора IDE, а в основном окне 8085simulator в опции “Program location” появится местонахождение tr1.obj;

- закрыть окно ассемблера;

- выбрать опцию “Option/Enable logging”;

- выбрать опцию “Option/Refresh Memory Editor”;

- в меню Tools выбрать команду “Memory Editor” - откроется окно «Memory Editor» с 8 байтами программы;

- отрегулируйте расположение окон для лучшего обзора, используя опцию “Always On Top” в окне «Memory Editor»;

- проверить, что выбрана опция  “Option\HLT Stops Simulation”;

- в меню  Rate  выбрать скорость Normal;

- в меню Tools выбрать команду “Peripheral Devices ” - откроется окно «Peripheral Devices» с 4 портами ввода-вывода. Под Device 1 обозначить порт вывода точкой на OUT и нажать на левую кнопку OFF - появится окно “8085 Simulator IDE” – в поле записи набрать адрес порта вывода 01, затем ОК и кнопка станет ON;

- в меню Simulation выбрать команду “Start”;

- в блокноте появится файл log.txt с тестом программы, адресами ячеек памяти с кодами команд и состояниями флагов регистра признака.

В результате должны гореть 8,5,4,3,1 светодиоды, что соответствует числу – 9DH.

 

Т а б л и ц а 1.1 – Программа арифметического сложения

Адрес

Команда

Комментарий

 

0001

8002

8003

8004

8005

8006

          

            MVI A, 053H

            MVI B, 04AH

            ADD B

             OUT  01H

             HLT

            .END

 

53h → A

4Ah → В

A = A+B = 9Dh

A → светодиоды

останов

 

 

1.2.2 Логические команды.

Учитывая, что программы почти одинаковые (см. таблицы 1.1 и 1.2)  и исходный файл tr-1.asm уже получен, необходимо заменить только одну команду и выполнить следующее:

- в меню Tools выбрать команду “Assembler”;

- в окне Assembler изменить в программе команду ADD на команду ANA;

- в этом же окне Assembler в меню Tools выбрать команду “Assemble” для создания двух файлов: tr1.lst (ассемблер листинг) и tr1.obj (ассемблер в двоичном коде  для загрузки в память);

- в этом же окне Assembler в меню Tools выбрать команду “Assemble&Load” - начнется загрузка программного файла tr1.obj в память 8085 симулятора IDE, а в основном окне 8085simulator в опции “Program location” появится местонахождение tr1.obj;

- в меню Simulation выбрать команду “Start”.

В результате должны гореть 7-й и 2-й светодиоды, что соответствует числу – 42H (см. рисунок 1.1).

 

Т а б л и ц а 1.2 – Программа логического умножения

Адрес

Команда

Комментарий

 

0001

8002

8003

8004

8005

8006

           

            MVI A, 053H

            MVI B, 04AH

            ANA B

            OUT  01H

            HLT

            .END

 

53h → A

4Ah → В

A = A∙B = 42h

A → светодиоды

останов

 

 

Копия экрана ПК снимается нажатием клавиши Prt Scr и вставляется в программу Paint. После выделения нужной картинки копия переносится в Word.

 

 

Рисунок 1.1 – Вид экрана с выполняемой программой

 

1.3 Контрольные вопросы

 

1) Основное отличие арифметических команд от логических?

2) Чем отличается команда CMP от SUB?

3) Что произойдет, если MVI A, 00H?

4) В чем заключается «маскирование»?  

 

2 Лабораторная работа №2. Адресация команд

 

Цель работы: изучение способов адресации команд микропроцессора i8085.

 

2.1 Общие сведения

 

Команды различаются по способу адресации:

- непосредственная адресация;

- регистровая (неявная) адресация;

- прямая адресация;

- косвенная адресация.

При непосредственной адресации операнд содержится в самой команде. Это двухбайтные команды вида МVI p, байт и трехбайтные команды вида LХI pr,     2 байта. По команде LХI pr,2 байта третий байт команды пересылается в старший регистр регистровой пары pr, а второй байт команды - в младший регистра регистровой пары pr. В качестве pr используются регистровые пары: ВС, DЕ, НL,SР.

При регистровой адресации осуществляется пересылка содержимого регистра источника в регистр-приемник. Регистрами служат аккумулятор или регистры общего назначения. Это однобайтные команды вида МОV r1, r2. По этой команде содержимое регистра r2 пересылается в регистр r1, при этом содержимое r2 не изменяется. Регистровая адресация используется также в однобайтных командах ХСНG,  SРНL, РСНL. При выполнении команды ХСНG регистровые пары НL и DЕ обмениваются содержимым.

При выполнении команды SРНL осуществляется пересылка содержимого регистровой пары НL в указатель стека. При выполнении команды  РСНL происходит загрузка содержимого регистровой пары НL в программный счетчик.

При прямой адресации команда содержит адрес источника или приемника информации. К ним относятся двухбайтные команды IN порт, OUT порт и трехбайтные команды  SТА адрес, LDА адрес, SНLD адрес. Поскольку микропроцессор позволяет адресовать 256 портов ввода вывода, то адрес порта в командах IN, OUT задается двумя шестнадцатеричными цифрами. По команде IN поpт байт данных из адресованного порта ввода помещается в аккумулятор A. По команде ОUТ порт байт данных из аккумулятора пересылается в порт вывода, адрес которого указан во втором байте команды. По команде SТА содержимое аккумулятора пересылается в указанную ячейку памяти. Команда LDА загружает аккумулятор содержимым указанной ячейки памяти. По команде SHLD адрес содержимое ячейки памяти, адрес которой указан во втором и третьем байтах команды, пересылается в регистр L, а содержимое ячейки памяти, адрес которой на единицу больше указанного пересылается в регистр Н.

При косвенной адресации команда не содержит адрес ячейки памяти с которой осуществляется обмен данными, а указывает, где такой адрес находится. Рассмотрим однобайтные команды МОV r,М и МОV М,r. Здесь буквой М обозначается не реальный регистр, а ячейка памяти, адрес которой помещен в регистровой паре НL.

Например, если регистр Н содержит число 12h, а регистр L – 37h, то команда МОV С,М будет загружать в регистр С содержимое ячейки памяти с адресом 1237h.

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

Команды ХТНL, РUSН pr, РOР pr оперируют со стеком. Стек - это область ОЗУ, в которой запись и сочетание данных осуществляется по принципу "последний пришел - первый вышел". Такой принцип работы стека необходим для осуществления возврата в основную программу после выполнения подпрограммы. Состояние стека отображается в регистровой паре SР, называемой указателем стека. Указатель стека содержит информацию о том, какая область памяти должна быть использована при очередном обращении к стеку. Команда РUSН pr пересылает содержимое пары регистров pr в стек, при этом содержимое старшего регистра пары pr пересылается в ячейку памяти, адрес которой на 1 меньше содержимого указателя отека   SР, а содержимое младшего регистра пары pr пересылается в ячейку памяти, адрес которой на 2 меньше содержимого указателя стека. Содержимое указателя стека уменьшается на 2, т.е. вершина стека "растет" вниз по уменьшению ячеек ОЗУ.

При выполнении команды РОР pr направление передачи данных противоположное – из стека в регистровую пару РR. Содержимое указателя стека SР увеличивается на 2. По команде ХТНL происходит обмен содержимым пары регистров НL и двух верхних позиций стека. Перед использованием команд, оперирующих стеком, необходимо предварительно устанавливать  указатель стека SP.

 

2.2 Моделирование в 8085 Simulator IDE

 

2.2.1 Исследование программы обмена с памятью.

Необходимо выполнить следующие действия:

- запустить 8085 симулятор IDE;

- в меню Tools выбрать команду “Assembler”;

- в окне Assembler меню File выбрать команду “Open”;

- в окне Open Assembler Source File выбрать файл memfill.asm и нажать “Открыть” (исходная программа появится в окне Assembler сразу или после нажатия кнопки Paste в меню “Edit”);

- в меню Tools выбрать команду “Assemble”, который создаст два файла: memfill.lst (ассемблер листинг) и memfill.obj (ассемблер в двоичном коде  для загрузки в память);

- в меню Tools выбрать команду “Assemble&Load” - начнется загрузка программного файла memfill.obj в память 8085 симулятора IDE, а в окне 8085simulator в опции Program location появится местонахождение memfill.obj;

- закрыть окно ассемблера;

- выбрать опцию “Option/Enable logging”;

- выбрать опцию “Option/Refresh Memory Editor”;

- в меню Tools выбрать команду “Memory Editor” - откроется окно «Memory Editor» с 13 байтами программы;

- отрегулируйте расположение окон для лучшего обзора, используя опцию “Always On Top” в окне «Memory Editor»;

- используя линейку прокрутки, выберите область памяти FF00-FFFF;

- проверить, что выбрана опция  “Option\HLT Stops Simulation”;

- в меню Rate выбрать скорость Normal;

- в меню Simulation выбрать команду “Start”.

 

 

Рисунок 2.1 – Вид экрана с выполняемой программой

 

2.2.2 Листинг программы.

          MVI A, 0FFH        ; загрузка А=FFH - счетчик

          LXI B, 0FF00H     ; загрузка пары ВС=FF00H

L1:     STAX B                ; из A в память по адресу в паре ВС

          INX B                   ;  ВС=BC+1

          DCR A                  ;  A = A - 1

          JNZ  Ll                 ; если А ≠ 0, переход на L1

          STAX В               ; загрузка 00Н в память по адресу FFFFH

          HLT                    ; останов

         .END

 

2.2.3 Моделирование программы с командами прямой адресацией.

Набрать программу (назовем ее obr1.asm), приведенную в таблице 2.1, и загрузить в 8085 Simulator IDE. К i8085 подключить выходной порт 01h.

 

Т а б л и ц а 2.1 – Программа обратного кода

Адрес

Ассемблер

Комментарий

0001

0002

0003

0004

0005

0006

MVI A,  0C9H

CMA

OUT 01H

STA 02131H

HLT

.END

А = C9H

Инверсия А

A → порт 01h

A M (2131h)

останов

 

В результате выполнения программы obr1.asm в окне “Memory Editor” видно, что в ячейке 2131 помещен байт 36h и горят 6,5,3,2 светодиоды.

2.2.4 Моделирование программы с командами непосредственной и косвенной адресацией.

Набрать программу (назовем ее obr2.asm), приведенную в таблице 2.2, и загрузить в 8085 Simulator IDE. К i8085 подключить выходной порт 01h.

 

Т а б л и ц а 2.2 – Программа обратного кода

Адрес,h

Ассемблер

Комментарий

0001

0002

0003

0004

0005

0006

0007

0008

LXI H, 02131H

MVI B, 014H

MOV A,B

CMA

OUT  01H

MOV M,A

HLT

.END

2131hHL

014hB

BA

Инверсия А

А→Порт 01

А → M(2131h)

останов

 

В результате выполнения программы obr1.asm в окне “Memory Editor” видно, что в ячейке 2131 помещен байт 36h и горят 6,5,3,2 светодиоды.

 

2.3 Контрольные вопросы

 

1) Чем отличаются команды MVI B и LXI B?

2) Где расположен адрес при косвенной адресации?

3) Что представляет собой стек?

4) Какая адресация в командах MOV A,B и MOV B,C?

3 Лабораторная работа №3. Команды вызова подпрограмм

 

Цель работы: изучить работу микропроцессора при выполнении команд со стеком PUSH, POP и вызова подпрограмм CALL, RET.

 

3.1 Общие сведения

 

Стек (Stack) - это часть оперативной памяти, предназначенная для временного хранения данных в режиме LIFO (Last In - First Out).

Особенность стека по сравнению с другой оперативной памятью - это заданный и неизменяемый способ адресации.

PUSH rp – однобайтная команда с косвенной адресацией (SP), которая записывает содержимое пары rp в стек.

POP rp - однобайтная команда с косвенной адресацией (SP), которая пересылает из стека 2 байта в указанную пару регистров rp.

При записи числа (кода) в стек оно записывается по адресу, определяемому как содержимое регистра указателя стека SP. При чтении из стека число читается из адреса указателя стека SP, предварительно увеличенное (инкрементированное) на единицу. В результате получается, что число, записанное последним, будет прочитано первым, а число, записанное первым, будет прочитано последним. Такая память называется LIFO или памятью магазинного типа (в магазине автомата патрон, вставленный последним, будет извлечен первым).

Пусть, например, текущее состояние указателя стека SP = 8008h, и в него надо записать два числа (слова). Первое слово будет записано по адресу 8008. Второе - по адресу 8007. После записи содержимое указателя стека - 8006. Если затем прочитать из стека два слова, то первым будет прочитано слово из адреса 8007. Вторым будет прочитано слово из адреса 8008, а указатель стека снова станет равным 8008. При записи стек растет снизу вверх, при чтении наоборот.

Рисунок 3.1 - Принцип работы стека

 

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

JMP адрес - трехбайтная команда безусловного перехода загружает в программный счетчик РС адрес ячейки (2-й и 3-й байт команды), находящейся в любом месте области памяти основной программы.

CALL адрес - трехбайтная команда вызова подпрограммы, по которой состояние программного счетчика PC передается в стек, а в PC загружается адрес подпрограммы (указанный в команде), подлежащей выполнению.

Таким образом, команда CALL включает в себя как бы 2 команды: PUSH и JMP, но помимо содержимого РС в стек сбрасывается PSW (слово состояние) и содержимое регистра признаков F.

RET – однобайтная команда возврата из подпрограммы, которая пересылает из стека (РОР) 4-х байт: в РС, регистр признаков и временный регистр W.

 

3.2 Моделирование в Simulator IDE

 

3.2.1 Программа перевода двоичного числа в код BCD.

Необходимо выполнить следующие действия:

- запустить 8085 симулятор IDE;

- в меню Tools выбрать команду “Assembler” в окне 8085 Simulator;

- в окне Assembler меню File выбрать команду “Open”;

- в окне Open Assembler Source File выбрать файл bin2bcd.asm и нажать “Открыть” -  в окне появится Assembler исходная программа;

- в меню Tools выбрать команду “Assemble”, которая  создаст два файла: bin2bcd.lst (ассемблер листинг с кодами операций) и bin2bcd.obj (в двоичном коде  программы в ассемблере, готовой для загрузки в память);

- закрыть окно ассемблера;

- в меню File выбрать команду “Load Program ”;

- в окне Select Program File выбрать файл bin2bcd.obj и нажать “Открыть”, после чего он загрузится в память симулятора;

- выбрать опцию “Options/Refresh Memory Editor”;

- в меню Tools выбрать команду “Memory Editor”: откроется окно “Memory Editor”;

- отрегулируйте расположение окон для лучшего обзора, используя опцию “Always On Top” в окне «Memory Editor»;

- используя линейку прокрутки, выбрать область памяти 0100-01FF;

- в меню Tools выбрать команду “Simulation Log Viewer”: откроется окно “Simulation Log Viewer”;

- отрегулируйте расположение окон для лучшего обзора, используя опцию “Always On Top” в данном окне;

- выбрать опцию “Keep Last Record In Focus”;

- в меню  Rate выбрать скорость Fast Simulation rate;

- проверить, что в меню  Options выбрана опция  “\HLT Stops Simulation”;

- в меню Simulation нажать на “Start”.

Проследить за содержимым ячеек памяти с адресами 0101Н-0103Н.

 

Рисунок 3.2 – Вид экрана с выполняемой программой

 

3.2.2 Листинг программы.

START:     LXI SPSTACK   ; загрузка вершины стека

                   LXI H, BINBYT   ; загрузка HL=0100Н, где хранится двоичное код

                   MOV A, M            ; загрузка А=ЕАН

                   LXI H, OUTBUF  ; загрузка HL=0101Н адресом буфера

                   CALL BINBCD     

                    HLT

BINBCD:

                   MVI  B,100             ; загрузка  100 в регистр В 

                   CALL BCD             ; вызов п/п преобразования в BCD сотен

                    MVI B,10               ; загрузка 10 в регистр B

                   CALL BCD             ; вызов п/п преобразования в BCD десятков

                    MOV M,A              ; сохранить  в буфере BCD единиц

                    RET

BCD:

                      MVI M, 0FFH      ; загрузка буфера

STORE:        INR M                  ; очистка 1-го буфера и инкрементирование

                                                    ;каждого вычитания

                     SUB         B                   ; вычитание А =ЕАН – 64Н

                      JNC         STORE         ; если С≠0, то переход на STORE и +1

                                                    ; к содержимому буфера

                     ADD         B                   ; сложить разность с 64Н, чтобы вернуть

                                                    ; остаток в А

                     INX H                   ; переход к следующему адресу буфера

                     RET

                     .ORG   0100H

BINBYT     .DB  234                  ; в ячейке 0100Н  234 = ЕАН

0UTBUF                                      ;. буфер с адресом 0101Н – счетчик сотен

STACK       .EQU 0FFFFH         ; определение адреса указателя стека

                    .END

 

3.3 Контрольные вопросы

 

1) Как организуется стек?

2) Чем отличается команда CALL от PUSH?

3) Чем отличается команда RET от POP?

4) Что представляет собой код BCD?

5) Что выполняет команда DAA?

 

 

4 Лабораторная работа №4. Внешние прерывания

 

Цель работы: изучить работу микропроцессора i8085 при поступлении запросов от внешних устройств, типов прерываний и реакции микропроцессорной системы.

 

4.1 Общие сведения

 

Микропроцессор i8085 имеет пять входов прерывания и один выход управления им INTA. Прерывание должно ввести в действие команду CALL, согласно которой состояние программного счетчика PC передается в стек, а в PC загружается адрес подпрограммы, подлежащей выполнению.

Входы МП, связанные с прерываниями, называются TRAP; RST 5,5; RST 6,5; RST 7,5; INTR. При организации прерываний решаются задачи маскирования запросов и определяются их уровни приоритета при конфликтах из-за одновременного поступления нескольких запросов.

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

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

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

Обозначение входов RST n (n = 5,5; 6,5; 7,5) происходит от слова Restart.

Прерывания по этим входам маскируемые, т. е. могут быть разрешены или запрещены командами El (Enable Interrupt) и Dl (Disable Interrupt), действующими на все три входа одновременно. Начальный сброс микропроцессора запрещает обслуживание этих запросов, для их последующего разрешения следует подать команду EI. Имеется также возможность раздельного маскирования запросов RSTn с помощью специальной команды SIM (Set Interrupt Mask), которая устанавливает маски в соответствии со значениями битов А0...А2 содержимого аккумулятора. Загрузив 1 в соответствующий бит А, можно запретить (замаскировать) тот или иной вход. Приоритеты входов RSTn фиксированы, они снижаются в порядке RST 7,5; RST 6,5; RST 5,5. Начальные адреса подпрограмм обслуживания прерываний типа RST n известны. Команды RST n заканчиваются загрузкой в программный счетчик числа 8n. Цифры 5,5; 6,5 и 7,5 определяют начальные адреса 002Сh, 0034h и 00ЗСh. Иными словами, для входов этого типа векторы прерывания определяются автоматически и их не требуется передавать в МП из внешних устройств (этот случай рассматривается в данной работе).

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

Вход RST 7,5 является динамическим, реагирует на положительный фронт сигнала, а входы RST 6,5 и RST 5,5 - статические, реагируют на уровень сигнала и, следовательно, автоматически снимаются при исчезновении запросов по этим входам. Запрос RST 7,5, принимаемый триггером с динамическим входом, после снятия сигнала запроса не снимается и сохраняется, пока не будет обработано прерывание или до команды SIM или RESET.

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

До выполнения команды SIM в аккумулятор загружается слово, биты которого означают:

 

7

6

5

4

3

2

1

0

Х

Х

Х

R7.5

MSE

М7,5

М6,5

М5,5

 

Биты 7,6,5 не используются; бит 4 сбрасывает вход RST 7,5 (сигнал по этому входу принимается триггером с динамическим управлением); MSE (Mask Set Enable) 0 - сигнал, активное состояние которого разрешает действие битов 2,1,0. Биты М 7,5...М 5,5 маскируют запросы RST 7,5...RST 5,5, если соответствующий бит равен 1.

Например, в данной работе требуется разрешение RST 7,5, установка триггера RST 7,5 и маскирование RST 6,5 и RST 5,5. Условия  будут выполнены двумя командами:

                                MVI А, 0BH        ;установка битов аккумулятора

                                SIM                      ;изменение масок

Байт 0BH имеет вид: 0000 1101.

 

4.2 Моделирование в 8085 Simulator IDE

 

4.2.1 Программа с внешними прерываниями.

Необходимо выполнить следующие действия:

- запустить 8085 симулятор IDE;

- в меню Tools выбрать команду “Assembler” в окне 8085 Simulator;

- в окне Assembler меню File выбрать команду “Open”;

- в окне Open Assembler Source File выбрать файл interrupt.asm и нажать “Открыть” -  в окне Assembler появится исходная программа;

- в меню Tools выбрать команду “Assemble”, которая создаст два файла: interrupt.lst (ассемблер листинг с кодами операций) и interrupt.obj (в двоичном коде  программы в ассемблере, готовой для загрузки в память);

- закрыть окно ассемблера;

- в меню File выбрать команду “Load Program ”;

- в окне Select Program File выбрать файл interrupt.obj и нажать «Открыть”, после чего он загрузится в память симулятора;

- в меню Rate выбрать опцию “Normal”;

- отменить опцию “Options/Prompt For Value Before IN Instruction”;

- в меню Option выбрать опцию “Enable IN/OUT Instructions Logging”;

- в меню Tools выбрать команду “Peripheral Devices” - откроется окно «Peripheral Devices»;

- отрегулируйте расположение окон для лучшего обзора, используя опцию “Always On Top” в окне «Peripheral Devices»;

- включить порт 1, нажав на кнопку “OFF”, ввести 01 для номера порта 1;

- выбрать опцию “IN” для его конфигурации как входного порта;

- включить порт 2, нажав на кнопку “OFF”, ввести 02 для номера порта 2;

- не менять его конфигурацию по умолчанию выходного порта;

- в меню Simulation выбрать команду “Start”.

Проследить выводимые байты 0АН,0ВН, 0СН, 0DН, 0EН на порт 2.

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

Изменить входной байт можно также путем клика на  ярлык справа от порта 1. Затем в появившемся окне Hex Value Entry Dialog поля Keybord набрать любой байт кнопками клавиатуры, который после нажатия Enter посылается во входной порт 1.  

В программе после команды EI  кнопка RST 7.5 активизируется (кнопки TRAP и INTR в данном примере не используются). Кликнуть кнопку RST 7.5. Сигнал прерывания будет послан на симулятор и набранный байт (любым из 2-х способов) из входного порта 1 будет послан во входной порт 2.

В меню Simulation, нажатием  на “ Stop”, происходит остановка.

4.2.2 Листинг программы.

 

Рисунок 4.1 – Вид экрана с выполняемой программой

 

               JMP 0100H           ; переход к основной программе

              .ORG 003CH         ; адрес подпрограммы прерывания

               IN 01H                  ; ввод в А из порта 01H

               OUT 02H              ; сброс этой величины в выходной порт 02H

               El                          ; разрешение прерываний

               RET                      ; возврат из п/п прерываний

              .ORG 0100H         ; адрес основной программы

              JMP Ll                  ; переход через область данных

L2:        .DB OAH              ; в ячейке 0101H=ОАН

              .DB 0BH                ; в ячейке 0102H=ОВН

              .DB 0CH               ; в ячейке 0103H=ОСН

              .DB 0DH              ; в ячейке 0104HDН

              .DB 0EH               ; в ячейке 0105HEН

Ll:          MVI D,05H          ; загрузка счетчика в регистр D=5

               LXI B,L2              ; загрузка адреса 0101H в пару ВС

L3:          LDAX B              ; загрузка А=ОАН

               OUT 02H             ; выходной порт 02H= ОАН

               INX В                   ; ВС=ВС+1

               DCR D                  ;  D=D-1

               JNZ L3                 ; если D≠0, то идти на метку L3

               MVI A,0BH         ; подготовка маски прерывания

               SIM                       ; установка маски прерывания

               EI                          ; разрешение прерывания

L4:          JМР L4                 ; вечный цикл

               .END

 

4.3 Контрольные вопросы

 

1) В чем отличие векторного прерывания от радиального?

2) Основное отличие прерывания по входу TRAP?

3) Что представляет собой команда SIM?

4) По какому адресу находится вектор начального сброса?

5) Прокомментировать     MVI A, 0EH

                                            SIM

 

5 Лабораторная работа №5. Внешние устройства

 

Цель работы: изучение способов управления устройствами индикации с помощью стандартных программ сигнализации на Ассемблере.

 

5.1 Общие положения

 

Семисегментные индикаторы позволяют наблюдать содержимое регистров МП и ячеек памяти, отображать другую информацию. Каждому индикатору соответствует ячейка ОЗУ, где хранится семисегментный код, управляющий  свечением  сегментов индикатора. Информация из этих ячеек посылается на индикаторы при помощи специальной схемы, которая обеспечивает динамический режим индикации. Каждый бит в этих ячейках соответствует определенному сегменту (см. рисунок 5.1). Если бит равен 1, то соответствующий сегмент будет гореть, и наоборот.

Бит

7

6

5

4

3

2

1

0

Сегмент

H

G

F

E

D

C

B

A

 

Рисунок 5.1 – Схема семисегментного индикатора

 

Обмен информацией с внешними устройствами осуществляется через программируемый интерфейс i82C55 (КР580ИК85), который имеет три порта ввода-вывода А,В и С. МП обращается к портам интерфейса как к внешним устройствам, слежения за выполнением операций ввода-вывода, управления распределением оперативной памяти контроллера.

 

5.2 Моделирование в 8085 Simulator IDE

 

5.2.1 Программа «бегущие огни».

Необходимо выполнить следующие действия:

- запустить 8085 симулятор IDE;

- в меню Tools выбрать команду “Assembler” в окне 8085 Simulator;

- в окне Assembler меню File выбрать команду “Open”;

- в окне Open Assembler Source File выбрать файл beg.asm и нажать “Открыть” -  в окне Assembler появится исходная программа;

- в меню Tools выбрать команду “Assemble”, которая создаст два файла: beg.lst (ассемблер листинг с кодами операций) и beg.obj (в двоичном коде  программы в ассемблере, готовой для загрузки в память);

- в этом же окне Assembler в меню Tools выбрать команду “Assemble&Load” - начнется загрузка программного файла beg.obj в память 8085 симулятора IDE, а в основном окне 8085simulator в опции “Program location” появится местонахождение beg.obj;

- закрыть окно ассемблера;

- выбрать опцию “Option/Enable logging”;

- выбрать опцию “Option/Refresh Memory Editor”;

- в меню Tools выбрать команду “Memory Editor” - откроется окно «Memory Editor» с 13 байтами программы;

- отрегулируйте расположение окон для лучшего обзора, используя опцию “Always On Top” в окне «Memory Editor»;

- проверить, что выбрана опция  “Option\HLT Stops Simulation”;

- в меню  Rate  выбрать скорость Ultimate;

- в меню Tools выбрать команду “Peripheral Devices ” - откроется окно «Peripheral Devices» с 4 портами ввода-вывода. Под Device 1 обозначить порт вывода точкой на OUT и нажать на левую кнопку OFF, появится окно “8085 Simulator IDE” – в поле записи набрать адрес порта вывода 01, затем ОК и кнопка станет ON;

- в меню Simulation выбрать команду “Start”.

5.2.2 Листинг программы.

                 MVI A, 001H             ; пересылка из памяти в А

   L1:         MOV B, A                  ; AB

                 OUT 01H                    ; сброс из А в порт 01

                 CALL   ZAD              ; вызов п/п задержки

                 MOV A, B                 ; BA

                 RLC                           ; сдвиг влево

                 JMP L1                      ; Переход на L1

  ZAD:

                 LXI D, FF00H            ; загрузка пары DE

  L2:         DCX D                        ; DE = DE – 1

                 MOV A,D                   ; пересылка D→A

                 ORA E                        ; A v E = A

                 JNZ                             ; условный переход на L2

                 RET                             ; возврат из п/п ZAD

 

Рисунок 5.2 – Вид экрана с выполняемой программой

 

5.2.3 Моделирование программы визуальной сигнализации.

Набрать программу (назовем ее mig.asm), приведенную в таблицах 5.1,5.2 и загрузить в 8085 Simulator IDE. К i8085 подключить выходной порт 01h.

 

Т а б л и ц а 5.1 – Программа визуальной сигнализации mig.asm

Ассемблер

Комментарий

L1:     MVI A, 00FH

Пересылка числа 0Fh в А

OUT 01H

Вывод из А в порт 01

CALL ZAD

Вызов п/п ZAD

MVI A, 0F0H

Пересылка числа F0h в А

OUT 01H

Вывод из А в порт 01

CALL ZAD

Вызов п/п задержки

JMP L1

Переход к началу 2100

 

Т а б л и ц а 5.2 – Подпрограмма задержки времени     

Ассемблер

Комментарий

ZAD:    LXI D, FF00H

Загрузка пары DE

L2:        DCX D

DE = DE - 1

MOV A,D

Пересылка D→A

ORA E

A v E = A

JNZ L2

Условный переход на L2

RET

Возврат из п/п ZAD

 

5.3 Контрольные вопросы

 

1) Какой байт высветит число 8 на семисегментном индикаторе?

2) Какой байт высветит число 5 на семисегментном индикаторе?

3) Что представляет собой командный байт для i82C55?

4) Что означает фраза «программирование интерфейса»?

  

Список литературы 

1. Брей Б. Микропроцессоры INTEL. – СПб.: БХВ - Петербург, 2005.

2. Костров Б.В. Микропроцессорные системы и микроконтроллеры. – М.: «ТехБук», 2007.

3. Новиков Ю.В., Скоробогатов П.К. Основы микропроцессорной техники. – М.: БИНОМ. Лаборатория знаний, 2006.

4. Гилмор Ч. Введение в микропроцессорную технику – М.: Мир, 1983. 

 

Содержание 

1 Введение                                                                                                                   3

2 Лабораторная работа №1                                                                                        4

3 Лабораторная работа №2                                                                                        8

4 Лабораторная работа №3                                                                                      12

5 Лабораторная работа №4                                                                                      15

6 Лабораторная работа №5                                                                                      19

Список литературы                                                                                                   22