Графический интерфейс пользователя в прикладных программах






Программируемые микрокалькуляторы обладают возможностью проводить расчёты по заранее составленной программе, что заметно упрощает процесс рутинных вычислений. По методике расчёта составляется программа, заносится в память программ, исходные данные заносятся в рабочие регистры, запускается программа, после останова из регистров извлекаются результаты расчётов.


В качестве примера можно составить программу расчёта площади треугольника по формуле Герона.

Формула Герона позволяет рассчитать площадь треугольника по размерам трёх его сторон: 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.

После расчёта, нужно остановить программу, чтобы результат расчёта отобразился на дисплее. Для удобства повторного расчёта, нужно добавить переход на начало программы, чтобы после останова, программу можно было перезапустить вновь:


       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


Перед запуском программы нужно занести размеры сторон треугольника в регистры РА, РВ, РС.

Например, размеры сторон треугольника: 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 для промежуточного хранения кода нажатой клавиши.

Сначала нужно очистить рабочие регистры РА, РВ, РС, РЕ и подготовить к работе графический интерфейс пользователя:


      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


Теперь нужно обеспечить считывание кода нажатых клавиш из регистра Р9029, передача команд в регистр Р9208, а также считывание из регистра Р9209 и обработку кода результата выполнения команды, а также остановку программы при нажатии на клавишу "ВЫХОД":


      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, код нажатой клавиши передаётся в регистр команд Р9208. При считывании кодов ошибок из регистра Р9209, или нажатии на клавишу "ВЫХОД", переходим к останову программы, по адресу 95.


При коде выполнения операции, равном 1, требуется дополнительная обработка команды, в нашей программе рассчитывается значение площади треугольника и заносится в регистр РЕ. Далее, обнуляются указатели номеров формы - Р9202 и элемента - Р9203 и перерисовывается экран. Для этого используется подготовка интерфейса к работе:


      0    1    2    3    4    5    6    7    8    9

 70   24  ИПА  ИПВ  ИПС   +    +    2    ÷    ПD  ИПА

 80   -   ИПD  ИПВ   -   ИПD  ИПС   -   ИПD   х    х

 90   х    F√   ПЕ   БП   15


При окончании ввода числа из регистра Р9209 считывается код, равный 7, при этом увеличиваем номер действующего элемента, чтобы можно было вводить исходные данные по очереди:


      0    1    2    3    4    5    6    7    8    9

 40  РРИП  92   03   1    +   РРП   92   03   БП   22


При нажатии на клавишу "ВЫХОД" при нулевой текущей форме, или при считывании кодов ошибок из регистра Р9209, записью адреса строки 0311 в регистр Р9026 в строке комментариев выводится сообщение "Выход", очищаются регистры РY, РZ и РT, в регистр РХ выводится код ошибки и происходит останов программы:


      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


Графический интерфейс пользователя состоит из главной таблицы меню, и экранных форм.


Главная таблица меню состоит из ряда трёхбайтовых записей, первый байт - номер формы, второй и третий байты - адрес заголовка формы в памяти программ, и заканчивается кодом 0FFh. В нашей программе всего одна форма, и главная таблица меню состоит всего из одной записи:


      0    1    2    3    4    5    6    7    8    9

110  00h  01h  14h   FFh


Форма состоит из заголовка формы, адресов таблиц переходов по командам "ВВОД", "ВЫХОД", "ВЫБОР ВЛЕВО(ВВЕРХ)", "ВЫБОР ВПРАВО(ВНИЗ)", адресов основной программы формы и адреса таблицы адресов программ элементов. Все адреса представляют собой смещения относительно начала заголовка формы в шестнадцатеричном формате.

Размер формы ограничен размером 256 байт.

Для нашей программы достаточно одной - единственной формы и четырёх элементов, три для ввода размеров сторон и один для запуска расчёта площади. Форма ввода числа (254) программирования не требует.


Заголовок формы нашей программы:

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


Таблица флагов действий состоит из ряда байтовых записей, для элементов 0, 1, 2 достаточно разрешения команд "ВЫБОР" для переключения действующих элементов и разрешения команды "ВВОД" для перехода к форме ввода десятичного числа. Для 3-го элемента, кроме разрешения команд "ВЫБОР" и "ВВОД", нужно указать признак ввода:


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


Таблица переходов по командам "ВЫБОР ВЛЕВО(ВВЕРХ)" и "ВЫБОР ВПРАВО(ВНИЗ)" состоят из ряда байтовых записей, указывающих на номер нового действующего элемента при выполнении команды "ВЫБОР".


В нашей форме, при нажатии на клавишу "ВЫБОР ВЛЕВО(ВВЕРХ)" номер действующего элемента должен уменьшаться, а при нажатии на клавишу "ВЫБОР ВПРАВО(ВНИЗ)" номер действующего элемента должен увеличиться. Кроме того, если нажата клавиша "ВЫБОР ВЛЕВО(ВВЕРХ)", при 0-м элементе, должен быть задействован 3-й элемент, а если нажата клавиша "ВЫБОР ВПРАВО(ВНИЗ)", при 3-м элементе, должен быть задействован 0-й элемент:


Таблица переходов по команде "ВЫБОР ВЛЕВО(ВВЕРХ)"


03h - переход на 3-й элемент (вверх)
00h - переход на 0-й элемент (вверх)
01h - переход на 1-й элемент (вверх)
02h - переход на 2-й элемент (вверх)


Таблица переходов по команде "ВЫБОР ВПРАВО(ВНИЗ)"


01h - переход на 1-й элемент (вверх)
02h - переход на 2-й элемент (вверх)
03h - переход на 3-й элемент (вверх)
00h - переход на 0-й элемент (вверх)


Таблицы переходов по командам "ВЫБОР ВЛЕВО(ВВЕРХ)"и "ВЫБОР ВПРАВО(ВНИЗ)" можно объединить в одну, при этом адрес таблицы переходов по команде "ВЫБОР ВЛЕВО(ВВЕРХ)" будет начинаться с адреса 14h, а адрес таблицы переходов по команде "ВЫБОР ВПРАВО(ВНИЗ)" будет начинаться с адреса 16h:


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


Основная программа экранной формы, а также программы элементов пишутся на языке графического интерфейса пользователя. Основная программа выполняется при каждой перерисовке формы, а также выполняется программа действующего элемента. Программа оканчивается кодом 0FFh.


Основная программа формы выводит название программы - "Расчёт площади треугольника", названия сторон "А", "В", "С", обозначение площади "S", команду "Рассчитать!" и значение регистров РА, РВ, РС, РЕ:


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


Программа 0-го элемента вводит число в регистр РА и обозначает рамкой вокруг выведенного формой значения регистра РА:


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


Программа 1-го элемента вводит число в регистр РВ и обозначает рамкой вокруг выведенного формой значения регистра РВ:


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


Программа 2-го элемента вводит число в регистр РС и обозначает рамкой вокруг выведенного формой значения регистра РС:


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


Программа 3-го элемента запускает расчёт площади треугольника и обозначает рамкой вокруг выведенной формой строки "Рассчитать!":


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


Вот и всё! Прикладная программа использующая графический интерфейс пользователя для создания меню, готова!


Программу нужно запускать с 0-й страницы памяти программ:


В/О, С/П.

После запуска программы на экране отображается меню:


Для ввода значения размеров сторон нужно нажать клавишу "ВВОД":


Далее, набираем число, с помощью клавиш 0 - 9, /-/, ВП, Сх, например, А=3:


После ввода нажимаем клавишу "ВВОД":


Аналогично вводим значения размеров других сторон, например, В=4, С=5:


Теперь задействуется пункт меню "Рассчитать!". Для расчёта нажимаем на клавишу "ВВОД":


Получаем значение площади треугольника S=6. Можно рассчитывать заново. Для выхода и останова программы нажимаем клавишу "ВЫХОД":


Программу можно использовать как основу для программ, использующих меню, организованное с помощью графического интерфейса пользователя.



Сайт работает на микрокомпьютере