Графический интерфейс пользователя в прикладных программах |
Программируемые микрокалькуляторы обладают возможностью проводить расчёты по заранее составленной программе, что заметно упрощает процесс рутинных вычислений. По методике расчёта составляется программа, заносится в память программ, исходные данные заносятся в рабочие регистры, запускается программа, после останова из регистров извлекаются результаты расчётов.
В качестве примера можно составить программу расчёта площади треугольника по формуле Герона.
Формула Герона позволяет рассчитать площадь треугольника по размерам трёх его сторон: a, b, c.
Для начала нужно рассчитать промежуточный параметр - полупериметр р, равный полусумме всех сторон треугольника:
p=(a+b+c)/2
Определив значение полусуммы всех сторон, рассчитываем значение площади треугольника:
S=√(p(p-a)(p-b)(p-c))
Перед написанием программы, определимся, в каких регистрах будут исходные данные, промежуточные результаты и результат расчётов.
Пусть размеры сторон треугольника a, b, c, будем заносить в регистры РА, РВ, РС, а полупериметр будем хранить в регистре РD, а результат расчётов - площадь треугольника будет отображаться прямо на дисплее при останове программы.
Для начала рассчитываем полупериметр р и заносим его в регистр РD:
0 1 2 3 4 5 6 7 8 9
00 ИПА ИПВ ИПС + + 2 ÷ ПD
Далее, рассчитываем площадь треугольника:
0 1 2 3 4 5 6 7 8 9
00 ИПА -
10 ИПD ИПВ - ИПD ИПС - ИПD х х х
20 F√
Значение полупериметра после его расчёта находится в стеке,
поэтому в первый раз его не нужно вызывать из регистра РD.
После расчёта, нужно остановить программу, чтобы результат
расчёта отобразился на дисплее. Для удобства повторного расчёта, нужно
добавить переход на начало программы, чтобы после останова, программу
можно было перезапустить вновь: Получаем программу расчёта площади треугольника по формуле
Герона: Перед запуском программы нужно занести размеры сторон
треугольника в регистры РА, РВ, РС. Например, размеры сторон треугольника: a=3, b=4, c=5. Заносим: 3 ПА 4 ПВ 5 ПС Запускаем программу: В/О, С/П. РХ = 6. После останова программы получаем результат расчёта, площадь
треугольника с размером сторон 3, 4, и 5 равна 6. После останова программы можно внести новые значения сторон
треугольника в регистры РА, РВ, РС, и перезапустив программу клавишей
"С/П" получить результат нового расчёта. Теперь, для повышения удобства пользования, добавим к программе
графическое меню, организованного при помощи графического интерфейса
пользователя. Графический интерфейс пользователя представляет систему меню и
состоит из связанных форм и элементов. Интерфейс позволяет выбрать
действующий элемент, перейти из одной формы в другую, вывести текстовые
строки и числовые значения, а также ввод чисел в регистры. Перед началом работы, нужно разрешить работу, записав числа 1 в
регистр Р9200, занести адрес главной таблицы меню в регистр Р9201, а
также внести номер загруженной формы в регистр Р9202 и номер действующего
элемента в регистр Р9203. Далее, в регистр Р9208 команд интерфейса
записывается число 64 - команда перерисовки экрана. На этом подготовка
к работе графического интерфейса пользователя заканчивается. Работа с графическим интерфейсом пользователя состоит из записи
команд в регистр Р9208 и обработки кодов результатов выполнения команд,
считываемых из регистра Р9209. В качестве команд управления, служат коды клавиш, которые можно
считать из регистра Р9029. Это команды "ВЫХОД" (32), "ВВОД" (33),
"ВЫБОР ВПРАВО" (34), "ВЫБОР ВЛЕВО" (35), "ВЫБОР ВВЕРХ" (36),
"ВЫБОР ВНИЗ" (37), а также специальная команда 64 перерисовки экрана. Программа должна периодически считывать код клавиши из регистра
Р9029, передавать код нажатой клавиши в регистр команд Р9208, и
обрабатывать код результата выполнения команды, считываемого из регистра
Р9209. Также, должен происходить останов программы при нажатии клавши
"ВЫХОД" при основной загруженной форме. Рабочими регистрами остаются РА, РВ, РС для исходных данных,
промежуточный регистр РD, и добавляются регистр результата расчёта РЕ
и регистр Р7 для промежуточного хранения кода нажатой клавиши. Сначала нужно очистить рабочие регистры РА, РВ, РС, РЕ и
подготовить к работе графический интерфейс пользователя: Теперь нужно обеспечить считывание кода нажатых клавиш из
регистра Р9029, передача команд в регистр Р9208, а также считывание
из регистра Р9209 и обработку кода результата выполнения команды,
а также остановку программы при нажатии на клавишу "ВЫХОД": При успешном выполнении команды, код результата - 0, код нажатой
клавиши передаётся в регистр команд Р9208. При считывании кодов ошибок
из регистра Р9209, или нажатии на клавишу "ВЫХОД", переходим к останову
программы, по адресу 95. При коде выполнения операции, равном 1, требуется дополнительная
обработка команды, в нашей программе рассчитывается значение площади
треугольника и заносится в регистр РЕ. Далее, обнуляются указатели
номеров формы - Р9202 и элемента - Р9203 и перерисовывается экран. Для
этого используется подготовка интерфейса к работе: При окончании ввода числа из регистра Р9209 считывается код,
равный 7, при этом увеличиваем номер действующего элемента, чтобы можно
было вводить исходные данные по очереди: При нажатии на клавишу "ВЫХОД" при нулевой текущей форме, или
при считывании кодов ошибок из регистра Р9209, записью адреса строки
0311 в регистр Р9026 в строке комментариев выводится сообщение "Выход",
очищаются регистры РY, РZ и РT, в регистр РХ выводится код ошибки и
происходит останов программы: Теперь основная программа готова: Графический интерфейс пользователя состоит из главной таблицы
меню, и экранных форм. Главная таблица меню состоит из ряда трёхбайтовых записей, первый
байт - номер формы, второй и третий байты - адрес заголовка формы в
памяти программ, и заканчивается кодом 0FFh. В нашей программе всего одна
форма, и главная таблица меню состоит всего из одной записи: Форма состоит из заголовка формы, адресов таблиц
переходов по командам "ВВОД", "ВЫХОД", "ВЫБОР ВЛЕВО(ВВЕРХ)",
"ВЫБОР ВПРАВО(ВНИЗ)", адресов основной программы формы и адреса таблицы
адресов программ элементов. Все адреса представляют собой смещения
относительно начала заголовка формы в шестнадцатеричном формате. Размер формы ограничен размером 256 байт. Для нашей программы достаточно одной - единственной формы и
четырёх элементов, три для ввода размеров сторон и один для запуска
расчёта площади. Форма ввода числа (254) программирования не требует. Заголовок формы нашей программы: Таблица флагов действий состоит из ряда байтовых записей, для
элементов 0, 1, 2 достаточно разрешения команд "ВЫБОР" для переключения
действующих элементов и разрешения команды "ВВОД" для перехода к форме
ввода десятичного числа. Для 3-го элемента, кроме разрешения команд
"ВЫБОР" и "ВВОД", нужно указать признак ввода: Таблица переходов по командам "ВВОД" и "ВЫХОД" состоит из ряда
двухбайтовых записей, каждому элементу соответствует номер новой формы
и действующего элемента. В нашей форме команды команды "ВЫХОД" запрещены,
и таблица переходов по командам "ВЫХОД" не требуется. В нашей форме,
адрес таблицы переходов по командам "ВВОД" и "ВЫХОД" указывает на одну
таблицу: Таблица переходов по командам "ВЫБОР ВЛЕВО(ВВЕРХ)" и
"ВЫБОР ВПРАВО(ВНИЗ)" состоят из ряда байтовых записей, указывающих на
номер нового действующего элемента при выполнении команды "ВЫБОР". В нашей форме, при нажатии на клавишу "ВЫБОР ВЛЕВО(ВВЕРХ)"
номер действующего элемента должен уменьшаться, а при нажатии на
клавишу "ВЫБОР ВПРАВО(ВНИЗ)" номер действующего элемента должен
увеличиться. Кроме того, если нажата клавиша "ВЫБОР ВЛЕВО(ВВЕРХ)", при
0-м элементе, должен быть задействован 3-й элемент, а если нажата
клавиша "ВЫБОР ВПРАВО(ВНИЗ)", при 3-м элементе, должен быть задействован
0-й элемент: Таблица переходов по команде "ВЫБОР ВЛЕВО(ВВЕРХ)" Таблица переходов по команде "ВЫБОР ВПРАВО(ВНИЗ)" Таблицы переходов по командам "ВЫБОР ВЛЕВО(ВВЕРХ)"и
"ВЫБОР ВПРАВО(ВНИЗ)" можно объединить в одну, при этом адрес таблицы
переходов по команде "ВЫБОР ВЛЕВО(ВВЕРХ)" будет начинаться с адреса 14h,
а адрес таблицы переходов по команде "ВЫБОР ВПРАВО(ВНИЗ)" будет
начинаться с адреса 16h: Таблица адресов программ элементов состоит из ряда байтовых
записей, указывающих адреса программ элементов: Основная программа экранной формы, а также программы элементов
пишутся на языке графического интерфейса пользователя. Основная программа
выполняется при каждой перерисовке формы, а также выполняется программа
действующего элемента. Программа оканчивается кодом 0FFh. Основная программа формы выводит название программы - "Расчёт
площади треугольника", названия сторон "А", "В", "С", обозначение
площади "S", команду "Рассчитать!" и значение регистров РА, РВ, РС, РЕ: Программа 0-го элемента вводит число в регистр РА и обозначает
рамкой вокруг выведенного формой значения регистра РА: Программа 1-го элемента вводит число в регистр РВ и обозначает
рамкой вокруг выведенного формой значения регистра РВ: Программа 2-го элемента вводит число в регистр РС и обозначает
рамкой вокруг выведенного формой значения регистра РС: Программа 3-го элемента запускает расчёт площади треугольника
и обозначает рамкой вокруг выведенной формой строки "Рассчитать!": Программа выведения рамки для действующего элемента всего одна, потому что выводимая рамка одинакова для всех элементов, поэтому все программы элементов ссылаются на программу выведения рамки. Графический интерфейс пользователя нашей программы представляет собой таблицу в памяти программ: Наконец, составляется таблица выводимых текстовых строк в памяти программ: Вот и всё! Прикладная программа использующая графический интерфейс пользователя для создания меню, готова! Программу нужно запускать с 0-й страницы памяти программ: После запуска программы на экране отображается меню: Для ввода значения размеров сторон нужно нажать клавишу "ВВОД": Далее, набираем число, с помощью клавиш 0 - 9, /-/, ВП, Сх,
например, А=3: После ввода нажимаем клавишу "ВВОД": Аналогично вводим значения размеров других сторон, например,
В=4, С=5: Теперь задействуется пункт меню "Рассчитать!". Для расчёта
нажимаем на клавишу "ВВОД": Получаем значение площади треугольника S=6. Можно рассчитывать заново. Для выхода и останова программы нажимаем клавишу "ВЫХОД": Программу можно использовать как основу для программ, использующих меню, организованное с помощью графического интерфейса пользователя. Сайт работает на микрокомпьютере
0 1 2 3 4 5 6 7 8 9
20 С/П БП 00
0 1 2 3 4 5 6 7 8 9
00 ИПА ИПВ ИПС + + 2 ÷ ПD ИПА -
10 ИПD ИПВ - ИПD ИПС - ИПD х х х
20 F√ С/П БП 00
0 1 2 3 4 5 6 7 8 9
00 Сх ПА ПВ ПС ПЕ 1 РРП 92 00 1
10 1 0 РРП 92 01 Сх РРП 92 02 РРП
20 92 03
0 1 2 3 4 5 6 7 8 9
20 6 4 РРП 92 08 РРИП 92 09
30 Fх≠0 50 1 - Fх≠0 71 6 - Fх=0 95
40
50 РРИП 90 29 П7 KNOT Fх≠0 50 ИП7 3 2
60 - К|х| РРИП 92 02 KOR Fх≠0 95 ИП7 БП
70 24
0 1 2 3 4 5 6 7 8 9
70 24 ИПА ИПВ ИПС + + 2 ÷ ПD ИПА
80 - ИПD ИПВ - ИПD ИПС - ИПD х х
90 х F√ ПЕ БП 15
0 1 2 3 4 5 6 7 8 9
40 РРИП 92 03 1 + РРП 92 03 БП 22
0 1 2 3 4 5 6 7 8 9
90 3 1 1 РРП 90
100 26 Сх В↑ В↑ РРИП 92 09 С/П РБП 00
110 00
0 1 2 3 4 5 6 7 8 9
00 Сх ПА ПВ ПС ПЕ 1 РРП 92 00 1
10 1 0 РРП 92 01 Сх РРП 92 02 РРП
20 92 03 6 4 РРП 92 08 РРИП 92 09
30 Fх≠0 50 1 - Fх≠0 71 6 - Fх=0 95
40 РРИП 92 03 1 + РРП 92 03 БП 22
50 РРИП 90 29 П7 KNOT Fх≠0 50 ИП7 3 2
60 - К|х| РРИП 92 02 KOR Fх≠0 95 ИП7 БП
70 24 ИПА ИПВ ИПС + + 2 ÷ ПD ИПА
80 - ИПD ИПВ - ИПD ИПС - ИПD х х
90 х F√ ПЕ БП 15 3 1 1 РРП 90
100 26 Сх В↑ В↑ РРИП 92 09 С/П РБП 00
110 00
0 1 2 3 4 5 6 7 8 9
110 00h 01h 14h FFh
00h 03h - четыре элемента в форме, начиная с нулевого
01h 08h - адрес таблицы флагов действий
02h 0Ch - адрес таблицы переходов по команде "ВВОД"
03h 0Ch - адрес таблицы переходов по команде "ВЫХОД"
04h 14h - адрес таблицы переходов по команде "ВЫБОР ВЛЕВО(ВВЕРХ)"
05h 16h - адрес таблицы переходов по команде "ВЫБОР ВПРАВО(ВНИЗ)"
06h 1Eh - адрес основной программы формы
07h 1Ah - адрес таблицы адресов программ элементов
0 1 2 3 4 5 6 7 8 9
110 03h 08h 0Ch 0Ch 14h 16h
120 1Eh 1Ah
08h 05h - разрешение команд "ВВОД" и "ВЫБОР"
09h 05h - разрешение команд "ВВОД" и "ВЫБОР"
0Ah 05h - разрешение команд "ВВОД" и "ВЫБОР"
0Bh 0Dh - разрешение команд "ВВОД" и "ВЫБОР", признак ввода
0 1 2 3 4 5 6 7 8 9
120 05h 05h 05h 0Dh
0Ch FEh, 00h - форма ввода числа (254-я), 0-й элемент
0Eh FEh, 01h - форма ввода числа (254-я), 1-й элемент
10h FEh, 02h - форма ввода числа (254-я), 2-й элемент
12h 00h, 03h - основная форма (0-я), 3-й элемент
0 1 2 3 4 5 6 7 8 9
120 FEh 00h FEh 01h
130 FEh 02h 00h 03h
03h - переход на 3-й элемент (вверх)
00h - переход на 0-й элемент (вверх)
01h - переход на 1-й элемент (вверх)
02h - переход на 2-й элемент (вверх)
01h - переход на 1-й элемент (вверх)
02h - переход на 2-й элемент (вверх)
03h - переход на 3-й элемент (вверх)
00h - переход на 0-й элемент (вверх)
14h 03h - переход на 3-й элемент (вверх)
15h 00h - переход на 0-й элемент (вверх)
16h 01h - переход на 1-й элемент (вверх или вниз)
17h 02h - переход на 2-й элемент (вверх или вниз)
18h 03h - переход на 3-й элемент (вниз)
19h 00h - переход на 0-й элемент (вниз)
0 1 2 3 4 5 6 7 8 9
130 03h 00h 01h 02h 03h 00h
1Ah 75h - адрес программы 0-го элемента
1Bh 7Dh - адрес программы 1-го элемента
1Ch 85h - адрес программы 2-го элемента
1Dh 8Dh - адрес программы 3-го элемента
0 1 2 3 4 5 6 7 8 9
140 75h 7Dh 85h 8Dh
1Eh TYPE 0 ;Указываем 0-й шрифт
20h TAB 1Ch,00h ;Указываем позицию вывода: X=1Ch, Y=00h
23h TXTP 10h,0263d ;Выводим строку из памяти "Расчёт площади"
27h TAB 22h,08h ;Указываем позицию вывода: X=22h, Y=08h
2Ah TXTP 10h,0278d ;Выводим строку из памяти "треугольника"
2Eh TAB 1Ah,11h ;Указываем позицию вывода: X=1Ah, Y=11h
31h SQU 0,4Bh,01h ;Выводим прямоугольник X=4Bh, Y=01h
35h TAB 1Ch,14h ;Указываем позицию вывода: X=1Ch, Y=14h
38h TXTP 10h,0291d ;Выводим строку из памяти "А"
3Ch TAB 2Eh,14h ;Указываем позицию вывода: X=2Eh, Y=14h
3Fh PREXP 10h,0010d ;Выводим содержимое регистра РА
43h TAB 1Ch,1Dh ;Указываем позицию вывода: X=1Ch, Y=1Dh
46h TXTP 10h,0293d ;Выводим строку из памяти "В"
4Ah TAB 2Eh,1Dh ;Указываем позицию вывода: X=2Eh, Y=1Dh
4Dh PREXP 10h,0011d ;Выводим содержимое регистра РВ
51h TAB 1Ch,26h ;Указываем позицию вывода: X=1Ch, Y=26h
54h TXTP 10h,0295d ;Выводим строку из памяти "С"
58h TAB 2Eh,26h ;Указываем позицию вывода: X=2Eh, Y=26h
5Bh PREXP 10h,0012d ;Выводим содержимое регистра РС
5Fh TAB 2Eh,2Fh ;Указываем позицию вывода: X=2Eh, Y=2Fh
62h TXTP 10h,0297d ;Выводим строку из памяти "Рассчитать!"
66h TAB 1Ch,38h ;Указываем позицию вывода: X=1Ch, Y=38h
69h TXTP 10h,0309d ;Выводим строку из памяти "S"
6Dh TAB 2Eh,38h ;Указываем позицию вывода: X=2Eh, Y=38h
70h PREXP 10h,0014d ;Выводим содержимое регистра РD
74h END ;Конец основной программы
0 1 2 3 4 5 6 7 8 9
140 65h 00h 60h 1Ch 00h 53h
150 10h 02h 63h 60h 22h 08h 53h 10h 02h 78h
160 60h 1Ah 11h 59h 00h 4Bh 01h 60h 1Ch 14h
170 53h 10h 02h 91h 60h 2Eh 14h 5Ch 10h 00h
180 10h 60h 1Ch 1Dh 53h 10h 02h 93h 60h 2Eh
190 1Dh 5Ch 10h 00h 11h 60h 1Ch 26h 53h 10h
200 02h 95h 60h 2Eh 26h 5Ch 10h 00h 12h 60h
210 2Eh 2Fh 53h 10h 02h 97h 60h 1Ch 38h 53h
220 10h 03h 09h 60h 2Eh 38h 5Ch 10h 00h 14h
230 FFh
75h TAB 2Ah,13h ;Указываем позицию вывода: X=2Ah, Y=13h
78h LDADR 0010h ;Вводим число в регистр РА
7Bh JM 90h ;Переходим на вывод рамки по адресу 90h
0 1 2 3 4 5 6 7 8 9
230 60h 2Ah 13h 4Dh 00h 10h 38h 90h
7Dh TAB 2Ah,1Ch ;Указываем позицию вывода: X=2Ah, Y=1Ch
80h LDADR 0010h ;Вводим число в регистр РВ
83h JM 90h ;Переходим на вывод рамки по адресу 90h
0 1 2 3 4 5 6 7 8 9
230 60h
240 2Ah 1Ch 4Dh 00h 10h 38h 90h
85h TAB 2Ah,25h ;Указываем позицию вывода: X=2Ah, Y=25h
88h LDADR 0010h ;Вводим число в регистр РС
8Bh JM 90h ;Переходим на вывод рамки по адресу 90h
0 1 2 3 4 5 6 7 8 9
240 60h 2Ah 25h
250 4Dh 00h 10h 38h 90h
8Dh TAB 2Ah,2Eh ;Указываем позицию вывода: X=2Ah, Y=2Eh
90h FRAME 10h,3Bh,0Ah ;Выводим рамку размером X=3Bh, Y=0Ah
94h END ;Конец программ всех элементов
0 1 2 3 4 5 6 7 8 9
250 60h 2Ah 2Eh 5Bh 10h
260 3Bh 0Ah FFh
0 1 2 3 4 5 6 7 8 9
110 00h 01h 14h FFh 03h 08h 0Ch 0Ch 14h 16h
120 1Eh 1Ah 05h 05h 05h 0Dh FEh 00h FEh 01h
130 FEh 02h 00h 03h 03h 00h 01h 02h 03h 00h
140 75h 7Dh 85h 8Dh 65h 00h 60h 1Ch 00h 53h
150 10h 02h 63h 60h 22h 08h 53h 10h 02h 78h
160 60h 1Ah 11h 59h 00h 4Bh 01h 60h 1Ch 14h
170 53h 10h 02h 91h 60h 2Eh 14h 5Ch 10h 00h
180 10h 60h 1Ch 1Dh 53h 10h 02h 93h 60h 2Eh
190 1Dh 5Ch 10h 00h 11h 60h 1Ch 26h 53h 10h
200 02h 95h 60h 2Eh 26h 5Ch 10h 00h 12h 60h
210 2Eh 2Fh 53h 10h 02h 97h 60h 1Ch 38h 53h
220 10h 03h 09h 60h 2Eh 38h 5Ch 10h 00h 14h
230 FFh 60h 2Ah 13h 4Dh 00h 10h 38h 90h 60h
240 2Ah 1Ch 4Dh 00h 10h 38h 90h 60h 2Ah 25h
250 4Dh 00h 10h 38h 90h 60h 2Ah 2Eh 5Bh 10h
260 3Bh 0Ah FFh
0 1 2 3 4 5 6 7 8 9
260 90h A0h E1h E7h F1h E2h 20h
270 AFh ABh AEh E9h A0h A4h A8h FFh E2h E0h
280 A5h E3h A3h AEh ABh ECh ADh A8h AAh A0h
290 FFh 41h FFh 42h FFh 43h FFh 90h A0h E1h
300 E1h E7h A8h E2h A0h E2h ECh 21h FFh 53h
310 FFh 82h EBh E5h AEh A4h FFh
В/О, С/П.