я для многих проектов с меню приспособился делать так.
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. извиняюсь, если написал путано - думал, описать принцип будет просто, а вышло - не очень....
Я бы взял частями... но мне надо сразу.