Индивидуальное задание №2: Программный секундомер
Задание
Реализовать программный секундомер, с выводом текущего времени на четырехразрядный семисегментный дисплей (порты 373-376)
Анализ задания
При реализации программного секундомера решаются три основные задачи: формирование программных задержек, вывод текущего времени на семисегментный дисплей, а так же хранение и инкрементация значения текущего времени.
Поскольку для индикации времени используется четырехразрядный дисплей, то необходимо хранить и выводит на дисплей только секунды и минуты.
Время хранится в регистрах B и C блока РОН в виде двоично-десятичных чисел. В регистре B хранятся минуты, в регистре C – секунды (старшие 4 разряда B – десятки минут, младшие – единицы минут; старшие 4 разряда C – десятки секунд, младшие – единицы секунд). Хранение времени в двоично-десятичном коде, позволяет многократно упростить процедуру вывода времени на дисплей. Но при этом несколько усложняется процедура инкрементации значения. Для правильной инкрементации необходимо сначала обычным способом инкрементировать значение регистра (B или C), а затем выполнить двоично-десятичную коррекцию получившегося результата.
Алгоритм инкрементации таков: сначала инкрементируется значение секунд, и оно сравнивается с 602/10. Если они равны, то значение секунд сбрасывается в ноль и инкрементируется значение минут. Затем значение минут сравнивается с числом 602/10 и если они оказываются равны, то значение минут обнуляется.
Формирование задержек реализуется за счет двух вложенных циклов, внутри которых формируются задержки. Подпрограмма задержки формирует программную задержку на 999665 тактов.
Вывод времени на дисплей происходит, начиная с младшего разряда (единицы секунд). Для этого из регистра C выделяются младшие четыре разряда, используя логическое ИЛИ с числом 000011112. Выделенное число – это значение единиц секунд. С использованием таблицы преобразования, это число преобразуется в семисегментный код, который выводится на дисплей в порт 373. Вывод остальных трех чисел производится аналогично.
Назначение РОН:
B – хранение минут;
C – хранение секунд;
D – счетчик числа итераций внешнего цикла задержки;
E – счетчик числа итераций внутреннего цикла задержки;
H – хранение базового адреса таблицы преобразования (H = 001);
L – хранение номера элемента таблицы преобразования;
A – хранение результатов математических и логических операций.
Схема алгоритма
см. следующую страницу
Текст программы
Адрес |
Код команды |
Мнемоника |
Комментарии |
Основная программа |
|||
000 |
061 |
LXI SP |
Инициализация указателя стека; H = 002, L = 000 |
001 |
000 |
B2 |
|
002 |
002 |
B3 |
|
003 |
046 |
MVI H |
Загрузка в H базового адреса таблицы перекодировки; H = 001 |
004 |
001 |
B2 |
|
005 |
006 |
MVI B |
Обнуление счетчика минут; B = 000 |
006 |
000 |
B2 |
|
007 |
016 |
MVI C |
Обнуление счетчика секунд; C = 000 |
010 |
000 |
B2 |
|
011 |
315 |
CALL |
Вызов подпрограммы вывода - выводит значение минут и секунд на семисегментный дисплей |
012 |
026 |
B2 |
|
013 |
000 |
B3 |
|
014 |
315 |
CALL |
Вызов подпрограммы задержки - формирует программную задержку |
015 |
073 |
B2 |
|
016 |
000 |
B3 |
|
017 |
315 |
CALL |
Вызов подпрограммы инкремента - инкрементирует значение времени |
020 |
133 |
B2 |
|
021 |
000 |
B3 |
|
022 |
303 |
JMP |
Безусловный переход - формируется бесконечный цикл |
023 |
011 |
B2 |
|
024 |
000 |
B3 |
|
Подпрогрпамма вывода |
|||
026 |
171 |
MOV A, C |
Пересылка из C в A; A = C |
027 |
346 |
ANI |
Логическое И с числом 00001111. Выделение младших четырех бит. |
030 |
017 |
B2 |
|
031 |
157 |
MOV L, A |
Пересылка из A в L индекса элемена таблицы перекодировки; L = A |
032 |
176 |
MOV A, M |
Загрузка в A 7-сегментного кода |
033 |
323 |
OUT |
Вывод на 7-сегментный дисплей единиц секунд |
034 |
373 |
B2 |
|
035 |
171 |
MOV A, C |
Пересылка из C в A; A = C |
036 |
017 |
RRC |
Циклический сдвиг вправо на 4 разряда - старшие 4 разряда оказываются в младших |
037 |
017 |
RRC |
|
040 |
017 |
RRC |
|
041 |
017 |
RRC |
|
042 |
346 |
ANI |
Логическое И с числом 00001111. Выделение младших четырех бит. |
043 |
017 |
B2 |
|
044 |
157 |
MOV L, A |
Пересылка из A в L индекса элемена таблицы перекодировки; L = A |
045 |
176 |
MOV A, M |
Загрузка в A 7-сегментного кода |
046 |
323 |
OUT |
Вывод на 7-сегментный дисплей десятков секунд |
047 |
374 |
B2 |
|
050 |
170 |
MOV A, B |
Пересылка из B в A; A = B |
051 |
346 |
ANI |
Логическое И с числом 00001111. Выделение младших четырех бит. |
052 |
017 |
B2 |
|
053 |
157 |
MOV L, A |
Пересылка из A в L индекса элемена таблицы перекодировки; L = A |
054 |
176 |
MOV A, M |
Загрузка в A 7-сегментного кода |
055 |
323 |
OUT |
Вывод на 7-сегментный дисплей единиц минут |
056 |
375 |
B2 |
|
057 |
170 |
MOV A, B |
Пересылка из B в A; A = B |
060 |
017 |
RRC |
Циклический сдвиг вправо на 4 разряда - старшие 4 разряда оказываются в младших |
061 |
017 |
RRC |
|
062 |
017 |
RRC |
|
063 |
017 |
RRC |
|
064 |
346 |
ANI |
Логическое И с числом 00001111. Выделение младших четырех бит. |
065 |
017 |
B2 |
|
066 |
157 |
MOV L, A |
Пересылка из A в L индекса элемена таблицы перекодировки; L = A |
067 |
176 |
MOV A, M |
Загрузка в A 7-сегментного кода |
070 |
323 |
OUT |
Вывод на 7-сегментный дисплей десятков минут |
071 |
376 |
B2 |
|
072 |
311 |
RET |
Возврат из подпрограммы |
Подпрограмма задержки |
|||
073 |
026 |
MVI D |
Загрузка в D числа повторений; (D) = 234 (в 8) = 156 (в 10) |
074 |
234 |
B2 |
|
075 |
036 |
MVI E |
Загрузка в E числа повторений; (E) = 000 - 256 повторений |
076 |
000 |
B2 |
|
077 |
041 |
LXI H |
Задержка на 10 тактов |
100 |
000 |
B2 |
|
101 |
001 |
B3 |
|
102 |
035 |
DCR E |
Декрементация E |
103 |
302 |
JNZ |
Условный переход по не нулю E |
104 |
077 |
B2 |
|
105 |
000 |
B3 |
|
106 |
025 |
DCR D |
Декрементация D |
107 |
302 |
JNZ |
Условный переход по не нулю D |
110 |
075 |
B2 |
|
111 |
000 |
B3 |
|
112 |
036 |
MVI E |
Загрузка в E числа повторений; (E) = 251 (в 8) = 169 (в 10) |
113 |
251 |
B2 |
|
114 |
041 |
LXI H |
Задержка на 10 тактов |
115 |
000 |
B2 |
|
116 |
001 |
B3 |
|
117 |
035 |
DCR E |
Декрементация E |
120 |
302 |
JNZ |
Условный переход по не нулю E |
121 |
114 |
B2 |
|
122 |
000 |
B3 |
|
123 |
042 |
SHLD |
Задержка на 31 такт |
124 |
000 |
B2 |
|
125 |
003 |
B3 |
|
126 |
021 |
LXI D |
|
127 |
000 |
B2 |
|
130 |
000 |
B3 |
|
131 |
177 |
MOV A, A |
|
132 |
311 |
RET |
Возврат из подпрограммы |
Подпрограмма инкремента |
|||
133 |
014 |
INR C |
Инкрементация секунд (С) |
134 |
171 |
MOV A, C |
Пересылка из C в A; A = C |
135 |
047 |
DAA |
Двоично-десятичная коррекция |
136 |
117 |
MOV C, A |
Пересылка из A в C; C = A |
137 |
356 |
XRI |
Сравнение аккумулятора с числом 60 в двоично-десятичном коде; A xor 01100000 |
140 |
140 |
B2 |
|
141 |
312 |
JZ |
Условный переход по флагу Z = 1 |
142 |
164 |
B2 |
|
143 |
000 |
B3 |
|
144 |
041 |
LXI H |
Задержка на 50 тактов |
145 |
000 |
B2 |
|
146 |
001 |
B3 |
|
147 |
041 |
LXI H |
|
150 |
000 |
B2 |
|
151 |
001 |
B3 |
|
152 |
041 |
LXI H |
|
153 |
000 |
B2 |
|
154 |
001 |
B3 |
|
155 |
041 |
LXI H |
|
156 |
000 |
B2 |
|
157 |
001 |
B3 |
|
160 |
041 |
LXI H |
|
161 |
000 |
B2 |
|
162 |
001 |
B3 |
|
163 |
311 |
RET |
Возврат из подпрограммы |
164 |
004 |
INR B |
Инкрементация минут (B) |
165 |
170 |
MOV A, B |
Пересылка из B в A; A = B |
166 |
047 |
DAA |
Двоично-десятичная коррекция |
167 |
107 |
MOV B, A |
Пересылка из A в B; B = A |
170 |
016 |
MVI C |
Обнуление секунд (С) |
171 |
000 |
B2 |
|
172 |
356 |
XRI |
Сравнение аккумулятора с числом 60 в двоично-десятичном коде; A xor 01100000 |
173 |
140 |
B2 |
174 |
312 |
JZ |
Условный переход по флагу Z = 1 |
175 |
202 |
B2 |
|
176 |
000 |
B3 |
|
177 |
366 |
ORI |
Задержка на 7 тактов |
200 |
377 |
B2 |
|
201 |
311 |
RET |
Возврат из подпрограммы |
202 |
006 |
MVI B |
Обнуление минут (В) |
203 |
000 |
B2 |
|
204 |
311 |
RET |
Возврат из подпрограммы |
Таблица перекодировки |
|||
H = 001 |
077 |
00111111 |
0 |
L = 000 |
|||
001 |
006 |
00000110 |
1 |
002 |
133 |
01011011 |
2 |
003 |
117 |
01001111 |
3 |
004 |
146 |
01100110 |
4 |
005 |
155 |
01101101 |
5 |
006 |
175 |
01111101 |
6 |
007 |
007 |
00000111 |
7 |
010 |
177 |
01111111 |
8 |
011 |
157 |
01101111 |
9 |
Результаты
В результате на семисегментном дисплее виден счет времени (минуты и секунды).
Выводы
Процессор Intel 8080 обладает довольно большим списком возможностей, но при этом, по большей части, эти возможности реализованы не очень удобно. Так, например, неудобно реализованы математические функции. Обязательно один из операндов должен находиться в аккумуляторе и результат помещается на его место. В задачах, в которых происходит последовательная обработка введенных на первом этапе данных ( ). Но в остальных случаях это оказывается неудобно из-за того, что приходится выполнять много пересылок между аккумулятором и другими регистрами РОН. Так же, аккумулятор оказывается невозможно полноценно использовать в качестве регистра общего назначения.
Кроме того, в качестве примера можно привести команды сдвигов. В списке команд процессора присутствует четыре команды различных видов сдвигов, но при этом все они выполняют циклические сдвиги. А если необходимо выполнить простой арифметический сдвиг необходимо выполнять предварительные операции.
Так же большим недостатком процессора является отсутствие аппаратно реализованных умножителей и делителей. В результате, в случае необходимости выполнить умножение или деление (кроме умножения и деления на степени двойки (2, 4, 8, 16 …), которые реализуются с помощью сдвигов) необходимо писать подпрограммы. Эти подпрограммы занимают память и выполняются медленно, из-за чего очень сильно увеличивается время выполнения основной программы. Но этот недостаток объясняется тем, что процессор содержит всего 4500 транзисторов и реализовать умножители и делители на нем просто невозможно.
Из преимуществ системы команд самым большим является ее простота. Система команд i8080 содержит всего 3 формата команд: однобайтовый, двухбайтовый и трехбайтовый. Кроме того код операции всегда содержится в начале команды и занимает ровно один байт. В результате этого система команд процессора Intel 8080 проста в изучении и применении.
Из недостатков архитектуры процессора i8080, можно назвать довольно маленькое количество регистров общего назначения. Всего регистров 7 штук (B, C, D, E, H, L и A) и регистр M, который обозначает память. Из этих семи регистров аккумулятор A трудно использовать как РОН по названным ранее причинам. Так же регистровая пара HL, оказывается неудобна для использования из-за того, что в ней должен храниться адрес ячейки памяти при косвенной адресации. В результате остается только 4 регистра, которые можно использовать полностью, а такого количества очень мало. Как следствие этого приходится часто обращаться к памяти для хранения данных.
Так же недостатком архитектура процессора является система обозначений регистров общего назначения. Одной и той же буквой (B, D, H) обозначается одновременно и регистровая пара (BC, DE, HL) и отдельные регистры. Из-за этого могут возникать трудности при написании программ. В последующих процессорах фирмы Intel, эта проблема была решена путем изменения названий регистров. Например, шестнадцатиразрядная регистровая пара обозначается bx, а отдельные регистры обозначаются bh (старший байт) и bl (младший байт).