Kstus 0 9 августа, 2009 Опубликовано 9 августа, 2009 · Жалоба Нужно написать меню на Си, Атмега16 +5кнопок +ЖКИ 16х2 Меня интересует сам принцип организации меню и какие средства языка Си лучше использовать для написания меню Опыта в Си мизер, ткните пальцем для направления верного или может у кого наработки есть, поделитесь для примера, посмотреть исходник. Заранее спасибо всем откливнувшимся. (использую Си компилятор WinAVR и AVR Studio) ЗЫ: может не умею искать, но поис по форуму у меня не увенчался успехом :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 9 августа, 2009 Опубликовано 9 августа, 2009 · Жалоба может не умею искать, но поис по форуму у меня не увенчался успехом :smile3046: Тогда продолжайте учиться искать. Тема на этом форуме избитая, не говоря уже о AVR-овском Butterfly Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 9 августа, 2009 Опубликовано 9 августа, 2009 · Жалоба Меню - разные бывают. Чаще в таких случаях - редактирование параметров и какие-то автонастройки. А у Вас ? А то ведь объять необъятное - много писанины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vishv 0 9 августа, 2009 Опубликовано 9 августа, 2009 · Жалоба Да не нужно искать специальные средства языка - их просто нет. А принцип организации меню у Вас есть - посмотрите на свой сотовый телефон! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kstus 0 9 августа, 2009 Опубликовано 9 августа, 2009 · Жалоба Народ, извиняюсь за размножение избитых тем. сильно не бейте :maniac: Порылся и похожие темы нашёл . Слышал, что для меню предпочтительнее работать с указателями на функцию, звучит классно, но вот видеть этого зверя -не видел. Про указатели читал, до указателей на функцию не дошёл. Может кто даст кусочек кода где применяется указатель на функцию. Я так понимаю по нажатии клавиш проще изменять значение указателя, а по нему ссылаемся на функцию, которая определяет алгоритм и работу следующего пункта меню. Поправьте, если не так понял. Пошел Кернигана читать :smile3009: Всем спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 9 августа, 2009 Опубликовано 9 августа, 2009 · Жалоба Про указатели читал, до указателей на функцию не дошёл. Без разницы - и в том и другом случае это адрес. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZVE 0 9 августа, 2009 Опубликовано 9 августа, 2009 · Жалоба Слышал, что для меню предпочтительнее работать с указателями на функцию, звучит классно, но вот видеть этого зверя -не видел. Смотрите: /*Пример использования массива указателей на функцию, удобного для обслуживания меню */ void function_0(int a); void function_1(int b); void function_2(int c); // объявляем масив из 3 указателей на функции которые имеют параметр целого типа и не // возвращают значения void (*f[3])(int) = (function_0, function_1, function_2); int choice, number; main () { // (*f[choice]) (number); //вызываем функцию под номером choice и передаем ей значение number // } void function_0 (int a) { // } void function_1 (int b) { // } void function_2 (int c) { // } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 9 августа, 2009 Опубликовано 9 августа, 2009 · Жалоба я для многих проектов с меню приспособился делать так. 1. оформляю каждый функциональный режим в виде отдельного файла-модуля, в котором обязательно есть функция вывода на дисплей и функция обработки нажатой кнопки. 2. сами функуии опроса кнопок (т.е. возврат кода нажатой) и управление дисплеем оставляю в основном модуле (непринципиально - можно и в отдельных). 3. в основном модуле создаю массив структур по числу разных режимов (читай - пунктов меню), в структурах у меня адреса функций вывода и обработки кнопок всех режимов - см. выше. 4. основной модуль в сущности сводится при этом к примерно такому (упрощенно): mode = 0; // начальный режим while(1){ key = get_key(); mode = modes_table[mode].do_key(key); // обработка нажатой кнопки соответствующим модулем modes_table[mode].do_display(); // вывод на дисплей соответствующим модулем } иногда я дополнительно добавляю в модули функции "входа в режим" и "выхода из режима". получается довольно элегантно: текщий режим сам рисует на дисплее свою инфу и обрабатывает нажатые кнопки. если получил кнопку, по которой надо перейти к другому режиму - соответственно возвращает нужный номер режим (иногда я переключаю режимы в основном цикле, тогда возврашаются 2 значения "кнопка обработана" и "кнопка не обработана". если не обработана - то ее обрабатывает основной модуль). спецы, я думаю, сразу увидят в этом некое подобие объектно-ориентированного подхода: модуль как бы класс, в нем метод вывода и метод обрабтки кнопок, иногда конструктор и деструктор :) на С++ естественно это красивее и логичнее, но и на Си неплохо. главное, достаточно просто масштабируется проект: добавление очередного режима сводится к написанию очередного модуля и заполнению соответствующего элемента массива с указателями на функции... P.S. извиняюсь, если написал путано - думал, описать принцип будет просто, а вышло - не очень.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Scanner 0 7 сентября, 2009 Опубликовано 7 сентября, 2009 · Жалоба Тогда продолжайте учиться искать. Тема на этом форуме избитая, не говоря уже о AVR-овском Butterfly Тоже не смог найти темы - помогите ссылками! Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
legotron 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба Тоже не смог найти темы - помогите ссылками! Заранее спасибо. Внесу свои 5 копеек. Я решал задачу построения и обработки меню следующими способами: 1 способ - аля AVR Butterfly Качаете исходники и по 5 раз перечитываете их в отношении меню (я именно так и делал, когда-то давно, сразу понять принцип было тяжело :) ) но у меня был сам батерфлай, поэтому мне было проще. Какие плюсы на мой взгляд: 1. Красивая организация кода 2. Достаточно просто прослеживается логика 3. Всё написано на чистом С 2 способ - жесткий самопал :) Подходит для совсем маленьких меню, ~10-20 пунктов. Просто пишите конструкции switch, if, else Для простых меню, которые не подразумевается расширять - то что надо, писать быстро, код получается читабельным (повторюсь, только для маленьких меню!) 3 способ - мой любимый (да простят меня гуру) - Visual State Machine IAR Visual State Quantum Leaps (сложнее и мощнее) Начну с плюсов на примере IAR VS: Если не брать в расчет сколько времени нужно потратить чтобы ваш конечный автомат заработал нормально, ощущение когда всё правильно работает с Deep-state и Shallow-state логикой - просто поросячий восторг!!! Рисуете графическую UML-диаграмму своего меню (оооо-да всё перед глазами, сразу видно , несомненный плюс) Симулируете свою диаграмму в реальном времени!!! просто жмёте кнопки событий, видите как работают таймеры таймаутов и прочие-прочие сладости.. Отлаживаете свою диаграмму в железе в IAR-e, я так отладил коммуникационный протокол по RS-485 прямо под JTAG. Тоже детский восторг вызывает, скажу честно. Всё что вам нужно - это добавить несколько авто-сгенерированных файлов в свою программу и немного во всё это воткнуться... Также поддерживает C++.. там тоже есть прелести.. Есть очереди, ну и многое другое, копаться можно долго. Минусы я вижу в том что это слишком долго настраивается и изучается, по сравнению со способом 2 день и ночь. Также возможны трудно уловимые баги самой программы, на которые можно наткнуться.. Вообщем сейчас уже этой штукой не пользуюсь для меню, но время потраченное на ее освоение не жаль, если бы мне приходилось очень часто писать конечные автоматы, я бы по сей день бы пользовался, а так многое забывается и приходиться тратить слишком много времени на то, чтобы вспомнить. P.S. Вообщем, мои 5 копеек :) Добавлено: Не подумайте что IAR VS можно использовать только с IAR! просто в ИАРе есть дебаггер для визуал стэйт. А так подходит для любых ANSI C компиляторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба если бы мне приходилось очень часто писать конечные автоматы, я бы по сей день бы пользовался.... Вся эта бодяга с Visual State на самом деле подходит для ОЧЕНЬ простых автоматов проектируемых, что называется тупо в лоб. Если состояний много, воздействий еще больше - поведение становится формально трудно описуемым нужно добавлять элементы размытой логики... Вся эта красота от IAR идет лесом. Проверено на собственной шкуре года четыре назад - простое и так пишется просто а сложное с этой приблудой только сложнее :( 1 способ - аля AVR Butterfly Да, уже поминал в начале топика в качестве примера. Особого пиетета не стоит (ну разве только по отношению к коду генеримому IAR VS :) ), но достаточно добротно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба А я вот пришел к макросам описания состояний и доволен. Переходы между состояниями - ручками внутри соответствующих функций. Единственная проблема - время компиляции после всей "макросизации" состояний, портов, ошибок, событий, клавиш) выросло драматически. Да, вот это хорошо: "просто поросячий восторг!!! .... Вообщем сейчас уже этой штукой не пользуюсь для меню " :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба Делал довольно разветвлённые меню путём организации состояния программы с перебором в основном цикле и функциями перехода. Чтото типа такого: //основной цикл while(1) { switch(state) { case 1: Case1(); break; case 2: Case2(); break; case 3: Case3(); break; } } //процедура перехода (для каждого case своя) void JumpToCase1(void) { state = 1; //вывод на индикатор чего-либо ................................................... //изменение каких-либо параметров ...................................................... } //процедура для case1 void Case1(void) { //любые действия в case1 .................................................................... //условия перехода в другие состояния if(button1 == push) JumpToCase2; elseif(button2 == push) JumpToCase3; } Всем состояниям давал осмысленые названия и в итоге получалась легко читаемая программа менюшки (даже после 2х-3х месяцев) :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
legotron 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба воздействий еще больше - поведение становится формально трудно описуемым нужно добавлять элементы размытой логики... В данном топике речь идёт о меню. Можно пример ваших усложнений касательно построений меню? Я себе мало представляю меню с размытой логикой, но подозреваю, что если такое и можно придумать, вряд ли возможно будет этим пользоваться с точки зрения эргономики. Хорошее меню - простое меню. Тому пример старые модели телефонов Nokia. добавлено: пару нажатий кнопок и ты уже рубаешь в змейку ;) Да, уже поминал в начале топика в качестве примера. Особого пиетета не стоит (ну разве только по отношению к коду генеримому IAR VS :) ), но достаточно добротно. Код генерируемый IAR VS - нечитабелен, ибо там всё завязано на 1 таблице, которую без бубна не расшифруешь :rolleyes: , но всё остальное по-моему вполне вразумительно (в сравнении с другими программами с автогенерацией кода) А я вот пришел к макросам описания состояний и доволен. Переходы между состояниями - ручками внутри соответствующих функций. Единственная проблема - время компиляции после всей "макросизации" состояний, портов, ошибок, событий, клавиш) выросло драматически. К макросам лично у меня сложилось весьма предвзятое отношение, я считаю что они сильно усложняют чтение программ сторонними людьми, а также могут содержать ошибки, которые трудно отыскать. "просто поросячий восторг!!! .... Вообщем сейчас уже этой штукой не пользуюсь для меню " :) Вы очень хорошее резюме сделали, на самом деле очень часто хочется писать "как хочу", а знающие люди говорят - не надо так писать, и только через какое-то время понимаешь, что они были правы и главное - почему. Поэтому я лично часто говорю себе - "не буду так писать (как хочеться).... почему?(сам себе).... не знаю, но всё равно не буду, потом пойму" Делал довольно разветвлённые меню путём организации состояния программы с перебором в основном цикле и функциями перехода. На мой взгляд это хороший способ для простых меню. (то что я подразумевал под вариантом 2) Чуть возрастёт логика и способность чтения экпоненциально усложняется. Нормальный подход для простых меню. А усложнить например можно добавив память в дочерние состояния, а если их еще несколько... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба В данном топике речь идёт о меню..... Шла, до того времени, как Вы завели речь о Конечных Автоматах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться