rgz
.pdf
|
31 |
OutRg .equ 30h |
; адрес регистра вывода |
; |
|
.org 0800h |
|
CNT: CALL KPU |
; оценка нажатия и установка флага Z |
JZ CNT |
; если не нажата, ждать нажатия |
IN InRg |
; иначе ввод из регистра ввода |
OUT OutRg |
; вывод через регистр вывода |
JMP CNT |
; к ожиданию нового нажатия |
.end
Моментнажатия клавиши
Моментотпускания
клавиши
Сигнал отклавиши на входе СПД
Интервал дребезга |
|
Интервал дребезга |
при нажатии |
|
при отпускании |
|
|
|
|
|
|
Сигнал на выходе СПД |
Рис. 1.9. Диаграммы сигналов при дребезге контакта.
Определение кода нажатой клавиши производится после выявления факта нажатия клавиши. Код нажатой клавиши формируется из кода выбора строки матрицы, выведенного в момент определения нажатия, и из кода столбца, принятого в этот момент. Сформированный код нажатой цифровой клавиши должен быть равен цифре, которой эта клавиша обозначена. Напри-
мер, при нажатии клавиши B должен быть сформирован байт кода этой кла-
виши – 0Bh. Из мониторных подпрограмм для определения кода нажатой клавиши может быть применена подпрограмма KIND (адрес 0185). Подпрограмма KIND –многофункциональная подпрограмма для организации управления пультовым терминалом. Она объединяет в себе возможности представленных ранее подпрограмм DCC, KPU, SDS. Действия подпрограммы KIND заключаются в следующем. Сразу после запуска организуется циклическое сканирование дисплея недекодированным сообщением из UDSP (адреса 0BF0–0BF5) c одновременной проверкой состояния клавиатуры. Сканирование продолжается пока не нажата клавиша. Как только клавиша нажата и отпущена, KIND формирует код нажатой клавиши в аккумуляторе и завершается. Пример использования подпрограммы KIND дан в программе 1.8.
32
; |
Программа 1.8 |
;Управление пультовым терминалом мониторной п/п KIND
; Входные переменные: |
UDSP (0BF0–0BF5) – коды недекодированного |
|
; |
|
сообщения |
; Выходные переменные: A – код нажатой клавиши |
||
; |
|
|
BLNK .equ 297h |
;адрес п/п очистки дисплея |
|
KIND. equ 14Bh |
; адрес п/п управления пультовым терминалом |
|
; |
|
|
.org 0800h |
|
|
|
CALL BLNK |
; Очистить дисплей |
CNT: |
CALL KIND |
; Ожидать нажатие, выводя сообщение из UDSP |
|
|
; после нажатия, код клавиши A и возврат из п/п |
|
LXI H,UDSP |
; Указание на место UDSP для байта |
|
|
; соответствующего индикатору HL0 |
|
MOV M,A |
; запись кода клавиши в новое сообщение |
|
OUT Out_Rg |
; вывод кода клавиши в выходной регистр |
|
JMP CNT |
; Повторять сканирование сообщения |
.org 0BF0h |
|
|
UDSP: |
.db 0,0,0,0,0,0 |
;байты декодированного сообщения |
.end |
|
|
2. Пример разработки программы
2.1. Задание
Разработать программу для УМК-80 умножения двух однобайтных чисел вводимых с пульта с последующим выводом результата умножения на дисплей.
2.2. Операторный интерфейс программы
Оператор будет вести диалог с машиной, работая с двумя экранами: экран ввода сомножителей; экран показа результата умножения.
Ввод сомножителей Компоновка экрана ввода сомножителей представлена на рис. 2.1.
33
Область недекодированных сообщений, сканируемая подпрограммой SCAN_KD
DDSP |
HL1
DDSP+1 DDSP+2 DDSP+3 DDSP+4 DDSP+5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL2 |
|
|
|
HL3 |
|
|
|
HL4 |
|
|
|
HL5 |
|
|
|
HL6 |
|
Множимое |
Множитель |
Рис. 2.1. Компоновка экрана ввода сомножителей.
Сразу после начала программы выводится сообщение, показанное на рис. 2.2 с приглашением к вводу множимого нажатием цифровых клавиш с показом вводимых цифр числа на индикаторах HL2 и HL3. Например, требуется выполнить операцию 39h×ACh.
Приглашение к вводу
DDSP |
HL1
DDSP+1 DDSP+2 DDSP+3 DDSP+4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL2 |
|
|
HL3 |
|
|
HL4 |
|
|
HL5 |
|
DDSP+5 |
HL6
Множимое
Рис. 2.2. Исходный вид экрана перед вводом множимого.
Начинаем ввод множимого со старшей цифры "3". После нажатия клавиши "3" на экране отобразится символ этой клавиши (рис. 2.3).
34
DDSP |
HL1
DDSP+1 DDSP+2 DDSP+3 DDSP+4 DDSP+5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL2 |
|
|
|
HL3 |
|
|
|
HL4 |
|
|
|
HL5 |
|
|
|
HL6 |
|
Множимое
Рис. 2.3. Экран после первого нажатия клавиши "3".
После очередного нажатия символ предыдущего нажатия сдвигается влево на индикатор HL2, а на его месте на HL3 отображается символ клавиши нового нажатия. Информация о ещѐ более раннем нажатии теряется. Таким образом, остаѐтся отображѐнной информация лишь о двух последних нажатиях. Если, например, случайно была повторно нажата клавиша "3" (рис. 2.4), то можно просто исправить ошибку ввода. При вводе должны восприниматься только цифровые клавиши, из символов которых можно создавать цифры байта множимого. Остальные клавиши должны игнорироваться. Исключение
– клавиша "└┘", служащая для указание на завершение ввода цифр числа.
DDSP |
HL1
DDSP+1 DDSP+2 DDSP+3 DDSP+4 DDSP+5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL2 |
|
|
HL3 |
|
|
HL4 |
|
|
HL5 |
|
|
HL6 |
|
Множимое
Рис. 2.4. Экран после второго (ошибочного) нажатия клавиши "3".
После исправления ошибки ввода и правильных нажатий на экране отобразятся цифры множимого (рис. 2.5).
35
DDSP |
HL1
DDSP+1 DDSP+2 DDSP+3 DDSP+4 DDSP+5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL2 |
|
|
|
HL3 |
|
|
|
HL4 |
|
|
|
HL5 |
|
|
|
HL6 |
|
Множимое
Рис. 2.5. На экране нормальное значение множимого.
Далее нажимается – клавиша "└┘", цифры байта множимого сохраняются в памяти микро-ЭВМ и появляется приглашение к вводу множителя
(рис. 2.6).
Приглашение к вводу
DDSP |
HL1
DDSP+1 DDSP+2 DDSP+3 DDSP+4 DDSP+5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL2 |
|
|
|
HL3 |
|
|
|
HL4 |
|
|
|
HL5 |
|
|
|
HL6 |
|
Множимое |
Множитель |
Рис. 2.6. Приглашение к вводу множителя сразу после нажатия "└┘".
Ввод множителя производится аналогично вводу множимого. Когда требуемые символы цифр отображаются на соответствующих индикаторах (рис. 2.7), можно снова нажимать клавишу "└┘", указывая на завершение ввода множителя.
36
DDSP |
HL1
DDSP+1 DDSP+2 DDSP+3 DDSP+4 DDSP+5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL2 |
|
|
|
HL3 |
|
|
|
HL4 |
|
|
|
HL5 |
|
|
|
HL6 |
|
Множимое |
Множитель |
Рис. 2.7. На экране нормальные значения множимого и множителя.
Вывод результата
После завершения ввода экран обновляется.
Введѐнные сомножители перемножаются стандартной подпрограммой умножения. Полученный двухбайтный результат 264Ch разделяется на 4 цифры. Из них получаются 4 декодированных кода. Они помещаются в ячейки области декодированных сообщений DDSP, соответствующих положениям индикаторов, на которых их следует отображать. Вызывается процедура сканирования сообщения до нажатия и на экране получается вид, представленный на рис. 2.8.
DDSP |
HL1
DDSP+1 DDSP+2 DDSP+3 DDSP+4 DDSP+5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL2 |
|
|
|
HL3 |
|
|
|
HL4 |
|
|
|
HL5 |
|
|
|
HL6 |
|
Результат умножения
Рис. 2.8. После завершения ввода множителя на экране – результат умножения.
Далее необходимо обеспечить оператору нажатием клавиш выбирать один из двух путей продолжения:
завершить программу, вернувшись в Монитор по нажатию клавиши
"ВП".
продолжить программу, начав еѐ заново с ввода новых сомножителей по нажатию любой другой клавиши.
37
2.3. Блок-схемы алгоритмов
Блок-схема алгоритма основной программы умножения однобайтных чисел представлена на 3-х листах (рис. 2.9, 2.10, 2.11).
Она состоит из четырѐх модулей: ввод множимого (элементы с 1 по 11);
ввод множителя (элементы с 12 по 21); умножение (элементы с 22 по 24);
подготовка результата в показу на дисплее и сканирование до нажатия (элементы с 25 по 29).
Модули ввода сомножителей отличаются очень незначительно и могут быть организованы как один модуль с разными входными переменными.
Процедуры, вызываемые основной программой подробно представлены выше в разделе 1, либо они разрабатывались при выполнении заданий в лабораторной №4.1 из цикла лабораторных работ.
38
|
|
|
|
|
Начало |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
(DE) |
Mes_0 |
|
|
Копирование сообщения |
||||||
29 |
|
|
|
|
|||||||
|
MES_DDSP |
|
|
MES_0 в DDSP |
|||||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
SCAN_KD |
Сканирование сообщения до |
|
нажатия: код нажатия (A) |
|
|
|
|
|
3 |
|
+ |
Key_Code |
Нажата цифровая клавиша? |
|
> 10 |
|
|
|
|
4 |
|
|
Key_Code=4C |
|
Нажата клавиша "└┘"? |
5 |
|
|
+ |
DIG_1 |
|
|
DIG_0 |
|
|
|
Модификация буфера кодов |
6 |
|
цифр вводимого байта |
1 |
DIG_0 |
|
11 |
|
|
Key_Code |
|
|
|
|
|
7 |
|
|
|
(A) |
Декодирование кода цифры в |
|
Key_Code |
|
|
символ для DDSP -> (A) |
|
|
DCD |
|
|
|
|
9 |
|
|
(DDSP+1) |
|
|
|
(DDSP+2) |
Модификация буфера из DDSP |
|
|
символов цифр вводимого байта |
10 |
|
|
(DDSP+2)(A) |
|
|
Рис. 2.9. Блок-схема алгоритма программы. Лист 1 (3). |
|
39 |
|
|
|
2 |
|
|
|
4 |
|
|
|
11 |
Объединение отдельных цифр |
|
|
|
||
|
KEY_CODE |
(DIG_1, DIG_0) в один байт |
|
|
(MUL_1)(A) |
сомножителя (A). |
|
|
|
Сохранение множимого в MUL_1. |
|
|
12 |
|
|
|
(DDSP+4)08 |
Формирование приглашения |
|
|
(DDSP+5)08 |
к вводу множителя |
|
|
13 |
|
|
|
SCAN_KD |
Сканирование сообщения до |
|
|
нажатия: код нажатия (A) |
||
|
|
||
|
14 |
|
|
+ |
Key_Code |
Нажата цифровая клавиша? |
|
|
> 10 |
||
|
|
||
15 |
|
|
|
Key_Code=4C |
|
Нажата клавиша "└┘"? |
|
|
16 |
|
|
+ |
|
|
|
|
DIG_1DIG_0 |
|
|
|
17 |
Модификация буфера кодов |
|
3 |
цифр вводимого байта |
||
|
|||
|
|
||
21 |
DIG_0 |
|
|
|
|
||
|
Key_Code |
|
|
|
18 |
|
|
|
(A) |
Декодирование кода цифры в |
|
|
Key_Code |
||
|
символ для DDSP -> (A) |
||
|
DCD |
||
|
|
||
|
19 |
|
|
|
(DDSP+4) |
|
|
|
(DDSP+5) |
Модификация буфера из |
|
|
|
DDSP символов цифр |
|
|
20 |
вводимого байта |
|
|
(DDSP+5)(A) |
|
|
Рис. 2.10. Блок-схема алгоритма программы. Лист 2 (3). |
40
2
15
21
Объединение отдельных цифр в KEY_CODE один байт сомножителя
(MUL_2)(A) (KEY_CODE1, KEY_CODE_0)
Сохранение множителя в MUL_2
22
|
|
(MUL0)(E) |
|
|
|
||||
|
|
(MUL1)(D) |
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MULTIPLY |
|
|
|
Выполнение умножения |
|||
|
|
|
|
|
|
|
|
MUL0×MUL1 àRES0, RES1 |
|
|
|
|
|
|
|
|
|
|
|
24
(RES_0)(C) (RES_1)(B)
25 |
|
|
(DE) |
Копирование сообщения |
|
MES_1 |
||
MES_1 в DDSP |
||
MES_DDSP |
||
|
|
26 |
|
|
|
Подготовка для индикации на местах |
|
DCD RES0 |
DDSP+2, DDSP+3 цифр младшего |
|
|
байта RES0 результата |
|
27 |
|
|
|
Подготовка для индикации на местах |
|
DCD RES1 |
DDSP+0, DDSP+1 цифр старшего |
|
|
байта RES1 результата |
|
28 |
|
1 |
|
Сканирование сообщения до нажатия. |
|
|
|
1 |
SCAN_KD |
Затем сохранение кода нажатия в |
|
||
|
|
Key_Code |
|
29 |
|
|
Key_Code=8С |
Нажата клавиша "ВП"? |
|
+ |
|
|
Конец |
|
|
Рис. 2.11. Блок-схема алгоритма программы. Лист 3 (3). |