|
Организация меню |
|
|
|
Oct 15 2008, 06:25
|

Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966

|
Когда делал девайс с клавиатуркой и текстовым ЖК... Там в файле menu.c и menu.h реализация меню и описание необходимых структур. Чтобы это все работало необходима реализация некоторых функций стандартной библиотеки + еще парочка - вообще в файле conio.h описание всех реализованных мной функций. ну и пример использования там же.... Если интересно станет пиши - помогу разобраться. Да, писалось все под компилятор Keil.... но это, думаю, не принципиально...
Прикрепленные файлы
menu.rar ( 3.47 килобайт )
Кол-во скачиваний: 108
|
|
|
|
|
Oct 18 2008, 13:22
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519

|
Всем очень благодарен за ответы. Лично мне подошёл вариант от e-moe тутаПосле некоторых доработок все успешно работает. Думаю с вопросом грамотного создания менюшки много кото сталкивается, может создать отдельную тему и прикрепить ее сверху?
|
|
|
|
|
Jan 2 2009, 01:23
|
Группа: Участник
Сообщений: 5
Регистрация: 2-01-09
Пользователь №: 42 879

|
Паяю давненько, МК начал программировать недавно, а на С вообще первый проект. Вобщем пытаюсь собрать ус-во для управления аквариумом (поддержание дневной и ночной температуры, вкл/выкл подсветки, аэратора, кормление в заданное время). Собрал на макетной плате (PIC16F628, LCD 2строки/8 символов, четыре кнопки, DS18B20, будет датчик освещенности) Вобщем не знаю как организовать меню. Сделал переменную Menu которую инкр/декр с помощью кнопок перелистывания меню а на индикатор вывожу символы сохраненные в массивах конст. через Switch(Menu). Всего 10 пунктов меню, 2 из которых еще имеют подменю. И закончилась память программ у пика ((((. 2кБ. А это только кнопки, LCD, меню и часы ). А еще нуно вставить инициализацию и обращение к DS18B20, опт. датчик и прочую математику... Может както можно организовать такое меню более щадяще для памяти программ? Обидно, с выводами МК влез, и только из-за прошивки не хочется ставить PIC16F876 (28 ног, завалялся у меня).
|
|
|
|
|
Jan 2 2009, 08:24
|
Участник

Группа: Участник
Сообщений: 37
Регистрация: 3-06-08
Пользователь №: 38 012

|
Я делаю через структуры. Это удобно, если надо расширять меню и подменю. Но в контроллеры с малым объемом памяти программ и данных такое засовывать смысла нет, так как структуры скушают большой кусок памяти данных, а преобразование чисел в строки для LCD и математика займет неплохой кусок памяти программ (я говорю про Си). Поэтому для маленьких МК, наверное, лучше через switch.
|
|
|
|
|
Jan 2 2009, 16:50
|
Группа: Участник
Сообщений: 5
Регистрация: 2-01-09
Пользователь №: 42 879

|
Я только начал пробовать на С. Сначала попробовал МикроС. Чтото он слишком большой код генерировал. Я попробовал CCS. Он мне понравился больше, и эта часть проги написана на нем.
|
|
|
|
|
Jan 3 2009, 09:07
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(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;
|
|
|
|
|
Jan 5 2009, 11:03
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(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, он пожалуй наилучший
Сообщение отредактировал XVR - Jan 5 2009, 11:04
|
|
|
|
|
Jan 5 2009, 12:13
|
Частый гость
 
Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067

|
Ну не знаю....2Кб это много. Очень много. Раньше на 2Кб делали текстовые операционные системы. Сначала, наверное, нужно сделать все что касается математики и датчика температуры. Оптимизировать до предела, а потом думать что делать с менюшками. Есть два пути. Первый, перейти на ассемблер, и через JNZ, JZ сделать переходы меню. Второй способ, использовать C, и его IF/ELSE или SWITCH/CASE. Поставить максимальную оптимизацию по размеру и посмотреть, кто из них меньше памяти потребляет. И после этого принимать решение, на чем писать и писать ли вообще. Уверен, свободно можно уместиться в 2К на ассемблере, а возможно и на С, только нужно забыть про такие понятия как структура, массив и косвенная адресация. Прямая и непосредственная адресация дает максимальный выигрыш. Возможно, повторяю, возможно, накатать движок и к нему структуру, которые вместе дадут больший выигрыш в размере при скажем десятке менюшек, в итоге. Но это и рискованно, можно время потерять без толку и ненадежно, движок еще отладить нужно, а структуры так и норовят фигню подсунуть, все контролировать нужно. Поэтому чем проще и корявее, тем как правило более некрасиво, но места занимает меньше....
Сообщение отредактировал rvk - Jan 5 2009, 12:17
|
|
|
|
|
Jan 5 2009, 12:42
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(XVR @ Jan 5 2009, 15:03)  Хм. У вас только СТРОКИ из самого меню забьют эту самую память программ (1 символ - 1 слово) Эт точно. Там только через жо retlw можно символы сохранять  Цитата HI-TECH PICC, он пожалуй наилучший Стремный он какой-то, этот Хайтек. То нельзя, это нельзя... Неудобно работать. Цитата(rvk @ Jan 5 2009, 16:13)  Первый, перейти на ассемблер, и через JNZ, JZ сделать переходы меню. Вне зависимости от языка реализации меню делается именно через то, что в Си называется структурой. А 2к должно хватить. Но может не хватить одного байта
|
|
|
|
|
Jan 5 2009, 14:20
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(_Pasha @ Jan 5 2009, 15:42)  Стремный он какой-то, этот Хайтек. То нельзя, это нельзя... Неудобно работать. Эээ, а чего в нем нельзя? Цитата А 2к должно хватить. Но может не хватить одного байта  Угу, есть проект - таймер для солярия. Там некоторая интерактивная часть - для задания времени и количества интервалов загара, а так же для определения рабочих секций УФ ламп. Меню совсем немного, собственно таймера тоже немного, и остальной интерактив. Всего около 600 строк на С. Полностью забитая PIC16F628
|
|
|
|
|
Jan 5 2009, 18:27
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(XVR @ Jan 5 2009, 18:20)  Эээ, а чего в нем нельзя? Навскидку, что запомнилось Код for(char i=0;i<10;i++) do_something(); Низзя объявить в цикле переменную. Работать с флешом/еепромом тяжко. Этого, конечно мало, чтоб предъявить  , но сейчас не вспомню.
|
|
|
|
|
Jan 6 2009, 03:46
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(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 тоже вроде нельзя
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 6 2009, 04:35
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(_Pasha @ Jan 5 2009, 21:27)  Навскидку, что запомнилось Код for(char i=0;i<10;i++) do_something(); Низзя объявить в цикле переменную. Это С++ (или С99). Ни один эмбеддед чистый С компилятор это не поддерживает Цитата Работать с флешом/еепромом тяжко. Это есть, но не смертельно. Кроме того, в последних версиях уже появились переменные в EEPROM (вот только не помню, в PICC или только в PICC 18)
|
|
|
|
|
Feb 1 2009, 17:24
|
Частый гость
 
Группа: Свой
Сообщений: 90
Регистрация: 23-01-09
Из: Санкт-Петербург
Пользователь №: 43 842

|
А может стоит поставить внешнюю Flash и написать нормальную менюшку с применением указателей. Потом кучу времени сэкономишь на разборке кода. Я поставил AT45.... 16Мбит. Для меню за глаза...
--------------------
С уважением, Chert_kol.
|
|
|
|
|
Feb 4 2009, 05:17
|
Частый гость
 
Группа: Свой
Сообщений: 90
Регистрация: 23-01-09
Из: Санкт-Петербург
Пользователь №: 43 842

|
Цитата(INT1 @ Feb 2 2009, 07:08)  Он же пишет, что все руки/ноги забиты(я ж надеюсь, ЛЦД полубайтами грузится ?). И потом, есть ли у этого PIC_a SPI ?, что то сдается мне, что АТ45 будет как корове седло на нем. Как говорил мой начальник всегда есть выход... Вот одно богатое место (я про дисплей)... А SPI можно и ручками написать один черт будет меньше чем хранить мену в PIC
--------------------
С уважением, Chert_kol.
|
|
|
|
|
Feb 11 2009, 18:27
|

Местный
  
Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879

|
Цитата(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 машинных слова. Это много?
Сообщение отредактировал Eddy71 - Feb 11 2009, 18:32
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|