fl
"РЛ" - НАЧИНАЮЩИМ
If
Если делать это при помощи команды CJNE, то про-
грамма ваша превратится в трудновоспринимаемого
монстра уже при количестве режимов более трех и чис-
ле кнопок более 4-х. Более того, вносить изменения в
такую программу станет сложно. Выход - использо-
вание таблиц.
Пусть в нашей гипотетической программе имеется
3 разных режима, для каждого из них определены под-
программы вывода информации DisplayO, Displayl и
Display2; кнопок управления всего 4. Поместим адре-
GoToDisplayMode:
MOV
MOV
RL
JMP
са подпрограмм вывода информации в таблицу
□-15р1ауТаЫе в любом месте нашей программы (я обыч-
но все таблицы помещаю в самом конце текста):
вр1 ауТаЫ в:
DW
DisplayO
DW
Displayl
DW
Display2
Для того, чтобы осуществить переход к нужной под-
программе в зависимости от текущего режима, при-
меним следующую подпрограмму:
DPTR, #DlsplayTable
A, Mode
А
GA+DPTR
загрузим адрес таблицы
возьмем текущий режим
умножим аккумулятор на 2
перейдем на нужный адрес
В этой подпрограмме нет привычного нам возвра-
та командой RET, так как для возврата будет исполь-
зована команда из подпрограммы вывода информа-
ции, на которую мы просто перейдем (а не вызовем
ее командой CALL), т.е. подпрограмма вывода инфор-
мации будет как бы продолжением нашей подпрограм-
мы.
Так как кнопок у нас 4, а режимов 3, то в таблице
обработчиков кнопок будет уже 12 адресов. Пусть со-
ответствующие подпрограммы обработки нажатых
кнопок называются Кеу\Л/огк0_0, Кеу\Л/огкО_1 и т.д., где
после Кеу\/\/огк сначала следует номер режима, а за-
тем, через символ подчеркивания, номер кнопки. Раз-
местим адреса обработчиков в таблице:
KeyWorkTable:
DW
KeyColCnt
DW
DW
KeyWork0_0,
EQU
KeyWorkl_0,
KeyWork2_0,
KeyWorkO_l, KeyWorkO_2, KeyWorkO_3
($-KeyWorkTable) dlv 2
KeyWorkl_l, KeyWorkl_2, KeyWorkl_3
KeyWork2_l, KeyWork2_2, KeyWork2_3
Как видите, наша таблица имеет три строки (по чис-
лу режимов) и четыре столбца (по числу кнопок). Об-
ратите внимание, что в теле таблицы находится ди-
ректива описания константы, соответствующей коли-
честву столбцов таблицы. Для перехода к нужной под-
программе используем следующую подпрограмму:
GoToKeyWorkj
MOV
DPTR, #KeyWorkTable
; берем адрес таблицы
MOV
A , Mode
; возьмем номер строки таблицы
у
MOV
B, #KeyColCnt
; возьмем кол-во столбцов
MUL
AB
; вычислим смещение начала нужной нам строки
; вычислим фактический адрес начала строки
ADD
A, DPL
MOV
DPL, A
MOV
A, В
ADDC
A, DPH
MOV
DPH, A
MOV
A, Key
; теперь возьмем код нажатой кнопки
DEC
A
; не забываем, что 0 - кнопка не нажата 1
RL
A
; вычисляем смещение адреса в строке
JMP
GA+DPTR
; и переходим к обработчику
В сущности, приведенный пример не заслуживает
комментария, все должно быть понятно и так. Просто
сначала мы вычисляем адрес нужной строки, как адрес
таблицы в таблице, для чего номер режима умножаем
на количество столбцов и прибавляем адрес начала таб-
лицы. А затем уже точно так же, как в ОоТоОіврІауМосІе,
осуществляем переход к соответствующему обработчику
нажатой клавиши. Единственный нюанс - корректи-
ровка значения Key, ведь при его нулевом значении
наша подпрограмма вызвана не будет, т.е. наши кноп-
ки нумеруются не с нуля, а с единицы.
С учетом вышесказанного, основной цикл работы
нашей программы будет выглядеть так:
42
[| Радиолюбитель - 0 3 /2 0 0 8
предыдущая страница 42 Радиолюбитель 2008-03 читать онлайн следующая страница 44 Радиолюбитель 2008-03 читать онлайн Домой Выключить/включить текст