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

Просмотров: 11897Комментарии: 0
Электроника. СхемотехникаМикроконтроллеры AVR

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


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

    Оставьте комментарий!

    grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

    Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

    Вы можете войти под своим логином или зарегистрироваться на сайте.

    (обязательно)