CodeVisionAVR. Подключение графического индикатора WG12864B-YGH-VN к микроконтроллеру ATMEGA8535. часть 2 - Cтатьи - Статьи - Микроконтроллеры AVR и программирование
Приветствую Вас, Гость! Регистрация RSS

Четверг, 30.03.2017
Главная » Статьи » Cтатьи

CodeVisionAVR. Подключение графического индикатора WG12864B-YGH-VN к микроконтроллеру ATMEGA8535. часть 2
Введение

В первой части статьи было рассмотрена работа контроллера NT7108, описаны команды управления. Теперь приступим к довольно большой теме второй части работы с графическим дисплеем - программного драйвера управления дисплеем...

Программная часть

Весь код программы разбит по функциям: инициализация, очистка экрана, запись\чтение команд\данных, чтение регистра состояния LCD, и т.д.

Последовательность действий при выводе информации на дисплей:
• Инициализация
• Запись команды (установка регистра Х и счетчика Y адресов)
• Запись данных в память RAM

Перед тем как писать функции, нужно определить в программе, какие порты и выводы микроконтроллера используются для управления дисплеем. По принципиальной схеме это PORTC и PORTD. Применяем директиву препроцессора #definе, что-бы программу сделать более читабельной:



Теперь определим какие биты порта C (port_command) являются управляющими. Я использовал штатные названия выводов дисплея:



Для установки и сброса битов применяются побитовые операции ИЛИ\И. Следующий рисунок показывает как они работают (все очень просто):

 



Можно управлять битами порта и по другому, без использования побитовых операций:



С портами разобрались, определили какие биты управляющие, теперь можно написать функцию по записи команды или данных в контроллер LCD.

Функция записи команды или данных

Фукция записи данных или комманд:



mode – режим записи.
• command – команды (0).
• data        – данные  (1).

Имена определены по enum:



data        – данные,  засылаемые в контроллер LCD.
command – команды, засылаемые в контроллер LCD.

cs – выбор контроллера LCD:
• cs1    – первый контроллер (управляет левой половиной экрана).
• cs2    – второй контроллер.
• cstwo – доступны оба контроллера.

Имена cs1, cs2, cstwo определены по enum:



Полный код функции:



Эта функция используется для установки значений регистра Х адреса, счетчика Y адреса и Z регистра стартовой линии отображения и записи данных в память RAM.

Флаг занятости

Самая необходимая вещь при выводе информации на экран, это чтение флага занятости. Можно, конечно сделать задержку, но в таком случае потеряется быстродействие т.к. задержка будет продолжительной для верной записи данных в контроллер LCD. С флагом занятости все просто: в цикле проверяем (соответственно выполняется функция) регистр состояния контроллера LCD и флаг busy – если флаг 0, то засылаем следующие данные, в противоположном случае повторяем цикл по чтению регистра статуса.

Функция чтения флага занятости:



crystal – выбор соответствующего контроллера LCD.

За одну единицу времени можно прочитать регистр состояния только одного контроллера. Если попытаться производить чтение одновременно двух контроллеров, то может возникнуть конфликт на линии данных.

Полный код функции:



Функция принимает аргумент (выбор контроллера) и возвращает 8-битный результат состояния флага занятости контроллера LCD. Есть один момент касаемый переменной status: данная переменная возвращает только два возможных состояния - 1 и 0, поэтому при использовании этой функции в среде CodeVisionAVR, то целесообразно использовать тип данных bit, т.к. он принимает только два логических состояния (те самые 1и 0). Вот, собственно у нас в распоряжении есть две важных функции, посредством которых будем выводить информацию на экран дисплея.

Инициализация дисплея

Инициализация сводиться к установке в нуль Z регистра стартовой линии отображения памяти RAM и разрешения отображения экрана (памяти RAM). Устанавливать в нуль регистр Х адреса и счетчик Y адреса на этапе инициализации не обязательно.

Функция инициализации дисплея:



Конфигурация портов определены по #define:



Важный этап при инициализации дисплея, это его сброс:



По документации на контроллер LCD NT7108 после подачи питания на дисплей, нужно выдержать нулевой уровень на линии RESET согласно таблицы:
 
Описание Символ Минимальная Номинальная Максимальная Ед. измерения
Reset time tRS 1.0 - - мкс
Rise time tR - - 200 нс





Я сделал задержку в 10мкс. Честно я не экспериментировал с задержкой по сбросу дисплея, но если есть желание, то можете «поковыряться» и выяснить, как она влияет. Если сброс дисплея вообще не использовать, то он ничего не покажет (причину не выяснял). Ну и далее наша, выше описанная функция write_data_display.

Первая программа

Напишем первую программу по выводу байта на экран. Весь код оформлять не буду (место экономлю:)), только небольшую часть:


 



В основной программе указали функцию инициализации дисплея - display_init();

Функцию очистки всего экрана - display_clear(cstwo);


Разберем функцию по очистке экрана дисплея:



cs – выбор контроллера LCD.

Вы наверно спросите – "а зачем в функции очистки экрана нужно указывать контроллер LCD?". В принципе, совершенно нету в этом необходимости и эту функцию можно записать так:



Я это сделал для того, что экспериментировал с «менюшками», которые отображались, не зависимо друг от друга (не зависимая очистка полуэкранов); например первый полуэкран отображает напряжение в контрольных точках схемы, а другой полуэкран температуру или ток(вариантов отображения на полуэкранах много). Поэтому так и оставил функцию с выбором контроллера. На свое усмотрение можно легко убрать данный аргумент в скобках функции.

Смысл очистки экрана заключается в принудительной установки (мы знаем, что счетчик увеличивает свое значение автоматически) счетчика Х адреса от 0 до 63 и выбора страниц памяти RAM посредством установки регистра Y адреса от 0 до 7. После каждой установки регистров, записываем в 8-битные ячейки памяти RAM нули (это все происходит в цикле for). Код был взят из статьи на сайте www.radiokot.ru Использование графического LCD WG12864A, т.к. эффективнее кода не придумать.

Полный код функции:



Функция, которая определяет, откуда будет выводиться первый байт:



x  – установка счетчика Y адреса отображения памяти RAM. Координата х.
Y  – установка регистра х адреса страниц памяти RAM. Координата y.
cs – выбор контроллера LCD.

Полный код функции:



Используем уже знакомую нам функцию write_data_display. В первой части статьи CodeVisionAVR. Подключение графического дисплея WG12864B-YGH-VN к микроконтроллеру AVR. часть 1, я описывал команды управления контроллером NT7108. Согласно таблицы, для установки счетчика Y адреса, нужно на шине данных (соответственно в режиме записи команд) установить значение 0x40 + число, с которого будет отображаться память RAM и установки регистра Х адреса со значением 0хb8 + число, определяющее страницу отображения памяти RAM: 0xb8+y, 0x40+х. Раз счетчик Y адреса автоматически увеличивает свое значение на 1 с каждой записью данных, то достаточно его первоначально установить.

Теперь основная функция, с помощью которой и будем записывать байт в память RAM:



byte – 1байт данных.
cs    – выбор контроллера LCD.

Полный код функции:



Используем функцию write_data_display в режиме записи данных.

Файлы

library_wg12864_cvavr.rar

Продолжение следует...

 

Категория: Cтатьи | Добавил: Автор (10.05.2010)
Просмотров: 12142 | Комментарии: 9 | Теги: директива #define, первая программа, WG12864, флаг занятости, побитовые операции, Инициализация дисплея, чтение флага занятости, инициализация портов | Рейтинг: 4.0/3
Всего комментариев: 9
1  
Здравствуйте!
В общем все не плохо,но когда появляются прерывания в проекте,то индикатор выдает белеберду.с чем это может быть связано связано?
Я ,правда,смотрю это все, в Протеусе.

2  
А вы в железе посмотрите, может там такой "билеберды" не будет!
Я вообще с протеусом не работал, когда писал программу на WG-дисплей и всё делал в железе...

3  
Здравствуйте. Небольшую опечатку в статье нашел: в функции очистки экрана вместо display_xy( x,y,cs ) вы напечатали clear_xy( x,y,cs ). Дабы проникнуться всем духом следовал по статье шаг за шагом, и дойдя до функции очистки был сильно озадачен, но сообразил что к чему.

4  
Спасибо Александр, уже исправил smile

5  
уважаемый skiff если вас незатруднит пожалуйста скиньте на почту полный исходник первой програмы по выводу информацыии на GLCD ато чтото немогу доконца разобратсо с выводом информацыии.
e-mail:vergilii@i.ua

6  
Добрый день! Не могу понять откуда взялся файл #include <lcd_wg.h> у меня в CVAVR такого файла нет в библиотеках где его взять?

7  
А он разве нужен? Переделал проект под свой контроллер и свои порты, вроде разобрался во всем, проект компилится и без этого файла. Приеду с работы протестю на железе wink

8  
Вот кстати нашел эти файлы, автор вынес все подпрограммы в отдельную библиотеку, нажми на дискетку в конце статьи и будет тебе счастье! Статья написана на 5!

9  
Архив смотрите повнимательнее!!! Там все есть

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]