Перейти к содержанию
    

Экранное меню дисплея

Здравствуйте!!! Пытаюсь делать меню для дисплея состоящего из нескольких экранных кнопок в которых изменяются две строчки текста (Параметр и строчка значения). Так же, эти кнопки по плану, должны менять активность (цвет канта- красный, зеленый, чёрный). Все это дело рулиться пятью кнопками. Собственно в чем заминка: Когда стал писать текст самого меню у меня получается огромный и бесконечный лист кода :wacko: Я еще новичок!!! Я вывожу текст всех этих строк в кнопках строчкой кода типа для каждой строчки- каждый раз:

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"};
...

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

Изменено пользователем uragan90

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Копайте в сторону micromenu - http://www.avrfreaks.net/index.php?module=...&showinfo=1

Я на ее основе сделал себе многоуровневое меню именно в вашем варианте - под джойстик и возможность изменять прямо в меню параметры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо буду разбираться так то у меня всё работает, но больно код огромный почти всё на "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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Деревом описывается само меню и все его уровни с аттрибутами.

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

 

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

Дерево формируется во время парсинга конфигурационного файла с описанием меню.

И дерево и стек формируются динамически в памяти с использованием указателей. Поэтому нужен еще хороший движок кучи (heap-а).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И дерево и стек формируются динамически в памяти с использованием указателей. Поэтому нужен еще хороший движок кучи (heap-а).
В большинстве случаев это необязательно - дерево меню может быть создано статически, а от стека переходов можно вообще отказаться (если соответственно создать дерево)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В большинстве случаев это необязательно - дерево меню может быть создано статически, а от стека переходов можно вообще отказаться (если соответственно создать дерево)

 

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

А статические деревья на С-и писать еще муторней чем нудно писать одинаковые строки текстов.

 

Меню легче всего оформлять как ресурс в виде сериализованых данных например в одном из форматов XML, YAML, JSON... чтобы его было проще генерировать и верифицировать на правильность синтаксиса.

Ну а сорсов парсеров XML навалом, и строят они в результате те самые динамические деревья.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Создал функцию вида:

 

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" может хватить для этой задачи?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Загоните ваши кнопки в массив структур (имя кнопки, номера смежных кнопок сверху/снизу/справа/слева, массив возможных значений). И сделайте простую процедуру, которая ходит по этому массиву.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...