Цитата(SZ0 @ Mar 12 2009, 02:02)

Наверное нужно запоминать номер меню/блока который обрабатывается в режиме программирования, и при каждом последовательном проходе заходить в него и выполнять соответствующие действия пользователся?
Т.е. проблема все-таки лишь с организацией меню? Это не так сложно как кажется. Допустим нам нужно простейшее трехуровневое меню при четырехкнопочной клавиатуре (кнопки: вверх, вниз, ввод, отмена).
1-й уровень. Основной. Сюда пользователь попадает сразу после включения прибора. Ему соответствует индекс меню - 0.
2-й уровень. Выбор номера редактируемого параметра. Ему соответствует индекс меню - 1.
3-й уровень. Редактирование значение выбранного параметра. Ему соответствует индекс меню - 2.
Вызывается функция меню. По текущему индексу переходим к соответствующей ветке.
а) Вначале индекс 0 - вызываем 1-й уровень, где, например, отображаем состояния выходов и ждем нажатия кнопок. Т.е. при вызове по индексу 0 (в Си это можно оператором switch оформить) вызываем функцию отображения переменной и проверяем наличие в буфере клавиатуры скан-кодов. Если скан-код имеется, то извлекаем его из буфера, меняем индекс меню - 1 и выходим из функции меню. Проверка делается всего один раз.
б) В следующий раз при вызове функции меню по индексу 1 попадаем уже во второй уровень. Где отображаем число номера параметра и м.б. сопровождающую надпись (типа "параметр N"). Проверяем наличие в буфере клавиатуры скан-кода клавиши. Если есть скан-код, то извлекаем его из буфера и проверяем на совпадение с кодами клавиш. Если "вниз", то уменьшаем (проверяя на выход за границу допустимых значений, т.е. если уже равно нулю, то НЕ уменьшаем) значение переменной номера параметра. Если "вверх", то увеличиваем (если равно максимальному номеру, то НЕ увеличиваем) величину переменной номера параметра. Если "ввод", то увеличиваем индекс меню на число 2. Если "отмена", то уменьшаем индекс меню на число 1. Проверка делается всего один раз и после этого выходим из функции меню.
в) В следующий заход попадаем опять по индексу меню. Если в предыдущий раз клавиши не нажимались, то индекс не менялся и все то же самое, что в п.б. Если индекс изменился и стал 0, то происходит все то же, что в п.а. Если же попали в третий уровень, то отображаем
локальную копию значения параметра, номер которого был выбран на предыдущем вызове функции меню. И опять проверяем буфер клавиатуры. Если имеются скан-коды "вверх" или "вниз", то соответственно увеличиваем или уменьшаем на заданный шаг (совсем не обязательно именно на 1 изменять)
локальной копии значения параметра. Если код "ввод", то сохраняем значение локальной копии параметра (той, что редактировали) в переменную из которой копировали это значение, уменьшаем индекс меню на 1. Если же код клавиши "отмена", то НЕ сохраняя значения, уменьшаем индекс меню на 1. Выходим из функции меню.
В общих чертах как-то так. Основная суть в том, что НЕ нужно постоянно находится в функции меню. Вошли в нее, перешли по индексу на соответствующий уровень, если нужно, то отобразили что-то, проверили нажатие клавиши, если в буфере был код клавиши, то выполнили требуемое действие и вышли из функции меню. Все!