Samou4ka » 🎟 Микроконтроллеры AVR » Выделение пунктов меню в микроконтроллерах AVR

Выделение пунктов меню в микроконтроллерах AVR

Для полного понимания всего написанного ниже желательно хотя бы вкратце просмотреть статьи:

Организация простого меню для МК

Чтение и запись EEPROM в WinAVR

Просто листать меню это конечно хорошо, но в конечном итоге оно служит для настроек чего либо и нам нужно видеть какой пункт в подменю в данный момент включен. Для реализации нам понадобится какая-то переменная в EEPROM. Я ее называю MDCR (Main Display Control Register) — регистр управления отображением, хотя название не важно. Итак, давайте по пунктам, что нужно сделать чтобы отметить пункт меню:

  1. Объявляем по одной переменной одного типа в EEPROM и в RAM (ОЗУ) — ee_MDCR и MDCR.
  2. В секторе инициализации (где-нибудь в начале функции main) читаем значение переменной из EEPROM в переменную в RAM — MDCR=eeprom_read_byte(&ee_MDCR).
  3. Теперь при выборе какого нибудь пункта меню мы изменяем значение MDCR и записываем его в EEPROM по адресу eeMDCR — eeprom_write_byte(&ee_MDCR, MDCR);
  4. Анализируем MDCR и ставим соответствующую метку (выбран или нет);

Как это выглядит на бумаге разобрались и написали краткую блок схему. Теперь рассмотрим фрагменты кода с реализацией (см. Организация простого меню для МК).

case 21: {
LCDstring(str[7],8);
if((MDCR&0b00001000)==0b00001000//если бит установлен выводим Y
                {
                                LCDsendChar(‘ ‘);
                                LCDsendChar(‘Y’);
                }
else //если сброшен выводим N
{
                                LCDsendChar(‘ ‘);
                                LCDsendChar(‘N’);
                }
 break;
                 }
case 210:{
if((MDCR&0b00001000)==0b00000000)//если сброшен устанавливаем
                                MDCR|=0b00001000;
                else
                {
                     if((MDCR&0b00001000)==0b00001000)//если установлен сбрасываем
                                {
                                        MDCR&=0b11110111;
                                }
                 }
eeprom_write_byte(&ee_MDCR, MDCR);//сохраняем изменненое значение
count/=10;//выходим в предыдущее подменю
break;
               }//дальше ничего нет, возврат в предыдущее подменю     

Здесь этому пункту меню соответствует 3-й бит нашего регистра, хотя можно было определить любой бит для этих целей. Подменю с порядковым номером 21 просто проверяет установлен соответствующий бит или нет и в зависимости от результата помечает его. Для отметки меню здесь использованы символы Y (Yes) и N (No), хотя можно было нарисовать в память LCD свой символ (например, какую-нибудь птичку) и выводить его, если меню помечено. При нажатии на пункт с номером 21 мы попадаем в подменю с номером 210 (как это происходит описано в статье об организации меню), а там и происходит смена соответствующего бита на противоположный. Главное не забывать при изменении бита записывать его в EEPROM, а иначе при следующем включении настройки этого пункта меню собьются.

Как пример, если мы хотим отображать температуру в градусах Цельсия или по Фаренгейту в функции отображения данных мы смотрим какой бит установлен и в соответствии с ним выводим температуру в нужном виде.

Проект в Proteus и исходник в WinAVR (выделяются пункты меню = menu 1_1_1 и menu 2_2)

Как вам статья? Ваша реакция:
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
Расскажите друзьям:
Оцените статью:
Оставить комментарий