реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Экранное меню дисплея, Методы реализации
uragan90
сообщение May 29 2011, 07:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 2-02-09
Из: Тверь
Пользователь №: 44 309



Здравствуйте!!! Пытаюсь делать меню для дисплея состоящего из нескольких экранных кнопок в которых изменяются две строчки текста (Параметр и строчка значения). Так же, эти кнопки по плану, должны менять активность (цвет канта- красный, зеленый, чёрный). Все это дело рулиться пятью кнопками. Собственно в чем заминка: Когда стал писать текст самого меню у меня получается огромный и бесконечный лист кода wacko.gif Я еще новичок!!! Я вывожу текст всех этих строк в кнопках строчкой кода типа для каждой строчки- каждый раз:
Код
void lcd_putchar(unsigned int x, unsigned int y, unsigned char c, unsigned short t_color, unsigned short b_color, unsigned char rot, unsigned char zoom )

Но возможных параметров в кнопках всего 10, а значений 45 возможных. Может это дело как то в массив запихать и потом написать функцию кнопки вида:
Код
Key(unsigned int x, unsigned int y, unsigned char status, unsigned znachenie, unsigned int parametr)

Помогите новичку въехать в принцип построения менюх, пожалуйста rolleyes.gif

Работать должно так:
Пяти кнопочным джойстиком (вправо,влево) выбираю кнопку, нажимаю ОК - кнопка должна поменять статус(цвет канта- красный), еще раз нажимаем ОК (опять меняется цвет канта кнопки на зеленый) и становится возможным изменять строчку параметра (10 вариантов). Нажимаем кнопку верх-низ выбираем уже значения и кнопками в лево-право пролистаем значения (в разных кнопках их поразному где 7, где 12 значений). Как бы это записать то или понять. Мой текст кода огромен... Забыл добавить мк at91sam7s256, экран от китайской нокиа n95

Может вот так надо??
Создать массивы
Код
unsigned char X1[]={"Stroka 1"};
unsigned char X2[]={"Stroka 2"};
unsigned char X3[]={"Stroka 3"};
unsigned char X4[]={"Stroka 4"};
unsigned char X5[]={"Stroka 5"};
...

unsigned char Y1[]={"Stroka 1"};
unsigned char Y2[]={"Stroka 2"};
unsigned char Y3[]={"Stroka 3"};
unsigned char Y4[]={"Stroka 4"};
unsigned char Y5[]={"Stroka 5"};
...

И в функции меню выбирать элементы этих массивов???

Сообщение отредактировал uragan90 - May 29 2011, 12:07
Go to the top of the page
 
+Quote Post
Nixon
сообщение May 29 2011, 10:44
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Копайте в сторону micromenu - http://www.avrfreaks.net/index.php?module=...&showinfo=1
Я на ее основе сделал себе многоуровневое меню именно в вашем варианте - под джойстик и возможность изменять прямо в меню параметры.


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
uragan90
сообщение May 29 2011, 11:32
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 2-02-09
Из: Тверь
Пользователь №: 44 309



Спасибо буду разбираться так то у меня всё работает, но больно код огромный почти всё на "else if" и "switch"..
Вот ещё вопросик по теме если не париться с макро меню.
Есть много строк вида:

Код
const unsigned char string_1[]={"parameter_1"};
const unsigned char string_2[]={"parameter_2"};
const unsigned char string_3[]={"parameter_3"};
...




??? Как из этих строк создать массив вида ???:
PHP код:
Код
const unsigned char mass_string[]={string_1, string_2, string_3, ...};




Что б в цикле можно было по очереди выводить или переключать эти строки например так:
PHP код:
Код
for(i=0;i<10;i++)
LCD_print (mass_string[i]);
deley(1000);


Сообщение отредактировал uragan90 - May 29 2011, 12:08
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 29 2011, 15:47
Сообщение #4


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(uragan90 @ May 29 2011, 10:31) *
Помогите новичку въехать в принцип построения менюх, пожалуйста rolleyes.gif


Меню делается из базовых структур: дерева и стека.

Деревом описывается само меню и все его уровни с аттрибутами.
Стек используется для запоминания текущей траектории по ветвям в дереве меню.

Дерево здесь по сути однонаправленный список в каждом узле корого хранится массив указателей на узлы ветвей и собственные аттрибуты.
Дерево формируется во время парсинга конфигурационного файла с описанием меню.
И дерево и стек формируются динамически в памяти с использованием указателей. Поэтому нужен еще хороший движок кучи (heap-а).
Go to the top of the page
 
+Quote Post
Nixon
сообщение May 29 2011, 18:49
Сообщение #5


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Цитата(AlexandrY @ May 29 2011, 18:47) *
И дерево и стек формируются динамически в памяти с использованием указателей. Поэтому нужен еще хороший движок кучи (heap-а).
В большинстве случаев это необязательно - дерево меню может быть создано статически, а от стека переходов можно вообще отказаться (если соответственно создать дерево)


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 29 2011, 19:35
Сообщение #6


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Nixon @ May 29 2011, 21:49) *
В большинстве случаев это необязательно - дерево меню может быть создано статически, а от стека переходов можно вообще отказаться (если соответственно создать дерево)


Я специально не конкретизировал схему дерева и стека, поскольку в моем варианте можно взять любой учебник по C и скопировать оттуда процедуры работы с деревьями и стеками. Они будут выполнены с использованием динамического выделения памяти.
А статические деревья на С-и писать еще муторней чем нудно писать одинаковые строки текстов.

Меню легче всего оформлять как ресурс в виде сериализованых данных например в одном из форматов XML, YAML, JSON... чтобы его было проще генерировать и верифицировать на правильность синтаксиса.
Ну а сорсов парсеров XML навалом, и строят они в результате те самые динамические деревья.
Go to the top of the page
 
+Quote Post
uragan90
сообщение May 29 2011, 19:48
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 2-02-09
Из: Тверь
Пользователь №: 44 309



Спасибо за помощь всем откликнувшимся!
Создал функцию вида:

Void key_menu(unsigned char x, unsigned char y, unsigned char status, unsigned char parametr, unsigned char znaschenie)

И из массива вида

*mass_string[]

Беру строки и в функции кнопки могу использовать, перебирать вот так например:
for(znaschenie=0;znaschenie<10;znaschenie++)
{
Print_key(*mass_string[znaschenie]);
}

Теперь надо както листать кнопками эти строки должны изменяться, причем по кругу в обоих направлениях кнопками право-лево...
Ещё чтоли массив один нужен? Или "if else" может хватить для этой задачи?


Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 30 2011, 08:00
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Вариантов масса. Пробуйте, выбирайте оптимальный.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 1 2011, 10:43
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Загоните ваши кнопки в массив структур (имя кнопки, номера смежных кнопок сверху/снизу/справа/слева, массив возможных значений). И сделайте простую процедуру, которая ходит по этому массиву.
Go to the top of the page
 
+Quote Post
Sirko
сообщение Jun 1 2011, 19:52
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
Копайте в сторону micromenu
Присоединяюсь.

Если вы здесь еще не бывали, то рекомендую.

Off. Как по мне, то без динамического выделения памяти лучше обойтись.

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016