uragan90 0 29 мая, 2011 Опубликовано 29 мая, 2011 (изменено) · Жалоба Здравствуйте!!! Пытаюсь делать меню для дисплея состоящего из нескольких экранных кнопок в которых изменяются две строчки текста (Параметр и строчка значения). Так же, эти кнопки по плану, должны менять активность (цвет канта- красный, зеленый, чёрный). Все это дело рулиться пятью кнопками. Собственно в чем заминка: Когда стал писать текст самого меню у меня получается огромный и бесконечный лист кода Я еще новичок!!! Я вывожу текст всех этих строк в кнопках строчкой кода типа для каждой строчки- каждый раз: 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: Работать должно так: Пяти кнопочным джойстиком (вправо,влево) выбираю кнопку, нажимаю ОК - кнопка должна поменять статус(цвет канта- красный), еще раз нажимаем ОК (опять меняется цвет канта кнопки на зеленый) и становится возможным изменять строчку параметра (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"}; ... И в функции меню выбирать элементы этих массивов??? Изменено 29 мая, 2011 пользователем uragan90 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nixon 4 29 мая, 2011 Опубликовано 29 мая, 2011 · Жалоба Копайте в сторону micromenu - http://www.avrfreaks.net/index.php?module=...&showinfo=1 Я на ее основе сделал себе многоуровневое меню именно в вашем варианте - под джойстик и возможность изменять прямо в меню параметры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 29 мая, 2011 Опубликовано 29 мая, 2011 (изменено) · Жалоба Спасибо буду разбираться так то у меня всё работает, но больно код огромный почти всё на "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); Изменено 29 мая, 2011 пользователем uragan90 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 29 мая, 2011 Опубликовано 29 мая, 2011 · Жалоба Помогите новичку въехать в принцип построения менюх, пожалуйста :rolleyes: Меню делается из базовых структур: дерева и стека. Деревом описывается само меню и все его уровни с аттрибутами. Стек используется для запоминания текущей траектории по ветвям в дереве меню. Дерево здесь по сути однонаправленный список в каждом узле корого хранится массив указателей на узлы ветвей и собственные аттрибуты. Дерево формируется во время парсинга конфигурационного файла с описанием меню. И дерево и стек формируются динамически в памяти с использованием указателей. Поэтому нужен еще хороший движок кучи (heap-а). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nixon 4 29 мая, 2011 Опубликовано 29 мая, 2011 · Жалоба И дерево и стек формируются динамически в памяти с использованием указателей. Поэтому нужен еще хороший движок кучи (heap-а).В большинстве случаев это необязательно - дерево меню может быть создано статически, а от стека переходов можно вообще отказаться (если соответственно создать дерево) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 29 мая, 2011 Опубликовано 29 мая, 2011 · Жалоба В большинстве случаев это необязательно - дерево меню может быть создано статически, а от стека переходов можно вообще отказаться (если соответственно создать дерево) Я специально не конкретизировал схему дерева и стека, поскольку в моем варианте можно взять любой учебник по C и скопировать оттуда процедуры работы с деревьями и стеками. Они будут выполнены с использованием динамического выделения памяти. А статические деревья на С-и писать еще муторней чем нудно писать одинаковые строки текстов. Меню легче всего оформлять как ресурс в виде сериализованых данных например в одном из форматов XML, YAML, JSON... чтобы его было проще генерировать и верифицировать на правильность синтаксиса. Ну а сорсов парсеров XML навалом, и строят они в результате те самые динамические деревья. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 29 мая, 2011 Опубликовано 29 мая, 2011 · Жалоба Спасибо за помощь всем откликнувшимся! Создал функцию вида: 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" может хватить для этой задачи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 30 мая, 2011 Опубликовано 30 мая, 2011 · Жалоба Вариантов масса. Пробуйте, выбирайте оптимальный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 1 июня, 2011 Опубликовано 1 июня, 2011 · Жалоба Загоните ваши кнопки в массив структур (имя кнопки, номера смежных кнопок сверху/снизу/справа/слева, массив возможных значений). И сделайте простую процедуру, которая ходит по этому массиву. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sirko 0 1 июня, 2011 Опубликовано 1 июня, 2011 · Жалоба Копайте в сторону micromenuПрисоединяюсь. Если вы здесь еще не бывали, то рекомендую. Off. Как по мне, то без динамического выделения памяти лучше обойтись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться