Полная версия этой страницы:
Организация меню
Integral
Oct 14 2008, 21:22
Есть екранчик на котором менюшка, перебераеться вверх/вниз, выбераеться что нужно и т.д.
Вопрос в том может кто знает какието стандартные подходы для организации меню? Например вот у меня.... двухстрочный екранчик, есть указатель на елемнт который сейчас выбран. (стрелочка например) При гортании вверх/вниз стрелочка ползает, и при необходимости передвигаеться весь список... Ну думаю понятно.
Так вот, менюшку я сделал и все работает. Но как оказалось получилось настолько тупо что даже сам начал плутаться в програме..... очень сложно добавлять/удалять пункты меню, делать бОльшую/меньшую "глубину" меню и т.п.
Так вот, может есть какойто популярный и т.п. подход для организации таких дел? Нужно такой подход чтобы устранить проблемы которые я описал выше.
zltigo
Oct 14 2008, 21:28
Цитата(Integral @ Oct 14 2008, 23:22)

Вопрос в том...
Свежо

. Обсуждалось не раз. Поиском воспользуйтесь.
Integral
Oct 14 2008, 21:49
Уж очень больно много тем нужно пересмотреть....
Придуть удачный запрос не удается чето....
DRUID3
Oct 14 2008, 21:53
А Вы ищите через google в связке с electronix.ru . Сам так делаю, ибо местный поиск оставляет желать лучшего.
Integral
Oct 14 2008, 21:57
Мне токо меню всяких модных ресторанов попадаются...
zltigo
Oct 14 2008, 22:02
Цитата(Integral @ Oct 14 2008, 23:57)

Мне токо меню всяких модных ресторанов попадаются...

Дело в том, что надо почитать хелп по пользованию поиском Google. Очень помогает
искать там, где НЕТ меню ресторанов, например, на electronix.ru
EugeNNe
Oct 15 2008, 04:33
kosyak©
Oct 15 2008, 06:25
Когда делал девайс с клавиатуркой и текстовым ЖК...
Там в файле menu.c и menu.h реализация меню и описание необходимых структур.
Чтобы это все работало необходима реализация некоторых функций стандартной библиотеки
+ еще парочка - вообще в файле conio.h описание всех реализованных мной функций.
ну и пример использования там же....
Если интересно станет пиши - помогу разобраться.
Да, писалось все под компилятор Keil.... но это, думаю, не принципиально...
Integral
Oct 18 2008, 13:22
Всем очень благодарен за ответы.
Лично мне подошёл вариант от
e-moe тутаПосле некоторых доработок все успешно работает.
Думаю с вопросом грамотного создания менюшки много кото сталкивается, может создать отдельную тему и прикрепить ее сверху?
Sharasir
Jan 2 2009, 01:23
Паяю давненько, МК начал программировать недавно, а на С вообще первый проект. Вобщем пытаюсь собрать ус-во для управления аквариумом (поддержание дневной и ночной температуры, вкл/выкл подсветки, аэратора, кормление в заданное время). Собрал на макетной плате (PIC16F628, LCD 2строки/8 символов, четыре кнопки, DS18B20, будет датчик освещенности) Вобщем не знаю как организовать меню. Сделал переменную Menu которую инкр/декр с помощью кнопок перелистывания меню а на индикатор вывожу символы сохраненные в массивах конст. через Switch(Menu). Всего 10 пунктов меню, 2 из которых еще имеют подменю. И закончилась память программ у пика ((((. 2кБ. А это только кнопки, LCD, меню и часы ). А еще нуно вставить инициализацию и обращение к DS18B20, опт. датчик и прочую математику... Может както можно организовать такое меню более щадяще для памяти программ? Обидно, с выводами МК влез, и только из-за прошивки не хочется ставить PIC16F876 (28 ног, завалялся у меня).
Я делаю через структуры. Это удобно, если надо расширять меню и подменю. Но в контроллеры с малым объемом памяти программ и данных такое засовывать смысла нет, так как структуры скушают большой кусок памяти данных, а преобразование чисел в строки для LCD и математика займет неплохой кусок памяти программ (я говорю про Си). Поэтому для маленьких МК, наверное, лучше через switch.
Цитата(petrd @ Jan 2 2009, 12:24)

так как структуры скушают большой кусок памяти данных,
Не обязательно. Можно размещать структуры во флеше и нет необходимости читать их полностью. Правда, работа с памятью программ у разных компиляторов сильно отличается. В Hi-Tech, например, вообще неудобно ни работать, ни инициализировать эти структуры.
2Sharasir: какой компилятор используете?
Sharasir
Jan 2 2009, 16:50
Я только начал пробовать на С. Сначала попробовал МикроС. Чтото он слишком большой код генерировал. Я попробовал CCS. Он мне понравился больше, и эта часть проги написана на нем.
Цитата(petrd @ Jan 2 2009, 12:24)

Я делаю через структуры. Это удобно, если надо расширять меню и подменю. Но в контроллеры с малым объемом памяти программ и данных такое засовывать смысла нет, так как структуры скушают большой кусок памяти данных, а преобразование чисел в строки для LCD и математика займет неплохой кусок памяти программ (я говорю про Си). Поэтому для маленьких МК, наверное, лучше через switch.
Удобнее через указатели. Структура одного узла.
Код
typedef struct typeMenu
{
const unsigned char *Caption; /* Pointer to caption */
const typeDetektHotKey *ppFunc; // Указатель на указатель описывающий вызывающий функцию
const signed char pos; // Смещение позиции caption относительно стандартного
const struct typeMenu *parent; // Указывает на родительский узел
const struct typeMenu *child; // Если есть потомок
const struct typeMenu *up; // Эти два выстраивают вертикальную цепочку
const struct typeMenu *down;
const struct typeMenu *left; // Соседние ветки
const struct typeMenu *right;
} typeMenu;
Цитата(Sharasir @ Jan 2 2009, 04:23)

Паяю давненько, МК начал программировать недавно, а на С вообще первый проект. Вобщем пытаюсь собрать ус-во для управления аквариумом (поддержание дневной и ночной температуры, вкл/выкл подсветки, аэратора, кормление в заданное время). Собрал на макетной плате (PIC16F628, LCD 2строки/8 символов, четыре кнопки, DS18B20, будет датчик освещенности) Вобщем не знаю как организовать меню. Сделал переменную Menu которую инкр/декр с помощью кнопок перелистывания меню а на индикатор вывожу символы сохраненные в массивах конст. через Switch(Menu). Всего 10 пунктов меню, 2 из которых еще имеют подменю. И закончилась память программ у пика ((((. 2кБ.
Хм. У вас только СТРОКИ из самого меню забьют эту самую память программ (1 символ - 1 слово) Меню надо кодировать максимально компактно, switch'и из программы убирать. Структура описания меню должна быть такая, что бы размер занятой памяти программ был равен количеству символов + несколько байт на каждый элемент меню (чем меньше, тем лучше). Код обработки меню не должен зависить от размера собственно меню.
В любом случае в 628 пик много не влезет

Можно попробовать 648 пик.
В качестве компилятора лучше взять HI-TECH PICC, он пожалуй наилучший
Ну не знаю....2Кб это много. Очень много. Раньше на 2Кб делали текстовые операционные системы.
Сначала, наверное, нужно сделать все что касается математики и датчика температуры. Оптимизировать до предела, а потом думать что делать с менюшками.
Есть два пути.
Первый, перейти на ассемблер, и через JNZ, JZ сделать переходы меню.
Второй способ, использовать C, и его IF/ELSE или SWITCH/CASE.
Поставить максимальную оптимизацию по размеру и посмотреть, кто из них меньше памяти потребляет.
И после этого принимать решение, на чем писать и писать ли вообще.
Уверен, свободно можно уместиться в 2К на ассемблере, а возможно и на С, только нужно забыть
про такие понятия как структура, массив и косвенная адресация. Прямая и непосредственная адресация
дает максимальный выигрыш. Возможно, повторяю, возможно, накатать движок и к нему структуру,
которые вместе дадут больший выигрыш в размере при скажем десятке менюшек, в итоге. Но это и рискованно, можно время потерять без
толку и ненадежно, движок еще отладить нужно, а структуры так и норовят фигню подсунуть, все контролировать нужно. Поэтому
чем проще и корявее, тем как правило более некрасиво, но места занимает меньше....
Цитата(XVR @ Jan 5 2009, 15:03)

Хм. У вас только СТРОКИ из самого меню забьют эту самую память программ (1 символ - 1 слово)
Эт точно. Там только через
жо retlw можно символы сохранять

Цитата
HI-TECH PICC, он пожалуй наилучший
Стремный он какой-то, этот Хайтек. То нельзя, это нельзя... Неудобно работать.
Цитата(rvk @ Jan 5 2009, 16:13)

Первый, перейти на ассемблер, и через JNZ, JZ сделать переходы меню.
Вне зависимости от языка реализации меню делается именно через то, что в Си называется структурой.
А 2к должно хватить. Но может не хватить одного байта
Вот только сегодня обсуждали зачатки меню на структурах и указателях
http://www.microchip.su/showthread.php?t=4781
Цитата(_Pasha @ Jan 5 2009, 15:42)

Стремный он какой-то, этот Хайтек. То нельзя, это нельзя... Неудобно работать.
Эээ, а чего в нем нельзя?
Цитата
А 2к должно хватить. Но может не хватить одного байта

Угу, есть проект - таймер для солярия. Там некоторая интерактивная часть - для задания времени и количества интервалов загара, а так же для определения рабочих секций УФ ламп. Меню совсем немного, собственно таймера тоже немного, и остальной интерактив. Всего около 600 строк на С. Полностью забитая PIC16F628
Цитата(XVR @ Jan 5 2009, 18:20)

Эээ, а чего в нем нельзя?
Навскидку, что запомнилось
Код
for(char i=0;i<10;i++) do_something();
Низзя объявить в цикле переменную.
Работать с флешом/еепромом тяжко. Этого, конечно мало, чтоб предъявить

, но сейчас не вспомню.
A. Fig Lee
Jan 6 2009, 03:46
Цитата(rvk @ Jan 5 2009, 07:13)

Ну не знаю....2Кб это много. Очень много. Раньше на 2Кб делали текстовые операционные системы.
возможно. только не на PIC-ах.
Сколько байт там займет
if ( x > y) {
..
}
- сначала он загрузит W
- потом получит STATUS через вычитание.
- потом сравнит C - переполнение и перейдет кудато если не так
- в неидеальном варианте без переполнения тоже перейдет
на операцию у нас скоко уходит? 2 байта?
итого - 6-8 ?
они ужасны, ети PIC-и (каску надел)
у самого штук 100 - и жаба давит и сделать ничего не могу.
Цитата(_Pasha @ Jan 5 2009, 13:27)

Навскидку, что запомнилось
Код
for(char i=0;i<10;i++) do_something();
Низзя объявить в цикле переменную.
Работать с флешом/еепромом тяжко. Этого, конечно мало, чтоб предъявить

, но сейчас не вспомню.
ето верно. в последдних gcc тоже вроде нельзя
Цитата(_Pasha @ Jan 5 2009, 21:27)

Навскидку, что запомнилось
Код
for(char i=0;i<10;i++) do_something();
Низзя объявить в цикле переменную.
Это С++ (или С99). Ни один эмбеддед чистый С компилятор это не поддерживает
Цитата
Работать с флешом/еепромом тяжко.
Это есть, но не смертельно. Кроме того, в последних версиях уже появились переменные в EEPROM (вот только не помню, в PICC или только в PICC 18)
zksystem
Jan 24 2009, 14:29
экономить память можно следующим способом, как это делалось в старых играх для 8и битных компьютеров:
создается словарь слов, каждому слову назначается соответствующий индекс, в итоге предложение (текст) получается в виде цепочки индексов.
chert_kol
Feb 1 2009, 17:24
А может стоит поставить внешнюю Flash и написать нормальную менюшку с применением указателей. Потом кучу времени сэкономишь на разборке кода. Я поставил AT45.... 16Мбит. Для меню за глаза...
Цитата(chert_kol @ Feb 1 2009, 20:24)

А может стоит поставить внешнюю Flash и написать нормальную менюшку с применением указателей. Потом кучу времени сэкономишь на разборке кода. Я поставил AT45.... 16Мбит. Для меню за глаза...
Он же пишет, что все руки/ноги забиты(я ж надеюсь, ЛЦД полубайтами грузится ?). И потом, есть ли у этого PIC_a SPI ?, что то сдается мне, что АТ45 будет как корове седло на нем.
chert_kol
Feb 4 2009, 05:17
Цитата(INT1 @ Feb 2 2009, 07:08)

Он же пишет, что все руки/ноги забиты(я ж надеюсь, ЛЦД полубайтами грузится ?). И потом, есть ли у этого PIC_a SPI ?, что то сдается мне, что АТ45 будет как корове седло на нем.
Как говорил мой начальник всегда есть выход...
Вот одно богатое место (я про дисплей)...
А SPI можно и ручками написать один черт будет меньше чем хранить мену в PIC
Eddy71
Feb 11 2009, 18:27
Цитата(A. Fig Lee @ Jan 6 2009, 06:46)

возможно. только не на PIC-ах.
Сколько байт там займет
if ( x > y) {
..
}
movf x,w
subwf y,w
bnc дальше
{
...
}
Цитата
на операцию у нас скоко уходит? 2 байта?
итого - 6-8 ?
У PICов память в словах. Для того же 628-го 2к слов. 1 такт - одно слово. 4 машинных слова. Это много?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.