2.2 Блок-схема программы
Общий алгоритм работы программы заключается в опросе клавиатуры, идентификации нажатой клавиши, сравнении полученных данных с данными, хранящимися в ячейках ПЗУ и последующий вывод на индикаторы символов.
Программа условно состоит из нескольких блоков, взаимосвязанных между собой: начало, сканирование клавиатуры, идентификация символа, поиск символа, Вывод на индикаторы. Полная блок-схема программы находится в приложении Б.
Наиболее важными блоками программы я считаю идентификацию символа и вывод символа на индикаторы. Их мы рассмотрим ниже более подробно, но прежде всего, хотелось бы рассказать об организации данных в ячейках ПЗУ.
В ячейках ПЗУ хранятся данные о 25 символах, которые возможно ввести с клавиатуры (рис.9). Полная таблица символов находится в Приложении A. В ячейках ПЗУ символы расположены «блоками» по номеру столбца. Начиная с ячейки 0400 в памяти хранятся данные о 5 символах, расположенных в 1, 2,3,4,5 столбцах. Каждому символу соответствует номер столбца в котором он находится и семисегментный код символа, который выводится на индикатор (рис.10).
|
Enter
|
5 |
0 |
E |
L |
|
1
|
6 |
A |
F |
O |
|
2
|
7 |
B |
G |
P |
|
3
|
8 |
C |
H |
S |
|
4
|
9 |
D |
I |
(ПРОБЕЛ) |
Рисунок 9. Расположение символов на клавиатуре
|
Номер ячейки |
Коды: столбец, Семисегментный код |
Номер столбца в шестнадцатиричной системе счисления |
Кнопка (символ) |
|
0400 |
XXX11110 |
1E |
Enter |
|
0401 |
|
|
|
|
0402 |
XXX11110 |
1E |
1 |
|
0403 |
00000110 |
|
|
|
0404 |
XXX11110 |
1E |
2 |
|
0405 |
01011011 |
|
|
|
0406 |
XXX11110 |
1E |
3 |
|
0407 |
01001111 |
|
|
|
0408 |
XXX11110 |
1E |
4 |
|
0409 |
01100110 |
|
|
|
040A |
XXX11101 |
1D |
5 |
|
040B |
01101101 |
|
|
|
040C |
XXX11101 |
1D |
6 |
|
040D |
01111101 |
|
|
Рисунок 10. Данные в ячейках ПЗУ
Полная таблица символов находится в приложении Б.
С помощью этой таблицы и происходит идентификация символа. Данные, пришедшие из порта С программируемого периферийного параллельного адаптера, сравниваются с номером столбца, в котором находится символ. Как только номер столбца совпадает – это значит, мы попали в участок памяти ПЗУ, где последовательно хранятся символы, расположенные в этом столбце, но в разных строках: 1,2,3,4,5. Блок-схема этого участка программы приведена на рисунке 11.
Рисунок
11. Блок-схема идентификации символа
С помощью счетчика, на который приходят данные из порта A, мы отсчитываем нужное количество строк от самого первого символа, имеющего нужный нам номер столбца. Таким образом, мы находим адрес ячейки, которая соответствует нажатому символу. Увеличивая на единицу адрес, мы переходим в ячейку, в которой хранится семисегментный код символа и записываем его в самую первую ячейку памяти ОЗУ – 0800. Точно так же поступаем со всеми нажатыми клавишами, и в итоге, в ОЗУ мы имеем таблицу, состоящую из кодов символов, которые были нажаты.
Каким же образом осуществляется бегущая строка? Наглядно этот процесс иллюстрирует блок-схема на рисунке 12.

Рисунок 12. Блок-схема вывода информации на индикаторы
На индикаторы последовательно выводятся коды символов, хранящиеся друг за другом в ОЗУ. Причем каждый последующий символ выводится на последующий индикатор. То есть на 1 индикатор выводится символ, хранящийся в 1 ячейке памяти ОЗУ. После чего индикатор гасится. Дальше на 2 индикатор выводится символ, хранящийся следующей ячейке памяти. Учитывая, что скорость выполнения операций процессором очень высока, человеческий глаз воспримет это как последовательность символов, которые одновременно выведены на индикаторы.
Как только все символы выведены на индикаторы по одному разу происходит обмен данными в ячейках ОЗУ. Так как каждый раз при выводе символов чтение начинается с первой ячейки, можно заменить данные 1 ячейки, на данные второй. Данные второй - на данные третьей и так далее. В результате при выводе на индикаторы мы увидим, что символы сместились влево на 1 знак. То есть на месте первого символа теперь второй. После вывода всех семи – снова происходит обмен данными между ячейками памяти и снова вывод на индикаторы. На большой скорости осуществления этих операций человеческий глаз видит бегущую строку символов.
Листинг программы приведен в Приложении Г.
Заключение
В ходе выполнения курсового проекта, были реализованы поставленные цели и задачи: составлена функциональная схема устройства, изучена и проанализирована элементная база, на основе которой была составлена принципиальная схема устройства. Изучена литература, описывающая работу и разновидности микросхем, а также программную реализацию различных задач в микропроцессорной технике на языке ассемблер. Построена блок-схема программы и составлена сама программа работы устройства индикации «Бегущая строка». Предложенные мною алгоритмы реализации не являются единственно возможным решением задачи. В зависимости от установленных ограничений воплотить данное устройство в жизнь можно и другими способами.
Список используемой литературы
1. Шило В.Л. Популярные цифровые микросхемы: Справочник. – М.: Радио и связь, 1987. – 352с.: ил.
2.Алхимов Ю.В. Микропроцессоры и цифровые системы в неразрушающем контроле: Учебное пособие. – ТПУ:2008. – 245с.
3. Электронный ресурс www.wikipedia.org
4.Р. Токхайм. Микропроцессорные системы. Курс и упражнения. М: Энегоатомиздат, 1988. – 168с.
Приложения
Приложение A. Таблица ячеек памяти ПЗУ
|
Номер ячейки |
Коды: столбец, Семисегментный код |
Номер столбца в шестнадцатиричной системе счисления |
Кнопка (символ) |
|
0400 |
XXX11110 |
1E |
Enter |
|
0401 |
|
|
|
|
0402 |
XXX11110 |
1E |
1 |
|
0403 |
00000110 |
|
|
|
0404 |
XXX11110 |
1E |
2 |
|
0405 |
01011011 |
|
|
|
0406 |
XXX11110 |
1E |
3 |
|
0407 |
01001111 |
|
|
|
0408 |
XXX11110 |
1E |
4 |
|
0409 |
01100110 |
|
|
|
040A |
XXX11101 |
1D |
5 |
|
040B |
01101101 |
|
|
|
040C |
XXX11101 |
1D |
6 |
|
040D |
01111101 |
|
|
|
040E |
XXX11101 |
1D |
7 |
|
040F |
00000111 |
|
|
|
0410 |
XXX11101 |
1D |
8 |
|
0411 |
01111111 |
|
|
|
0412 |
XXX11101 |
1D |
9 |
|
0413 |
01101111 |
|
|
|
0415 |
XXX11011 |
1B |
0 |
|
0416 |
00111111 |
|
|
|
0417 |
XXX11011 |
1B |
A |
|
0418 |
01110111 |
|
|
|
0419 |
XXX11011 |
1B |
B |
|
041A |
01111100 |
|
|
|
041B |
XXX11011 |
1B |
C |
|
041C |
00111001 |
|
|
|
041D |
XXX11011 |
1B |
D |
|
041E |
01011110 |
|
|
|
041F |
XXX10111 |
17 |
E |
|
0420 |
01111001 |
|
|
|
0421 |
XXX10111 |
17 |
F |
|
0422 |
01111001 |
|
|
|
0423 |
XXX10111 |
17 |
G |
|
0424 |
01110001 |
|
|
|
0425 |
XXX10111 |
17 |
H |
|
0426 |
01110110 |
|
|
|
0427 |
XXX10111 |
17 |
I |
|
0428 |
00110000 |
|
|
|
0429 |
XXX01111 |
0F |
L |
|
042A |
00111000 |
|
|
|
042B |
XXX01111 |
0F |
O |
|
042C |
O 00111111 |
|
|
|
042D |
XXX01111 |
0F |
P |
|
042E |
01110011 |
|
|
|
042F |
XXX01111 |
0F |
S |
|
0430 |
01101101 |
|
|
|
0431 |
XXX01111 |
0F |
Пробел |
|
0432 |
00000000 |
|
|
Приложение В. Спецификация
|
Обозначение |
Наименование |
Количество |
|
|
Детали |
|
|
R1 |
МЛТ-0,25-100кОм+-5% |
1 |
|
R4 |
МЛТ-0,25-10кОм+-5% |
|
|
R2-R3, R5-R12 |
МЛТ-0,25-1кОм+-5% |
10 |
|
С1-С2 |
Л50-6-15-10пФ+-5% |
2 |
|
|
|
|
|
|
Стандартные изделия |
|
|
DD1 |
Intel 8085 |
1 |
|
DD2 -DD3 |
1533ИР22 |
2 |
|
DD4 |
К561ЛН1 |
1 |
|
DD5 |
К1554ЛЕ1 |
2 |
|
DD6 |
К564ИД7 |
1 |
|
DD7 |
КР580ВВ55 |
1 |
|
DD8 |
КР573РФ2 |
1 |
|
DD9 |
KР537РУ8 |
1 |
|
DD10 |
АЛС324 |
7 |
|
DD11 |
PBS-14A |
25 |
Приложение Г. Программа
|
метка |
мнемокод |
комментарий |
|
|
ORG 0h |
Начало |
|
|
MVI A, 89h |
Инициализация портов |
|
|
OUT 13h |
Порт А выход, В – выход, С0-С3 вход, С4-С7 вход |
|
SCAN |
MVI B, 8h |
Счетчик количества символов |
|
|
MVI C,1h |
Счетчик номера индикатора (номера строки) регистр С, присваиваем значение 1 |
|
|
LXI D, 0800 |
|
|
SCAN1 |
MOV A,C |
Программа опроса клавиатуры |
|
|
OUT 10h |
Посылаем номер индикатора (строки) в порт A |
|
|
IN 12h |
Считываем в аккумулятор данные из порта С |
|
|
ANI 1F |
Операция «И». Из поступившего в аккумулятор символа значение имеют младшие 5 разрядов |
|
|
MOV D, A |
В регистре D храним информацию что было получено из порта С |
|
|
CMP 1F |
Вычитание числа 1F из значения аккумулятора (если кнопка не нажата, в аккумуляторе значение 1F) |
|
|
JNZ IDEN |
Если разница не равна нулю – кнопка нажата, переход к идентификации символа |
|
|
MOV А,С |
Если кнопка не нажата: сдвиг влево номера индикатора |
|
|
RAL |
|
|
|
MOV С,А |
|
|
|
MOV А,С |
|
|
|
CPI 80h |
Проверка: это номер последнего индикатора? |
|
|
JNZ L1 |
Если нет - переход к метке L1 |
|
|
MVI C, 1h |
Если да – номеру индикатора присваивается номер 1 |
|
L1 |
JMP SCAN1 |
Возврат к началу опроса клавиатуры |
|
IDEN |
CPI C, 01h |
Программа идентификации символа Кнопка нажата в первой строке? |
|
|
JNZ L2 |
Если нет переход к L2 |
|
|
MOV A, D |
|
|
|
CPI 1E |
Если да, то проверка: кнопка нажата в первом столбце? |
|
|
JZ VIVOD |
Если да – это кнопка Enter и переход к выводу символов на индикатор |
|
L2 |
INX B |
Счетчик числа символов увеличивается на 1 |
|
|
MOV A, B |
|
|
|
CPI 8 |
Введенный символ восьмой? |
|
|
JNZ L9 |
Если нет, переходим к поиску символа |
|
|
MVI А,00h |
Если да - обнуление индикаторов |
|
|
OUT 11h |
|
|
|
LXI H, 0800h |
Обнуление ОЗУ. Начинаем с первой ячейки |
|
|
MVI E, 8h |
Счетчик цикла E=8 |
|
L10 |
MOV M, A |
Записываем в ячейку значение аккумулятора (ноль) |
|
|
INX H |
Переход к следующей ячейке |
|
|
DCR E |
Уменьшение счетчика на 1 |
|
|
MOV A, E |
|
|
|
CPI 0h |
Счетчик равен нулю? |
|
|
JNZ L9 |
Если нет, переход в начало цикла в L10 |
|
L9 |
MOV A, D |
Поиск символа |
|
|
CPI 1E |
Кнопка в первом столбце? |
|
|
JNZ L4 |
Если нет – переход к L4 |
|
|
LXI H, 0400 |
|
|
|
JMP M0 |
|
|
L4 |
CPI 1D |
Кнопка во втором столбце? |
|
|
LXI H, 040A |
|
|
|
JNZ L5 |
Если нет – переход к L5 |
|
|
JMP M0 |
|
|
L5 |
CPI 1B |
Кнопка в третьем столбце? |
|
|
LXI H, 0415 |
|
|
|
JNZ L6 |
Если нет – переход к L6 |
|
|
JMP M0 |
|
|
L6 |
CPI 17 |
Кнопка в четвертом столбце? |
|
|
LXI H, 041F |
|
|
|
JNZ L7 |
Если нет – переход к L7 |
|
|
JMP M0 |
|
|
L7 |
LXI H, 0429 |
Кнопка в пятом столбце. |
|
M0 |
MOV A, C |
|
|
|
CPI 01h |
Кнопка в 1 строке? |
|
|
JNZ M1 |
Если нет– переход к M1 |
|
|
JMP M |
|
|
M1 |
MOV A, C |
|
|
|
CPI 02h |
Кнопка во 2 строке? |
|
|
JNZ L3 |
Если нет – переход к M2 |
|
|
MOV A, L |
|
|
|
ADI 2h |
Если да – регистр L увеличиваем на 2 |
|
|
JMP M |
|
|
M2 |
MOV A, C |
|
|
|
CPI 04h |
Кнопка в 3 строке? |
|
|
JNZ M3 |
Если нет – переход к M3 |
|
|
MOV A, L |
|
|
|
ADI 4h |
Если да – регистр L увеличиваем на 4 |
|
|
JMP M |
|
|
M3 |
MOV A, C |
|
|
|
CPI 08h |
Кнопка в 4 строке? |
|
|
JNZ M4 |
Если нет – переход к M4. |
|
|
MOV A, L |
Если да – регистр L увеличиваем на 6 |
|
|
ADI 6h |
|
|
|
JMP M |
|
|
M4 |
ADI 8h |
Строка пятая – регистр L увеличиваем на 8 |
|
M |
INX H |
Переход к следующей ячейке, где хранится семисегментный код символа |
|
|
MOV A, M |
Запись кода в аккумулятор |
|
|
MOV D, A |
|
|
|
INX D |
|
|
|
JMP SCAN1 |
|
|
VIVOD |
MVI C, 1h |
Программа вывода символов. Счетчик номера индикатора=1 |
|
|
LXI H, 0800 |
Начинаем вывод я ячейки ОЗУ 0800 |
|
VIVOD1 |
MOV A, M |
Отправляем код символа в порт B |
|
|
OUT 11h |
|
|
|
MOV A, C |
Отправляем номер индикатора в порт A |
|
|
OUT 10h |
|
|
|
MVI E,FF |
Начало программы создания временной задержки |
|
|
MVI D,FF |
|
|
|
NOP |
|
|
|
DCR D |
|
|
|
JNZ L5 |
|
|
|
DCR E |
|
|
|
JNZ L6 |
|
|
|
MVI А,00Н |
Гашение индикатора |
|
|
OUT 11h |
|
|
|
INX H |
Инкремент адреса ячейки памяти |
|
|
MOV А,С |
Сдвиг влево номера индикатора |
|
|
RAL |
|
|
|
MOV С,А |
|
|
|
MOV A, C |
|
|
|
CPI 80h |
Индикатор седьмой? |
|
|
JNZ VIVOD1 |
Если нет– переход к следующему символу на метку VIVOD1 |
|
CHANGE |
LXI H, 0800h |
Меняем значения ячеек памяти ОЗУ |
|
|
MOV A, H |
|
|
|
MOV E, A |
|
|
|
MVI D, 06h |
|
|
|
LXI H, 0801h |
|
|
L8 |
MOV A, H |
|
|
|
DCR H |
|
|
|
MOV M, A |
|
|
|
INX H |
|
|
|
INX H |
|
|
|
DCR D |
|
|
|
MOV A, D |
|
|
|
CPI 8h |
|
|
|
JNZ L8 |
|
|
|
LXI H, 0806h |
|
|
|
MOV A, E |
|
|
|
MOV M, A |
|
|
|
MVI C,1h |
Проверка: нажата ли какая-нибудь клавиша? (чтобы была возможность прервать бегущую строку) Счетчик номера строки регистр С, присваиваем значение 1 |
|
|
MVI A, 00h |
Обнуляем аккумулятор |
|
L12 |
MOV A,C |
Программа опроса клавиатуры2 |
|
|
OUT 10h |
Посылаем номер строки в порт A |
|
|
IN 12h |
Считываем в аккумулятор данные из порта С |
|
|
ANI 1F |
Операция «И». Из поступившего в аккумулятор символа значение имеют младшие 5 разрядов |
|
|
|
|
|
|
CPI 1F |
Вычитание числа 1F из значения аккумулятора (если кнопка не нажата, в аккумуляторе значение 1F) |
|
|
JNZ SCAN |
Если разница не равна нулю – кнопка нажата, переход к началу программы |
|
|
MOV D, A |
|
|
|
MOV А,С |
В противном случае, если кнопка не нажата: сдвиг влево номера индикатора |
|
|
RAL |
|
|
|
MOV С,А |
|
|
|
MOV A, C |
|
|
|
CPI 80h |
Проверка: это номер последнего индикатора? |
|
|
JNZ L11 |
Если нет - переход к метке L11 |
|
|
MVI C, 1h |
Если да – номеру индикатора присваивается номер 1 |
|
L11 |
JMP L12 |
Возврат к началу опроса клавиатуры 2 – L12 |
