;так как во втором байте может содержаться любое значение
;в диапазоне 01-255, то единственным ошибочным значением будет нуль
INX H ;увеличение указателя
MVI A, 0H ;загрузка нуля в аккумулятор
ORA M ;установка флага ZERO=1, если равенство
JNZ NO_MISTAKE2
LDA MIST2 ;модифицируем счетчик ошибок 2-го байта
INR A
CALL CRUSH ;вызываем подпрограмму проверки переполнения
STA MIST2
NO_MISTAKE2:
;проверка третьего байта
INX H
LDA D_FLAG
CPI 1H
JNC СHECK_ONLY_ZERO ;если в первом байте пришло значение D, то
;в третьем байте может быть только нуль -
;проверяем специально установленный флаг
MOV A, M ;загружаем значение 3-го байта и сравниваем его
CPI 7H ;с 7H
JC NO_MISTAKE3 ;
JZ NO_MISTAKE3 ;
JMP MODIFY_MIST3 ;
CHECK_ONLY_ZERO:
MVI A,0 ;проверяем на равенство нулю в случае
ORA M ;D-контроллера
JZ NO_MISTAKE3
MODIFY_MIST3:
LDA MIST3 ; модифицируем счетчик ошибок 3-го байта
INR A
CALL CRUSH ; вызываем подпрограмму проверки переполнения
STA MIST3
NO_MISTAKE3:
;проверка четвертого байта
INX H ;
MOV A, M ;значение должно быть меньше 30H
CPI 1EH
JNC NO_MISTAKE4 ;
LDA MIST 4 ;модифицируем счетчик ошибок 4-го байта
INR A
CALL CRUSH ; вызываем подпрограмму проверки переполнения
STA MIST4
NO_MISTAKE4:
INX H ;увеличиваем указатель
MVI A, OFFH ;проверяем на равенство FFH
ORA M
JZ NO_MISTAKE5
LDA MIST5 ;модифицируем счетчик 5-го байта
INR A
CALL CRUSH ; вызываем подпрограмму проверки переполнения
STA MIST5
NO_MISTAKE5:
JMP $
CRUSH:
;данная подпрограмма проверяет, не превышен ли предел в 10H
;ошибок хотя бы в одном из счетчиков. Максимально допустимое число
;ошибок выбрано исходя из соображений удобства их дальнейшего
;представления на индикаторах и составления таблиц соответствия
;кодов.
;на момент запуска подпрограммы аккумулятор содержит значение
;текущего счетчика ошибок
CPI 10H
JNC AVARIA ;флаг не установится, если содержимое А (то есть
;счетчик) больше чем 10Н
RET ;если аварии нет, возвращаемся в главную
;программу
МОДУЛЬ ИНДИКАЦИИ.
;в модуле счета ошибок счетчики были представлены в виде отдельных
;ячеек памяти. Это позволило сделать программу более наглядной. Для
;программирования индикации же удобнее иметь эти счетчики в виде
;таблицы. Табличное представление и использовано в этом модуле.
;программа трансляции кодов BCD в коды 7-сегментного индикатора
LXI D, rs_7_SEG
PUSH D ;текущий адрес таблицы индикации в стеке
LXI D, RG_BCD ;
MVI B, 5
LOOP_TRANS:
LXI H, TABL_DATA
LOOP_STRING:
LDAX D ;получить код для преобразования
CMP M
JZ FOUND ;вход в таблицу найден
INX H
INX H
MOV A, M
CPI KONEC ;проверка выхода из таблицы
JNZ LOOP_STRING
ERROR:
JMP $ ;программа замыкается сама на себя
FOUND:
INX H ;указатель на выходной код
МOV A,M ;получить выходной код
XTHL ;получить указатель в таблице
МOV A,M
INX H ;
XTHL ;сохранить новое значение указателя
INX D ;новое значение из буфера rg_7_seg
DCR B
JNZ LOOP_TRANS
LDAX D
XTHL
MOVE M, A
POP D ;восстановить состояние стека
RET
Список литературы
1. Пухальский Г. И., Новосельцева Т. Я. Проектирование микропроцессорных устройств. Уч. пос. СПб: СПбГЭТУ, 1995.
2. Пухальский Г. И. «Проектирование микропроцессорных систем»
3. Смирнов Б. И., Добырн В. В. Контроллер имитатора радионавигационной системы «Loran–C». Методические указания к курсовому расчету по дисциплине «Микропроцессорные устройства». СПб: СПбГЭТУ, 1997.
4. Пухальский Г. И. , Новосельцева Т. Я. «Проектирование дискретных устройств на интегральных микросхемах», Радио и связь, М.: 1990 г.
5. Иванов В. И. «полупроводниковые оптоэлектронные приборы», Энергоатомиздат, 1989 г.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.