Главная » Статьи » Проекты |
Когда любой проект растет в функционале, и из простого
показометра хочется сделать нечто большее, нужно придумать, как организовать
удобную работу с устройством. Хорошо если в проекте задействован дисплей
(графический, алфавитно-цифровой, да хоть семисегментный) тогда можно создать
свое меню и рулить настройками оттуда. Вот
и попробуем организовать несложное древовидное меню из небольшого списка, с
возможностью выбора любого пункта. Для начала необходимо определится с организацией
и количеством пунктов меню и нарисовать структурную схему. Например, сделаем
меню из 4-х пунктов, в каждом из которых по 3 подпункта, такую вот: Для микроконтроллера каждый пункт это всего лишь переменная (А), которая меняется при нажатии кнопок и в зависимости от значения которой, на дисплей выводится информация или выполняется то или иное действие. Кнопок, кстати всего 4: вверх (up), вниз (down), выбор (ok) и выход (esc). Сейчас подробно рассмотрим, что происходит с переменной при нажатии этих кнопок. При старте программы (или при входе в меню), переменной А присваивается значение 10, это соответствует первому пункту меню. При нажатии кнопки «Вниз», к переменной прибавляется 10, и она становится равна 20, это соответствует второму пункту меню. Если еще раз нажать на эту кнопку, переменная станет равна 30, что будет соответствовать третьему пункту меню и так далее. Если нажать кнопку «Вверх» переменная будет уменьшаться на 10, до тех пор, пока не станет равна 10. Таким образом, организована навигация по главному списку меню. Для примера остановимся на первом пункте, и войдем в подменю первого пункта нажав кнопку "Вход". При этом к переменной прибавляется единичка и переменная становится равна 11. Это соответствует первому подпункту первого пункта меню %) Теперь если нажать на кнопку "Вниз" переменная будет увеличиваться на 1, пока не станет равна 13 (всего у нас 3 подпункта меню). Если нажимать на кнопку "Вверх" переменная будет уменьшаться на 1, пока не достигнет значения 11. Вот и организовали навигацию по пунктам подменю. Теперь, находясь в подменю, к примеру на пункте 1.1, если нажать кнопку "Ввод" переменная умножается на 10 и становится равна 110. При таком значении переменной вызывается подпрограмма 1.1, в которой совершаем какие нибудь действия. Выход организован проверкой значения переменной и присвоением переменной определенного значения. Если все вышесказанное кажется бредом не совсем понятно, посмотри на рисунок ниже. Тут я на примере двух пунктов меню показал, как изменяется значение переменной и какие действия с ней происходят когда мы нажимаем на кнопки: Под каждую кнопку задействовано свое внешнее прерывание. Обработка нажатия кнопок у меня выглядит следующим образом: Код обработчиков внешнийх прерываний Ok: 'обработка нажатия кнопки "OK"If A = 11 Or A = 12 Or A = 13 Then A = A * 10 End If If A = 21 Or A = 22 Or A = 23 Then A = A * 10 End If If A = 31 Or A = 32 Or A = 33 Then A = A * 10 End If If A = 41 Or A = 42 Or A = 43 Then A = A * 10 End If If A = 10 Or A = 20 Or A = 30 Or A = 40 Then Incr A End If Return Esc: 'обработка нажатия кнопки "ESC" If A = 11 Or A = 12 Or A = 13 Then A = 10 End If If A = 21 Or A = 22 Or A = 23 Then A = 20 End If If A = 31 Or A = 32 Or A = 33 Then A = 30 End If If A = 41 Or A = 42 Or A = 43 Then A = 40 End If If A > 100 Then A = A / 10 End If Return Down: 'обработка нажатия кнопки "DOWN" If A = 10 Or A = 20 Or A = 30 Then A = A + 10 End If If A = 11 Or A = 12 Then Incr A End If If A = 21 Or A = 22 Then Incr A End If If A = 31 Or A = 32 Then Incr A End If If A = 41 Or A = 42 Then Incr A End If Return Up: 'обработка нажатия кнопки "UP" If A = 20 Or A = 30 Or A = 40 Then A = A - 10 End If If A = 12 Or A = 13 Then Decr A End If If A = 22 Or A = 23 Then Decr A End If If A = 32 Or A = 33 Then Decr A End If If A = 42 Or A = 43 Then Decr A End If Return Такая логика дает во-первых жесткую привязку выполняемых действий при нажатии кнопки, в зависимости от предыдущего значения переменной. Что гарантирует точное выполнение кода. А во-вторых, легко добавить или убрать необходимые пункты и подпункты, подстраивая меню под свой проект. В главном цикле программы, в зависимости от значения переменной, будет происходить отрисовка меню и выполняемых операций. Тут все зависит от фантазии и применяемого дисплея. В своем примере я применил алфавитно-цифровой 4-х строчный дисплей и микроконтроллер Atmega64. Почему такой жирный камень? Просто в нем есть необходимое количество внешних прерываний, и с ним нормально работает протеус. А вообще программа получилась размером чуть больше 4 кб, поэтому можно использовать контроллеры со значительно меньшей флэш памятью. А если сделать принудительный опрос кнопок, то не обязательно будет использовать микроконтроллер с большим числом внешних прерываний. В общем, на вкус и цвет... Схема подключения дисплея и кнопок ниже: Итак, при старте программы, переменная имеет значение 10. Это значение переменной соответствует первому пункту меню, нарисуем напротив этого пункта курсор. Например так: Код отрисовки выделения первого пункта меню у меня такой: Подпрограмма вывода на дисплей выделения курсором первого пункта меню 10: 'подпрограмма отрисовки на дисплее выделения первого пунктаLcd "label 1 <" 'в первой строке нарисовали курсор Lowerline 'пишем на второй строке Lcd "label 2" Thirdline 'пишем на третьей строке Lcd "label 3" Fourthline 'пишем на четвертой строке Lcd "label 4" Return 'возвращаемся в основной цикл программы Теперь жмем на кнопку "Down", переменная увеличивается, и нужно нарисовать движение курсора вниз: остановимся например на третьем пункте, при этом значение переменной будет А=30:
Подпрограмма вывода на дисплей выделения курсором третьего пункта меню 30: 'подпрограмма при А=30Lcd "label 1" Lowerline Lcd "label 2" Thirdline Lcd "label 3 <" 'курсор напротив третьего пункта Fourthline Lcd "label 4" Return 'возвращаемся в основной цикл программы Вот что будет на дисплее: При нажатии на кнопку "OK" переменная станет равна 31. На дисплее отобразится вход в подменю. В шапке отобразим родителя (пункт откуда пришли):
Подпрограмма вывода на дисплей выделения курсором третьего пункта меню 31: 'подпрограмма при А=31Lcd " label 3" Lowerline Lcd "label 3.1 <" Thirdline Lcd "label 3.2" Fourthline Lcd "label 3.3" Return 'возвращаемся в основной цикл программы При повторном нажатии кнопки "OK" переменная станет равна 310, и произойдет выполнение подпрограммы, какой угодно, например просто выведем надпись "Run program 3.1" на дисплей:
310: 'подпрограмма при А=310 Lcd "RUN PROGRAM 3.1" 'выводим надпись Return 'возвращаемся в основной цикл программы При нажатии на кнопку "ESC" переменная изменится и произойдет выход из этой подпрограммы. Ну а дальше принцип думаю ясен. Как видишь, организовать свое меню, не такая уж непосильная задача как может показаться. Удачи! Ниже можно скачать архив с моделью в Proteus, исходник и откомпилированный файл: UPD: если нет протеуса, то для просмотра работы меню сгодится симулятор самого bascom-avr, как его заюзать писалось ранее | |
Просмотров: 67749 | Комментарии: 35
| Теги: |
Всего комментариев: 33 | 1 2 » | ||||||||||||||||||||||||
| |||||||||||||||||||||||||
1-30 31-33 | |||||||||||||||||||||||||
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |