Свежие обсуждения
Микроконтроллеры

Начинающим об управлении графическими индикаторами?

1 3

Штука хорошая и в хозяйстве полезная. Думаю, что многие радиолюбители применяют такие штуки.
Давайте поговорим о минимальном наборе функций, которые надо написать для удобной работы с граф. LCD.
Интересует вывод и векторной графики, и динамические картинки, типа светящегося столба, изменяющего свою высоту, в зависимости от уровня сигнала, и т. д.
Хочется поставить акцент именно на словесное описание алгоритмов, а не на их программную реализацию. Иначе мы тут заковыряемся.
Материалов подобного свойства в сети немного. Есть какие-то готовые решения, но словесного описания и обсуждения нигде не встречал.

Прошу присоединиться тех, кого интересует эта тема. Поделимся идеями и наработками.

 

Я обычно стараюсь вписаться вот в такую модель:

- в ОЗУ микроконтроллера отвести память под образ экрана (например, для черно-белой графики 128х128 это будет 2 КБайта).
- всю работу по рисованию делать в ОЗУ.
- после того, как очередной кусок отрисован, просто выгружаем образ ОЗУ в LCD.

Расход памяти, конечно, недетский, но зато очень упрощается работа. И наплевать, как там LCD выводит - по строкам, по столбцам, иди вообще сикось-накось

"Джентльменский набор" операций, надерганный из программы:

- void clearScreen(void) - очистка экрана.
- void putImage_P(unsigned char x, unsigned char y,PGM_P ref,bool transparent) - вывод битовой картинки в указанное место экрана.
- void inverseScreen(unsigned char x, unsigned char y,unsigned char width,unsigned char height) - инверсия области экрана (например, текущая строка меню, курсор и т.д.)
- void drawText(unsigned char x, unsigned char y,char *text,bool transparent) - вывод текста в указанную область экрана.
- void drawRect(unsigned char x, unsigned char y,unsigned char width,unsigned char height) - отрисовка рамки

Для того, чтобы нарисовать вот такую картинку со всякими анимациями (см файл), достаточно ATMega16

 

А вот интересно, почему же память самого LCD использовать сложнее. Я делал так.
Получается, что даже при прорисовке одной точки надо обновлять весь экран. Разумно ли это?
Я эту тему затеял, потму что хочется какой-то пусть простенький, но дизайнчик сделать. Не просто тупо текст и тупо картинки, а какие-то рамочки, мигающие кнопочки, движущиеся элементы и т. д.

 

Когда я был на семинаре MicroCHIP, то там упоминалось про специальную графическую библиотеку на Си, с которой "работа с графическим дисплеем становится очень простая". Также там упоминалось об альтернативной очень известной библиотеке (вроди написаной каким-то студентом), которая потребляет заметно меньше памяти (программ и ОЗУ; докладчики ее хвалили). К сожаленью названия я не запомнил, но понял, что такие библиотеки очень популярные. Возможно следует начать поиски с их сайта.
Сам я пока не дорос до графики, но уже желание проявляется

 

chav1961 вот вы пишете, что лучше работать через буферное ОЗУ самого МК. С чем все-таки это связано? С тем, что адресация проще? Просто заводим большой массив, размером с экран и с ним работаем? С тем, что не надо после ввода каждой паршивой точки делать задержки, бесконечно опрашивать флаг "занято"? Или с чем-то еще?
Я вот так, например не делал. Писал функции записи и считывания в ОЗУ самого ЛСД. Меня тоже раздражало большое количество всяких служебных процедур. Чисто умозрительно вроде кажется, что ваше предложение резонно. Надо попробовать?

Сергей К, я сколько не рыскал по интернету, так и не нашел хороших вменяемых библиотек. Писал сам. Дело тут не в сложности кода. Код-то простой. Просто подчас не знаешь, как чего оптимальнее делать.
Схватился было за mikro C PRO for AVR 2008. Там все нужные функции для работы с ЛСД есть. Но когда попытался их оттуда выудить, выяснилось, что это невозможно, по крайней мере мне так показалось.
Если где увидите, свистните мне. Без разницы, для пиков или для аврок. Главное, чтобы на С были написаны.

 

Работа с ОЗУ проще по многим причинам:

1. Легко делаются сложные операции с экраном (например, инверсия экрана - команда XOR, прорисовка по маске - команды AND с инверсией маски и OR с изображением и т.д.). Попробуйте, ради интереса, представить, как нарисовать на экране LCD окружность, не пользуясь буфером - поседеете . И это притом, что практически у каждого LCD это способ отрисовки будет свой.

2. Более высокая скорость (например, пересылка байта в ОЗУ - три команды, в то же время пересылка байта в памяти LCD - две операции обмена, и в каждой,как минимум, пяток команд - стробы всякие, чтение/запись данных из порта, задержки). Бывает вариант, когда LCD в этой ситуации работает быстрее - если его контроллер "умеет" самостоятельно выполнять всякие групповые операции асинхронно, но такой "умный" контроллер стоит далеко не в каждом LCD, с ним надо еще освоиться, а при переходе на другой тип LCD все ранее освоенное окажется невостребованным. Есть, между прочим LCD, в которых контроллера просто нет - там буферное ОЗУ вообще без вариантов

3. Простота программы и малая зависимость от типа LCD (для того, чтобы "выкинуть" образ в LCD, нужно уметь делать всего одну операцию записи байтов в память LCD). Как следствие, собственно "рисовальная" часть от типа ЖКИ почти не зависит (разве что в плане цвета и размера). В качестве примера - на той картинке, что в предыдущем посте, использован WG12232, в котором байт отображается в столбец, а в программе я с образом работаю построчно. Наступит время, переедете с одного типа LCD на другой (с другим контроллером) - не нужно полностью переучиваться.

Недостаток метода - очень большой расход ОЗУ и большие затраты на обработку со стороны микроконтроллера, если в LCD стоит "умный" контроллер, и его возможности не используются. Если можете такую цену заплатить - думаю, стоит платить, если нет - стоит осваивать именно данный LCD с данным контроллером, либо искать (пользоваться) готовую библиотеку. Я буферным ОЗУ даже для семисегментных индикаторов пользуюсь. Разумеется, все сказанное - IMHO

 

Уговорили, буду пробовать, как вы советуете. Вот только с делами разгребусь...

 

Zandy: Если где увидите, свистните мне. Без разницы, для пиков или для аврок.
у CCS много всяких библиотек и драйверов. Не разбирался толком ещё - только сегодня начал на него с HT переезжать.

 

Zandy: Если где увидите, свистните мне
свищу
"Для удобства пользователей компания Microchip разработала бесплатную графическую библиотеку, значительно упрощающую взаимодействие с данными индикаторами" - http://www.microchip.com/qvga/
только-что по почте пришло от одного из поставщиков компонентов (рекламировали поступившие на склад графические индикаторы с сенсорной панелью). Сам не пробовал

 

Спасибочки за ссылку. Посмотрю обязательно.
А не пробовал ли кто OLEDы. Говорят, перспективная штука. Я нашел в продаже только очень малых размеров (около дюйма в диагонали) - типа, для мобильников.