Для полного понимания всего написанного ниже желательно хотя бы вкратце просмотреть статьи:
Организация простого меню для МК
Чтение и запись EEPROM в WinAVR
Просто листать меню это конечно хорошо, но в конечном итоге оно служит для настроек чего либо и нам нужно видеть какой пункт в подменю в данный момент включен. Для реализации нам понадобится какая-то переменная в EEPROM. Я ее называю MDCR (Main Display Control Register) — регистр управления отображением, хотя название не важно. Итак, давайте по пунктам, что нужно сделать чтобы отметить пункт меню:
- Объявляем по одной переменной одного типа в EEPROM и в RAM (ОЗУ) — ee_MDCR и MDCR.
- В секторе инициализации (где-нибудь в начале функции main) читаем значение переменной из EEPROM в переменную в RAM — MDCR=eeprom_read_byte(&ee_MDCR).
- Теперь при выборе какого нибудь пункта меню мы изменяем значение MDCR и записываем его в EEPROM по адресу eeMDCR — eeprom_write_byte(&ee_MDCR, MDCR);
- Анализируем MDCR и ставим соответствующую метку (выбран или нет);
Как это выглядит на бумаге разобрались и написали краткую блок схему. Теперь рассмотрим фрагменты кода с реализацией (см. Организация простого меню для МК).
Здесь этому пункту меню соответствует 3-й бит нашего регистра, хотя можно было определить любой бит для этих целей. Подменю с порядковым номером 21 просто проверяет установлен соответствующий бит или нет и в зависимости от результата помечает его. Для отметки меню здесь использованы символы Y (Yes) и N (No), хотя можно было нарисовать в память LCD свой символ (например, какую-нибудь птичку) и выводить его, если меню помечено. При нажатии на пункт с номером 21 мы попадаем в подменю с номером 210 (как это происходит описано в статье об организации меню), а там и происходит смена соответствующего бита на противоположный. Главное не забывать при изменении бита записывать его в EEPROM, а иначе при следующем включении настройки этого пункта меню собьются.
Как пример, если мы хотим отображать температуру в градусах Цельсия или по Фаренгейту в функции отображения данных мы смотрим какой бит установлен и в соответствии с ним выводим температуру в нужном виде.
Проект в Proteus и исходник в WinAVR (выделяются пункты меню = menu 1_1_1 и menu 2_2)