Графический экран WG12864B (и ему подобные на ks0107/ks0108)

Графический экран WG12864B (и ему подобные на ks0107/ks0108)

Когда-то товарищ burjui рассказал нам как работать с знакосинтезирующим lcd экраном, а также обучил его русской речи и даже основам графики – нарисовал несколько значков. Вот только примитивные значки это максимум, что можно получить от символьных дисплеев — и то с некоторым трудом, без проблем только буковки-циферки, строчные-заглавные. А хочется картинок. Размеров, шрифтов разных, курсивов, там, менюшек модных. Для этого придумали графические дисплеи. Они, как и символьные, формируют изображение зажигая/гася точки-пиксели. Кстати, как-то мы обошли вниманием в прошлый раз тот факт, что работать с точечками напрямую было бы очень уныло — никаких выводов не напасёшься (80х16 точек у символьного и 128х64 у графического). Но добрые китайские духи электроники позаботились о нас и снабдили эти девайсы собственными контроллерами. Для символьных экранов стандартный контроллер HD44780 (ks0066) а для графических — ks0107 (ks0108). В случае WG12864B их там целых два — на на правую и левую часть экрана. Это потому что ks0108 может обеспечить вывод только на 64х64точки, вот и получился двухядерный дисплей=)

Общаться с контроллерами дисплея предстоит по:

DB0-DB7 — шине данных R/W — указывая, передаём — 0 (или читаем — 1) D/I — данные — 1 (или команду — 0) CS1, CS2 — какому контроллеру E – и проталкивая каждое действие синхроимпульсом Также есть: RST — сброс(резет) Vdd — питание 5В GND — земля Vo — контраст Vee — источник отрицательного напряжения для контраста(если экран инверсный) A — анод и K — катод светодиода подсветки

Поиграемся с WG12864B-TML, вот его распиновка:

Итого минимум 13 линий дуины предстоит принести в жертву красоте индикации=\ Подключается дисплей довольно просто (если, конечно, не считать количества проводков=) Как и в случае с символьным экраном кроме линий связи с мк понадобятся потенциометр регулировки контраста (обратите внимание на оригинальное подключение) и токоограничительный резистор для подсветки. Хотя некоторые его не ставят. Напрасно, кстати — падение на светодиодах подсветки, как гласит датащит, не более 4.6 вольт, и впихивая туда все 5, рискуем их пожечь безвозвратно.

В ИДЕ-шку не включена библиотека для работы с графическими дисплеями, а на плейграунде лежит старая версия, поэтому берём отсюда, или у нас. Подключаем согласно описанию (GLCD_Documentation.pdf лежит в папке glcd\doc, можно взять здесь или почитать перевод), наш дисплей — “Panel A”(в доке ошибка, см далее, юзайте эту схему, она правильная) Удивляясь столь извращённому методу разбрасывания проводов по дуине, читаем чуть внимательней и узнаём, что совсем не обязательно именно так плести этот клубок

можно поменять расположение линий поправив glcd\config\ks0108_Arduino.h. То есть можем расположить эти 13 выводов в произвольном порядке, оставляя свободными именно те пины (…все 7, ни в чём себе не отказывайте, ага=), которые понадобятся нам для подключения всего остального. Но мы так делать не будем, а просто побыстрей закинем в arduino-xxx\hardware\libraries папку glcd из скачанного архива. Запустим ИДЕ-шку и выбрав File->Exampes->glcd>ks0108example, трясущимися руками зальём всё это дело в плату. Залилось, включилось, крутим контраст…и что-то фигово видно=\

Меряем питание и узнаём что наш экран ужасно прожорлив=) Просело аж до 4.2 В. Подключаем внешнее питание.

Чтозаужоснах! Экран перепутался пополам=\ Тут самое время вспомнить, что у нас именно два контроллера и запись в них осуществляется по очереди, посредством выбора одного из них еденичкой на линии CS1 или CS2. Они-то у нас и перепутались… как-то, а точнее положение их не соответствует, предложенной автором распиновке=\ Меняем местами.

Так гораздо лучше=) Симпатично, можно позаливать ещё примеры. Там есть «игра» жизнь, с ужасной скоростью прокручиваемые шрифты и бегущие таймеры, всем своим видом показывающие не высокую скорость обновления данного дисплея=) Часы мне так и не удалось скомпилировать — ИДЕ-шка непрерывно ругается на отсутствие библиотек (а при их добавлении сыплет другими ошибками). Особого внимания стоит игра Rocket, добавив потенциометр и бузер можно немного по ностальгировать=)

Но пора уже слепить что-нибудь своё, пусть и не столь впечатляющее. Для этого придётся почитать объёмистое описание этой убербиблиотеки. А для более полного краштеста сделаем свой рисунок и свой шрифт=)

Шрифты генерятся утилиткой GLCDFontCreator2, качать здесь, или у нас. Запускается жмаканьем на start.bat, вот такой френдли интерфейс.

Кнопки Open Font/Save Font — это для внутреннего, понятного только для GLCDFontCreator2, формата шрифтов(рабочие файлы), открывать сами шрифты прога не умеет — ни сконвертированные ею самою в .h ни .ttf=( Так что жмём NewFont, и уже там импортируем какой-нибудь шрифт из уже установленных у вас в системе.

Стоит сразу как-нибудь осмысленно обозвать своё творение, т.к. именно под этим именем (newFont у меня=) он, впоследствии, будет доступен нашему скетчу. Можно что-нибудь подрисовать.

Давим кнопку Export, указывая желаемое имя файла и расположение (да и не забудьте к имени файла дописать «.h», программа не считает, что это нужно=) Всё это круто, за исключением одной мелочи — русских букв программа не знает=( Если указать диапазон символов помимо стандартного (Start Index и Char Count), то на месте родной кириллицы открытого шрифта видны только пустые шедевры Малевича. Можно попробовать вместо них намалевать чего-нибудь, но мне жутко лень=) К тому же товарищ SkyFort уже провёл соответствующие исследования и работы. Правда он пошёл несколько иным путём — не через GLCDFontCreator2 а используя KS0108v 4.0 For PIC (если с narod.ru что-то случится то файл можно взять у нас). В результате у него получился шрифт SystemRus5x7.h его то я и использую=)

Так, накреативили шрифты, теперь займёмся картинками.

Для этого нам прям в архив с библиотекой засунули папку bitmaps, которая хорошо видна в виде тестового скетча из примеров glcd в Arduino IDE, но почему-то не компилится=))) А всё дело в том, что там лежит скетч для Processig-а, и даже готовый к запуску файлик glcd/bitmaps/utils/java/glcdMakeBitmap.jar Программа ещё более юзерфрендли и поддерживает втаскивание в своё окно картинок в нескольких форматах.

Правда на этом её дружелюбность заканчивается — пихать туда надо уже чёрно-белую картинку нужного размера, приведения размеров и цветов программа не производит. Если картинка смогла прожеваться то в окошке нам об этом сообщат, и даже покажут что получилось, а в папке glcd/bitmaps появится файл «имя_втащеного_файла.h»

Теперь нарисуем простенький скетч для проверки всего этого безобразия в действии.

Шрифты и картинки в скетч включаются также как и библиотеки, и жрут немало места(особенно крупные шрифты)Например этот скетч влезет только(как минимум) в плату на базе Atmega328 . Скетч, шрифты и картинки одним архивом.

Видео того, что получилось:

Осталось разобраться с менюшками и прикрутить экран к сдвиговым регистрам для экономии ног. Но это уже совсем другая история=)

Подробности про всю сигнально — битовую светотень творящуюся на линии связи МК и экрана почитать можно у ДиХальта, как обычно, всё разжёвано подробно и толково. Перевод описания библиотеки GLCD. Также, пока я собирался выложить эти статьи товарищ SinauRus перевёл мануал а SkyFort заставил wg1286 говорить по-русски=)

📎📎📎📎📎📎📎📎📎📎