Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП КурсРасч9-1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
10.98 Mб
Скачать

5.3.Конструирование программного модуля

В этом разделе курсового расчета должны быть представлены разработанные (не входящие в шаблоны) фрагменты программного модуля, ПП преобразования и другие самостоятельно разработанные тексты. При описании этих фрагментов может быть использован обратный порядок: сначала написан программный код, а затем он документирован с использованием схем алгоритма. В качестве примера такой разработки далее приведена ПП преобразования неупакованного BCD-кода в код 7-сегментного СИД-индикатора (предполагается схема индикатора, показанная на рис. 3.14). В программе используется табличное преобразование кодов, но вместо кодов 7-сег-ментного индикатора используются ASCII-коды соответствующих символов, наблюдение которых в окне дампа памяти значительно удобнее. Таблица TABL_DATA содержит исходные BCD-символы, подлежащие выводу на индикацию, и их ASCII эквивалент:

Seg code

TABL_DATA:

DB 00,'0' ; строка преобразования кода 0 в ASCII символ ‘0’

DB 01,'1' ; строка преобразования кода 0 в ASCII символ ‘1’

DB 02,'2' ; строка преобразования кода 0 в ASCII символ ‘2’

DB 07,'7' ; строка преобразования кода 0 в ASCII символ ‘7’

; коды основных частот SS,SL,SH,S,L,H

SIMB_S EQU 10H ; символ основной частоты повторения S

SIMB_L EQU 11H ; символ основной частоты повторения L

SIMB_H EQU 12H ; символ основной частоты повторения H

SIMB_G EQU 13H ; символ

DB SIMB_S,'S'; строка преобразования кода в ASCII символ ‘S’

DB SIMB_L,'L'; строка преобразования кода в ASCII символ ‘L’

DB SIMB_H,'H'; строка преобразования кода в ASCII символ ‘H’

DB SIMB_G,'G'; строка преобразования кода в ASCII символ ‘G’

; коды служебных символов

SIMB_? EQU 20H

simb_gash equ 30h ; код гашения индикатора

DB SIMB_?,'?'

DB SIMB_GASH,' ' ;

DB KONEC ; код конца таблицы

Замечание. Конец буфера отмечен специальным символом KONEC, содержимое которого (FFh) не используется в рабочей части таблицы.

Код стробов разрешения индикации представлен табл. TABL_SEG. Он соответствует 5-разрядному индикатору. Дополнительно содержимое таблицы включает установку бита 4 регистра DD4, который сбрасывает триггер DD9.1, формирующий запрос прерывания по входу R5.5.

Seg code

TABL_SEG:

; высветка разряда разрешена логической единицей в соответствующем разряде

; используются биты 0, 1, 2, 3, 4

; дополнительно задается сигнал сброса регистра запроса прерывания

DB 21h,22h,24h,28h,30H

DB KONEC

Содержимое буфера RG_BCD зависит от режима работы контроллера. Для режима mode = 1 буфер заполнен знаками «?» (код 20h). Фрагмент, начинающийся с метки MODE1_INST:, производит загрузку буфера и вызывает ПП преобразования TRANSLATE.

MODE1_INST:

; индикация ожидания пакета управления, mode = 1

MVI B,5 ; счетчик повторения равен числу разрядов

LXI H,RG_BCD ; указатель записи в регистр BCD-кодов

LOOP_IND1:

MVI M,SIMB_? ; запись кода символа ‘?’

INX H ; модификация указателя на следующую позицию

DCR B ; модификация счетчика повторения

JNZ LOOP_IND1 ; проверка на завершение цикла

MVI M,KONEC ; запись в буфер символа KONEC

CALL TRANSLAT ; вызов ПП преобразования BCD в коды 7-сегм.

ПП преобразования кодов TRANSLATE читает очередной код из буфера RG_BCD и сравнивает его поочередно с первыми байтами всех строк TABL_DATA. При совпадении кодов из таблицы выбирается последний код в соответствующей строке и записывается в буфер RG_7_SEG. Так продолжается до просмотра всех байтов буфера RG_BCD. В случае достижения конца таблицы TABL_DATA генерируется ошибка формирования кода символа индикации (здесь не разработана). Текст ПП TRANSLATE приведен ниже.

TRANSLAT: ; пп преобразования кодов BCD в коды 7-сегментного инд.

LXI D,RG_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 ; указатель на выходной код

MOV A,M ; получить выходной код

XTHL ; получить указатель в таблице

MOV M,A

INX H

XTHL ; сохранить новое значение указателя

INX D ; новое значение из буфера rg_7_seg

DCR B

JNZ LOOP_TRANS

LDAX D

XTHL

MOV M,A

POP D ; восстановить состояние стека

RET

Схема алгоритма ПП TRANSLATE представлена на рис. 5.1. ПП использует три указателя косвенной адресации (регистровую пару HL – указатель чтения кодов из таблицы TABL_DATA, регистровую пару DE – указатель чтения из буфера RG_BCD, и регистровую пару, помещенную на вершину стека, – указатель записи в буфер RG_7_SEG (блоки 1…4)). Поиск соответствия текущего кода с первым байтом строки таблицы TABL_DATA производится последовательностью блоков 5…9. При обнаружении совпадения управление передается на метку FOUND, при не обнаружении и достижении конца таблицы – на метку ERROR.

Процесс от метки FOUND (последовательность блоков 11...17) состоит из чтения второго байта в найденной строке таблицы TABL_DATA, подготовке к преобразованию следующего байта (переход к метке LOOP_TRANS) и повторения процесса поиска соответствия следующего прочитанного кода коду таблицы преобразования.

Рис. 5.36. Схема алгоритма преобразования неупакованного BCD-кода в код 7-сегментного индикатора

После выполнения преобразования всех BCD-кодов, заданных счетчиком повторения, производится запись кода KONEC в буфер RG_7_SEG (блок 18), восстановление указателя стека (содержимое регистровой пары не представляет интереса, нужно только переместить SP на адрес возврата) и сам возврат в главную программу.

Обычно ПП TRANSLATE используется только один раз при загрузке буфера RG_BCD новым значением.