курсач бегущая строка / программа зе ласт
.docx|
метка |
мнемокод |
комментарий |
|
|
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 |
