ПРИЛОЖЕНИЕ 5
Программа.
Метка | Команда | Комментарий |
MVI A, 90h | Настройка ППИ (датчики, управление). | |
OUT F3h | ||
MVI A, FFh | Выключаем всю сигнализацию и управление. | |
OUT F2h | ||
MVI A, 82h | Настройка ППИ (индикация, клавиатура). | |
OUT FBh | ||
LXI SP, F400h | Инициализация стека. | |
LDA 06FEh | Перенос адресов подпрограмм из ПЗУ в ОЗУ. | |
STA F70Eh | ||
LDA 06FFh | ||
STA F71Eh | ||
LDA 0700h | ||
STA F72Eh | ||
LDA 0701h | ||
STA F73Eh | ||
LDA 0702h | ||
STA F70Dh | ||
LDA 0703h | ||
STA F71Dh | ||
LDA 0704h | ||
STA F72Dh | ||
LDA 0705h | ||
STA F73Dh | ||
LDA 0706h | ||
STA F70Bh | ||
LDA 0707h | ||
STA F71Bh | ||
LDA 0708h | ||
STA F72Bh | ||
LDA 0709h | ||
STA F73Bh | ||
LDA 070Ah | ||
STA F707h | ||
LDA 070Bh | ||
STA F717h | ||
LDA 070Ch | ||
STA F727h | ||
LDA 070Bh | ||
STA F737h | ||
MVI A, 30h | Настройка таймера. | |
OUT 03h | ||
MVI A, 30h | ||
OUT 00h | ||
MVI A, 75h | ||
OUT 00h | ||
JMP OPR2 | Переход к основной программе. | |
M1 | PUSH PSW | Подпрограмма обработки прерывания. |
PUSH B | ||
PUSH D | ||
PUSH H | ||
LDA F701h | Начало ввода с клавиатуры | |
RLC | ||
RLC | ||
RLC | ||
RLC | ||
OUT FAh | Сканирование | |
MOV E,A | ||
MVI D, F7h | ||
IN F9h | Ввод с клавиатуры | |
XRI F0h | Обнуление старших битов | |
ADD E | ||
MOV E, A | ||
LDAX D | ||
MVI H, 07h | ||
MOV L, A | ||
PCHL | Вызов подпрограммы конкретной клавиши | |
M2 | LDA F701h | Начало индикации |
MVI D,F7h | ||
MVI E, FCh | ||
ADD E | ||
MOV E, A | ||
LDAX D | Чтение символа для индикации | |
MVI D, 06h | ||
MVI E, F0h | ||
ADD E | ||
LDAX D | Чтение кода символа из ПЗУ | |
OUT F8 | Вывод на индикаторы | |
LDA F701h | Изменяем значение счетчика сканирования | |
INR A | ||
STA F701h | ||
XRI 04h | ||
JNZ M4 | ||
STA F701h | Изменили | |
M4 | MVI A, 30h | Настройка таймера. |
OUT 03h | ||
MVI A, 30h | ||
OUT 00h | ||
MVI A, 75h | ||
OUT 00h | ||
POP H | ||
POP D | ||
POP B | ||
POP PSW | ||
RET | Выход из подпрограммы обработки прерывания | |
Подпрограммы клавиш | ||
MVI A, 00h | «0» | |
JMP M3 | ||
MVI A, 01h | «1» | |
JMP M3 | ||
MVI A, 02h | «2» | |
JMP M3 | ||
MVI A, 03h | «3» | |
JMP M3 | ||
MVI A, 04h | «4» | |
JMP M3 | ||
MVI A, 05h | «5» | |
JMP M3 | ||
MVI A, 06h | «6» | |
JMP M3 | ||
MVI A, 07h | «7» | |
JMP M3 | ||
MVI A, 08h | «8» | |
JMP M3 | ||
MVI A, 09h | «9» | |
JMP M3 | ||
M3 | STA F702h | Сохранение данных из аккумулятора |
LDA F703h | Проверка режима ввода | |
XRI 00h | ||
JZ M2 | Проверка окончена | |
LDA F705h | Проверка: сброшена ли ячейка ввода. | |
XRI 00h | ||
JNZ M2 | Проверили. | |
LDA F7FDh | ||
STA F7FEh | Переписали со второй позиции в третью | |
LDA F7FCh | ||
STA F7FDh | Переписали с первой позиции во вторую | |
LDA F702h | ||
STA F7FCh | Записали в первую позицию новое число | |
JMP M2 | Индикация | |
«С» | ||
LDA F703h | Проверка режима ввода | |
XRI 00h | ||
JZ M2 | Проверили | |
MVI A,00h | Обнуляем: аккумулятор, | |
STA F7FCh | первую позицию, | |
STA F7FDh | вторую, | |
STA F7FEh | третью, | |
STA F705h | индикатор сброса. | |
JMP M2 | Индикация | |
«Ent» | ||
JMP ENT | ||
ENT | LDA F703h | Проверка режима ввода |
XRI 00h | ||
JZ M2 | Проверили | |
LDA F703h | Идентификация адреса ввода. | |
RLC | ||
RLC | ||
MOV E, A | ||
LDA F7FFh | ||
RLC | ||
RLC | ||
RLC | ||
RLC | ||
ADD E | ||
MOV E, A | ||
MVI D, F6h | Идентификация завершена. | |
LDA F7FCh | Пересылка данных с индикаторов в память. | |
STAX D | ||
INR E | ||
LDA F7FDh | ||
STAX D | ||
INR E | ||
LDA F7FEh | ||
STAX D | Пересылка окончена. | |
MVI A, 01h | ||
STA F705h | Установка индикатора сброса в [1] | |
JMP M2 | Индикация. | |
«A» | ||
JMP A | ||
A | MVI A, 0Ah | Фиксируем датчик |
STA F7FFh | в памяти. | |
CALL REPEAT | Проверка повторного выбора. | |
JMP M2 | Индикация. | |
«B» | ||
JMP B | ||
B | MVI A, 0Bh | Фиксируем датчик |
STA F7FFh | в памяти. | |
CALL REPEAT | Проверка повторного выбора. | |
JMP M2 | Индикация. | |
«C» | ||
JMP C | ||
C | MVI A, 0Ch | Фиксируем датчик |
STA F7FFh | в памяти. | |
CALL REPEAT | Проверка повторного выбора. | |
JMP M2 | Индикация. | |
«D» | ||
JMP D | ||
D | MVI A, 0Dh | Фиксируем датчик |
STA F7FFh | в памяти. | |
CALL REPEAT | Проверка повторного выбора. | |
JMP M2 | Индикация. | |
REPEAT | LDA F706h | Проверяем повторный выбор датчика. |
MOV C, A | ||
LDA F701h | ||
XRA C | ||
JZ M5 | Проверили. | |
LDA F701h | ||
STA F706h | ||
MVI A, 00h | ||
STA F703h | Обнуляем индикатор изменения информации | |
M5 | LDA F703h | |
INR A | Увеличиваем на единицу | |
MOV C, A | индикатор изменения информации | |
XRI 03h | и проверяем | |
JNZ M6 | на переполнение. | |
MVI A, 00h | ||
STA F703h | ||
JMP IDEN | ||
M6 | MOV A, C | |
STA F703h | ||
IDEN | RLC | Идентификация адреса вывода информации. |
RLC | ||
MOV E, A | ||
LDA F7FFh | ||
RLC | ||
RLC | ||
RLC | ||
RLC | ||
ADD E | ||
MOV E, A | ||
MVI D, F6h | Идентификация завершена. | |
LDAX D | Пересылка данных из памяти на индикаторы. | |
STA F7FCh | ||
INR E | ||
LDAX D | ||
STA F7FDh | ||
INR E | ||
LDAX D | ||
STA F7FEh | Пересылка окончена. | |
RET | Конец подпрограммы. | |
Основная программа. | ||
OPR2 | MVI A, F0h | Опрос датчиков. |
STA F500h | ||
OPR1 | LDA F500h | Читаем порядковый номер датчика |
RLC | Сдвигаем для передачи в порт | |
RLC | ||
RLC | ||
RLC | ||
OUT F1h | Отправляем в порт | |
XRI 01h | ||
OUT F1h | ||
NOP | ||
NOP | ||
NOP | ||
NOP | ||
XRI 02h | ||
OUT F1h | ||
IN F0h | Ввод информации с датчика. | |
SUI 33h | ||
JNC WREM | ||
При обрыве датчика выводим на индикаторы [- - -]. | ||
LDA F500h | Идентификация адреса ввода. | |
ADI 0Ah | ||
SUI F0h | ||
RLC | ||
RLC | ||
RLC | ||
RLC | ||
MOV E, A | ||
MVI D, F6h | Идентификация завершена. | |
MVI A, BFh | Код символа [-]. | |
STAX D | ||
INX D | ||
STAX D | ||
INX D | ||
STAX D | ||
JMP WR1 | Переход к следующему датчику. | |
WREM | STA F4FFh | Временно сохраняем результат в ячейке памяти. |
CALL SRAVN | ||
WR1 | LDA F500h | |
INR A | Увеличиваем порядковый номер опрашиваемого датчика. | |
STA F500h | ||
XRI F4h | Проверяем счетчик на переполнение. | |
JNZ OPR1 | Продолжаем опрос. | |
JMP OPR2 | Возобновляем опрос. | |
SRAVN | MVI D, 00h | Преобразование, сохранение и сравнение данных. |
LDA F4FFh | ||
MOV E, A | ||
LDA F500h | ||
INR A | ||
MOV C, A | ||
MVI B, 00h | ||
XRA A | Программа перевода числа из 16-тиричной в 10-тичную систему. | |
MVI D, F4h | ||
MVI E, FCh | ||
STAX D | ||
DCX D | ||
STAX D | ||
DCX D | ||
STAX D | ||
BEG | DCX B | |
LDAX D | ||
INR A | ||
STAX D | ||
XRI 0Ah | ||
JNZ B | ||
MVI A, 00h | ||
STAX D | ||
INX D | ||
LDAX D | ||
INR A | ||
STAX D | ||
XRI 0Ah | ||
JNZ B1 | ||
MVI A, 00h | ||
STAX D | ||
INX D | ||
LDAX D | ||
INR A | ||
STAX D | ||
XRI 0Ah | ||
JNZ B2 | ||
MVI A, 86h | Символ [E] выводится на индикаторы, если число больше 999. | |
STAX D | ||
DCX D | ||
STAX D | ||
DCX D | ||
STAX D | ||
JMP ENDE | ||
B2 | DCX D | |
B1 | DCX D | |
B | MOV A, B | |
XRI 00h | ||
JNZ BEG | ||
MOV A, C | ||
XRI 00h | ||
JNZ BEG | ||
Запись в соответствующую ячейку памяти | ||
ENDE | LDA F500h | Идентификация адреса ввода. |
ADI 0Ah | ||
SUI F0h | ||
RLC | ||
RLC | ||
RLC | ||
RLC | ||
MOV E, A | ||
MVI D, F6h | Идентификация завершена. | |
LDA F4FAh | ||
STAX D | ||
INX D | ||
LDA F4FBh | ||
STAX D | ||
INX D | ||
LDA F4FCh | ||
STAX D | Запись окончена. | |
Сравнение. | ||
SR | LDAX D | |
MOV H, A | ||
MVI B, F6h | ||
MVI A, 04h | ||
ADD E | ||
MOV C, A | ||
LDAX B | Загрузка “минимума”. | |
SUB H | Вычитаем текущее значение из “минимума”. | |
JNC ALARM1 | Если нет переноса, значит текущее значение меньше “минимума”. | |
MVI A, 08h | ||
ADD E | ||
MOV C, A | ||
LDAX B | Загрузка “максимума”. | |
SUB H | Вычитаем текущее значение из “максимума”. | |
JC ALARM2 | Если есть перенос, то текущее значение больше “максимума”. | |
MOV A, E | ||
ANI 0Fh | ||
JNZ PER | Если проверили все разряды и все в порядке, то отменяем сигнализацию. | |
LDA F500h | Поиск сигнала для отмены и формирование управляющих слов. | |
ANI 0Fh | ||
JNZ S1 | ||
MVI A, 01h | ||
JMP SIG | ||
S1 | MOV B, A | |
XRI 01h | ||
JNZ S2 | ||
MVI A, 03h | ||
JMP SIG | ||
S2 | MOV A, B | |
XRI 02h | ||
JNZ S3 | ||
MVI A, 05h | ||
JMP SIG | ||
S3 | MVI A, 07 | |
PER | DCX D | Переходим к меньшему разряду. |
JMP SR | ||
ALARM1 | LDA F500h | |
ANI 0Fh | ||
JZ A11 | ||
MOV B, A | ||
XRI 01h | ||
JZ A12 | ||
MOV A, B | ||
XRI 02h | ||
JZ A13 | ||
MOV A, B | ||
XRI 03h | ||
JZ A14 | ||
ALARM2 | LDA F500h | |
ANI 0Fh | ||
JZ A11 | ||
MOV B, A | ||
XRI 01h | ||
JZ A12 | ||
MOV A, B | ||
XRI 02h | ||
JZ A23 | ||
MOV A, B | ||
XRI 03h | ||
JZ A14 | ||
A11 | MVI A, 00h | |
JMP SIG | ||
A12 | MVI A, 02h | |
JMP SIG | ||
A13 | MVI A, 0Bh | |
OUT F3h | ||
MVI A, 08h | ||
OUT F3h | ||
MVI A, 04h | ||
JMP SIG | ||
A23 | MVI A, 09h | |
OUT F3h | ||
MVI A, 0Ah | ||
OUT F3h | ||
MVI A, 04h | ||
JMP SIG | ||
A14 | MVI A, 06h | |
JMP SIG | ||
SIG | OUT F3h | Посылаем команду управления (сигнализации). |
JMP ENDSR | ||
ENDSR | RET | Выход из подпрограммы преобразования, сохранения и сравнения. |