Графический экран WG12864B (и ему подобные на ks0107/ks0108)
Когда-то товарищ рассказал нам как с знакосинтезирующим 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 — катод светодиода подсветки
Поиграемся с , вот его распиновка:
Итого минимум 13 линий дуины предстоит принести в жертву красоте индикации= Подключается дисплей довольно просто (если, конечно, не считать количества проводков=) Как и в случае с символьным экраном кроме линий связи с мк понадобятся потенциометр регулировки контраста (обратите внимание на оригинальное подключение) и токоограничительный резистор для подсветки. Хотя некоторые его не ставят.
Напрасно, кстати — падение на светодиодах подсветки, как гласит , не более 4.6 вольт, и впихивая туда все 5, рискуем их пожечь безвозвратно.
В ИДЕ-шку не включена библиотека для работы с графическими дисплеями, а на плейграунде лежит старая версия, поэтому берём , или у .
Подключаем согласно описанию (GLCD_Documentation.pdf лежит в папке glcddoc, можно взять или почитать ), наш дисплей — “Panel A”(в доке ошибка, см далее, юзайте эту схему, она правильная)
Удивляясь столь извращённому методу разбрасывания проводов по дуине, читаем чуть внимательней и узнаём, что совсем не обязательно именно так плести этот клубокможно поменять расположение линий поправив glcdconfigks0108_Arduino.h. То есть можем расположить эти 13 выводов в произвольном порядке, оставляя свободными именно те пины (… все 7, ни в чём себе не отказывайте, ага=), которые понадобятся нам для подключения всего остального.
Но мы так делать не будем, а просто побыстрей закинем в arduino-xxxhardwarelibraries папку 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), то на месте родной кириллицы открытого шрифта видны только пустые шедевры Малевича. Можно попробовать вместо них намалевать чего-нибудь, но мне жутко лень=)
К тому же товарищ уже соответствующие исследования и работы. Правда он пошёл несколько иным путём — не через GLCDFontCreator2 а используя (если с narod.ru что-то случится то файл можно взять у ).
В результате у него получился шрифт его то я и использую=) Так, накреативили шрифты, теперь займёмся картинками. Для этого нам прям в архив с библиотекой засунули папку bitmaps, которая хорошо видна в виде тестового скетча из примеров glcd в Arduino IDE, но почему-то не компилится=)))
А всё дело в том, что там лежит скетч для Processig-а, и даже готовый к запуску файлик glcd/bitmaps/utils/java/glcdMakeBitmap.jar
Программа ещё более юзерфрендли и поддерживает втаскивание в своё окно картинок в нескольких форматах.Правда на этом её дружелюбность заканчивается — пихать туда надо уже чёрно-белую картинку нужного размера, приведения размеров и цветов программа не производит.
Если картинка смогла прожеваться то в окошке нам об этом сообщат, и даже покажут что получилось, а в папке glcd/bitmaps появится файл «имя_втащеного_файла.h» Теперь нарисуем простенький скетч для проверки всего этого безобразия в действии.#include //подключим библиотеку #include “SystemRus5x7.h” // прицепим шрифты #include “new_Font.h” #include “Gothic.
h” #include “zb.h” // прицепим картинки #include “bender.h” gText LeftTextArea; void setup() { GLCD.Init(); //инициализация } void loop() { GLCD.SelectFont(SystemRus); //выбираем шрифт GLCD.println(“Графические экраны, “); //пишем им GLCD.println(” это жутко прикольно”); delay(2000); GLCD.println(“сюда можно впихнуть “); GLCD.
println(“много текста=)”); delay(2000); GLCD.println(“”); GLCD.println(“И даже разными “); GLCD.println(” шрифтами”); delay(3000); GLCD.ClearScreen(); //очистим экран GLCD.SelectFont(Gothic); //выберем другой шрифт GLCD.CursorToXY(8,5); //установим курсор GLCD.println(“RoboCraft”); //и напишем там чего-нибудь GLCD.SelectFont(new_Font); GLCD.CursorToXY(10,35); GLCD.
println(“WG12864B”); delay(5000); GLCD.ClearScreen(); GLCD.SelectFont(SystemRus); GLCD.CursorToXY(0,25); GLCD.println(” А еще можно выводить”); GLCD.println(” простые картинки”); delay(3000); GLCD.ClearScreen(); GLCD.DrawBitmap(zb, 0, 0); //выведем картинку delay(2000); GLCD.ClearScreen(); GLCD.DrawBitmap(bender, 0, 0); //и ещё одну delay(2000); GLCD.FillRect(GLCD.
CenterX + 12, 0, GLCD.CenterX -22, GLCD.Bottom, WHITE); //сотрём участок картинки GLCD.DrawRoundRect(GLCD.CenterX + 13, 0, 49, GLCD.Bottom, 5); // и нарисуем там “облачко” почти как в комиксах=) delay(200); LeftTextArea.DefineArea(GLCD.CenterX + 15, 3, GLCD.Right-2, GLCD.Bottom-3, SCROLL_UP); // в облачке сделаем текстовую область с прокруткой вверх LeftTextArea.
SelectFont(SystemRus); //выберем шрифт для этой текстовой области LeftTextArea.println(“Работать, жалкие людишки!”);// бендер говорит LeftTextArea.println(” “); delay(2000); LeftTextArea.println(“Слава”); LeftTextArea.println(“робатам!”); LeftTextArea.println(” “); delay(2000); LeftTextArea.println(“Смерть человекам!”); delay(3000); GLCD.
ClearScreen(); }Шрифты и картинки в скетч включаются также как и библиотеки, и жрут немало места(особенно крупные шрифты)Например этот скетч влезет только(как минимум) в плату на базе Atmega328 .
Скетч, шрифты и картинки одним . Видео того, что получилось: Осталось разобраться с менюшками и прикрутить экран к сдвиговым регистрам для экономии ног.
Но это уже совсем другая история=)
Подробности про всю сигнально — битовую светотень творящуюся на линии связи МК и экрана почитать можно у , как обычно, всё разжёвано подробно и толково.
описания библиотеки GLCD.
Также, пока я собирался выложить эти статьи товарищ а wg1286 говорить по-русски=)
Источник: http://robocraft.ru/blog/arduino/909.html
Работа с графическим дисплеем WG12864 на базе контроллера KS0107
Обычно для вывода информации сигнального дисплея на HD44780 более чем достаточно. Но иногда нужно нарисовать картинку, график или хочется сделать красиво, с модными менюшками. Тут на помощь приходят графические дисплеи.
Одним из самых простых и доступных является дисплей на контроллере KS0107 или аналоге. Например, WG12864A от Winstar. Сам дисплей вполне свободно достается, имеет довольно большой размер (диагональ около 80мм) и разрешение 128х64 пикселя. Монохромный.
Цена вопроса 400-500р.
Вот такой вот:
Подключение Управление дисплеем параллельное. Есть шина данных и линии задания направления и вида данных. Это, кстати, один из минусов — требует очень много проводов управления. Занимает почти 16 линий. Но зато и очень прост в работе.
Итак, если взять тот, что у меня WG12864A-TGH-VNW то у него следующая распиновка:
- Vdd и Vss это питание, оно у него пятивольтовое.
- Vee — источник отрицательного напряжения. Там примерно минус 5 вольт. Есть не на всех моделях этих дисплеев, у Winstar о наличии такой фенечки говорит буква V в маркировке. WG12864A-TGH-VNW
- Vo — напряжение регулировки контраста. Туда подается либо 0…5 вольт, либо от -5 до 5, в зависимости от модели и температурного диапазона. Обычно более морозостойкие дисплеи требуют отрицательное напряжение. Схема включения простая:
- D/I — Данные/команда. Логический уровень на этом выводе определяет предназначение кода на шине данных. 1 — данные, 0 — команда.
- R/W — Чтение/Запись. Уровень на этой ноге задает тип действия. 1 чтение, 0 запись.
- Е — Строб, синхронизирующий импульс. Дрыг этой вожжи вверх-вниз проворачивает шестеренки в интерфейсе контроллера.
- DB0..7 — Шина данных, на которую мы выдаем нужный нам код.
- CS1 и CS2 — выбор контроллера.
- RST — сигнал сброса. Ноль на этой линии сбрасывает контроллеры в ноль. Но не сбрасывает видеопамять, только текущую адресацию.
- A и K — питание светодиодной подсветки. Там, как правило, обычные светодиоды, так что напрямую туда 5 вольт подавать нельзя. Только через ограничительный резистор. Ток потребления подсветки весьма велик, около 200мА, падение напряжения в районе 4 вольт. На пяти вольтовом питании ограничетельный резистор должен быть порядка 5-10 Ом.
К контроллеру (ATMega16 на Pinboard) я подключил все следующим образом.
Данные полностью легли на PORTA, а управление на PORTB. В качестве резистора подстройки контраста я взял многооборотный переменник, что так кстати стоит рядом для подобных случаев. Питание подсветки взял с колодки от дисплеяя. Благо там все уже готово, даже управление от транзистора есть 🙂 Правда я ее просто включил.
Двое из ларца, одинаковых с лица. Адресация Контроллер CS0107 он может организовать матрицу только 64х64. А у нас в дисплее вдвое большая 128х64. Значит стоят два контроллера. Один отвечает за правую половину экрана, другой за левую.
Он представляет собой этакую микросхему памяти, где все введенные данные отображаются на дисплее. Каждый бит это точка. Кстати, для отладки удобно юзать, выгружая туда разные данные, а потом разглядывая этот дамп).
Карта дисплея выглядит так:
Байты укладываются в два контроллера страницами по 64 байта. Всего 8 страниц на контроллер.
Так что для того, чтобы выставить точку с координатами на экране, например, Х = 10, Y=61 надо вычислить в каком контроллере она находится. Первый до 63, второй после, если адрес во втором контроллере, то надо вычесть 64 из координаты.
Затем вычислить страницу и номер бита. Страница это Х/8, а номер бита остаток от деления (Х%8). Потом нам надо считать нужный байт из этой страницы (если мы не хотим затронуть остальные точки), выставить в нем наш бит и вернуть байт на место.
Протокол обмена Тут все просто, без каких либо изысков. Выставляем на линиях RW, DI что мы хотим сделать, линиями CS1 и CS2 выставляем к кому обращаемся. На шину данных выдаем нужное число и поднимаем-опускаем линию строба.
Опа! Впрочем, есть одна тонкость. Для чтения данных строб нужно дернуть дважды, т.к. предварительно данные должны попасть в регистр-защелку. Для чтения же флага состояния такой изврат не нужен.
Вот примеры временных диаграм для разных режимов.
Чтение
И запись. Причем запись, в отличии от чтения, можно делать сразу в оба контроллера. Конечно одновременно писать данные в контроллер смысла имеет мало, разве что захочишь двойную картику получить 🙂 А вот команды обычно пишут срзау в оба.
Временные диаграммы, т.е. сдвиг фронтов между собой по времени может быть разным у разных контроллеров. Где то быстрей, где то медленней. Но в целом 1мкс обычно хватает. В реале обычно меньше. Лучше поглядеть в даташите на конкретный контроллер (не дисплей, в ДШ на дисплей обычно редко есть описание самого контроллера). Там обычно есть таблица вида:
Где указаны максимально допустимые временные интервалы. Если они будут меньше или больше, то дисплей скорей всего не будет работать. Или будет работать с ошибками. Если у вас на дисплей в процедуре заливки или очистки экрана полезли всякие левые пиксели и прочие артефакты — значит тайминги не выполняются.
Также рекомендую проверять тайминги на чтение и на запись. Делается это просто — гоним последовательно сначала чтение, а потом запись обратно. Если ничего не изменилось — значит все ок. Появились искажения? Крутите временные задержки.
Только рекомендую читать не пустоту вида 0х00, а что нибудь более веселое залить, например, шахматную доску из пикселей. По очереди 0х55 и 0хАА.
Система команд.
Она тут простейшая.
Команда | D/I | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | Назначение |
Отображение ВКЛ/ВЫКЛ | L | L | L | L | H | H | H | H | H | L/H | Управляет вкл/выкл отображения. Не влияет на внутреннее состояние и данные ОЗУ изображения.L: ВЫКЛH: ВКЛ |
Установить Адрес | L | L | L | H | Адрес Y (0 ~ 63) | Заносит адрес Y в счётчик адреса Y | |||||
Установить Страницу (адрес Х) | L | L | H | L | H | H | H | Страница (0 ~ 7) | Заносит адрес X в регистр адреса X | ||
Начальная Строка Отображения | L | L | H | H | Начальная строка отображения (0 ~ 63) | Скроллинг вверх. На сколько пикселей сдвинуть адресное пространство. При этом уехавшее вверх, за экран, вылезет снизу, словно мы провернули экранную область как барабан | |||||
Чтение Состояния | L | H | BUSY | L | ON/OFF | RESET | L | L | L | L | Чтение состояния.BUSYL: ГотовностьH: Выполняется команда ON/OFFL: Отображение ВКЛH: Отображение ВЫКЛRESETL: Нормальный режимH: Сброс |
Запись Данных Изображения | H | L | Данные для записи | Записывает данные (DB0:7) в ОЗУ данных изображения. После записи инструкции, адрес Y увеличивается на 1 автоматически. | |||||||
Чтение Данных Изображения | H | H | Данные для чтения | Читает данные (DB0:7) из ОЗУ данных изображения на шину данных. После чтения адрес Y сам увеличивается на 1 автоматически |
Инициализация дисплея элементарная, в отличии от HD44780, где надо переключать режимы, включать-выключать разные курсоры и отображения.
Надо после сброса задать начальные координаты (адрес точки и страница), значение скролинга (обычно 0) и включить отображение. При включении на дисплее может быть мусор. Поэтому отображение обычно включают после очистки видеопамяти.
У меня ициализация, по командам, выглядит так:
- 0x3F — включить
- 0x40 — Адрес Y=0
- 0xB8 — Страница Х=0
- 0xC0 — Скролл = 0 (т.е. с самого верха)
Ну и потом еще заливка сразу в оба контроллера.
Код Итак, приступим к коду. Чтобы было наглядней я все операции с ногами расписал в виде макросов. Заодно будет гораздо проще все перенести на другую архитектуру. Просто написав другие макросы, не правя сам код 🙂 Весь код можно поглядеть в нашей кодосвалке:
lcd_wg128.h
lcd_wg128.c
Покажу тут лишь характерные моменты работы с дисплеем.
Записью команд и данных занимаются следующие функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
// Пишем команду в выбранный контроллер void LCD_WR_COM(u08 cmd,u08 CSC) { // Поднятие сигналов: LCD_SET_CMD; // Команда LCD_SET_W; // Запись ON_CS(CSC); // Выбор чипа LCD_DATA_INS(cmd); // Команду на шину данных NOPS; // Подождем LCD_PUL_E; // Дрыгнем стробом NOPS; // Подождем LCD_OFF_CS1; // Выключим LCD_OFF_CS2; // выбор кристалла } // Пишем данные в контроллер void LCD_WR_DATA(u08 cmd, u08 CSC) { // Поднятие сигналов LCD_SET_DAT; // Данные LCD_SET_W; // Запись ON_CS(CSC); // Выбор чипа LCD_DATA_INS(cmd); // Данные на шину данных NOPS; // Подождем LCD_PUL_E; // Дрыгнем стробом NOPS; // Подождем LCD_OFF_CS1; // Выключим выбор LCD_OFF_CS2; // Чипа. } // Чтение данных из байта, адрес которого уже должен быть установлен. Надо только выбрать // контроллер. u08 LCD_RD_DATA(u08 CSC) { u08 outv; // Выставляем линии управления LCD_SET_DAT; // Данные LCD_SET_R; // Чтение ON_CS(CSC); // Выбираем чип (только один!) NOPS; // Ждем LCD_PUL_E; // Дрыг стробом – пустое чтение, активация защелки NOPS; // Ждем LCD_UP_E; // Строб вверх NOPS; // Ждем outv = LCD_DATA_PIN; // Контроллер выдал данные на шину. Читаем их LCD_DN_E; // Строб вниз LCD_OFF_CS1; // Все свободны! LCD_OFF_CS2; return outv; // Возвращаем считанное } |
// Пишем команду в выбранный контроллер void LCD_WR_COM(u08 cmd,u08 CSC) { // Поднятие сигналов: LCD_SET_CMD; // Команда LCD_SET_W; // Запись ON_CS(CSC); // Выбор чипа LCD_DATA_INS(cmd); // Команду на шину данных NOPS; // Подождем LCD_PUL_E; // Дрыгнем стробом NOPS; // Подождем LCD_OFF_CS1; // Выключим LCD_OFF_CS2; // выбор кристалла } // Пишем данные в контроллер void LCD_WR_DATA(u08 cmd, u08 CSC) { // Поднятие сигналов LCD_SET_DAT; // Данные LCD_SET_W; // Запись ON_CS(CSC); // Выбор чипа LCD_DATA_INS(cmd); // Данные на шину данных NOPS; // Подождем LCD_PUL_E; // Дрыгнем стробом NOPS; // Подождем LCD_OFF_CS1; // Выключим выбор LCD_OFF_CS2; // Чипа. } // Чтение данных из байта, адрес которого уже должен быть установлен. Надо только выбрать // контроллер. u08 LCD_RD_DATA(u08 CSC) { u08 outv; // Выставляем линии управления LCD_SET_DAT; // Данные LCD_SET_R; // Чтение ON_CS(CSC); // Выбираем чип (только один!) NOPS; // Ждем LCD_PUL_E; // Дрыг стробом – пустое чтение, активация защелки NOPS; // Ждем LCD_UP_E; // Строб вверх NOPS; // Ждем outv = LCD_DATA_PIN; // Контроллер выдал данные на шину. Читаем их LCD_DN_E; // Строб вниз LCD_OFF_CS1; // Все свободны! LCD_OFF_CS2; return outv; // Возвращаем считанное }
Чтение слова состояния делать не стал. Т.к. дисплей работает весьма шустро, что на круг ожидания можно не уходить, а просто подождать несколько тактов. Собственно этих трех функций уже достаточно для работы 🙂 Остальное все свистоперделки и удобства.
Вроде заливки экрана:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Заливка экрана void LCD_FILL(u08 byte) { for(u08 i=0; i |
Источник: http://easyelectronics.ru/rabota-s-graficheskim-displeem-wg12864-na-baze-kontrollera-ks0107.html
Подключение графического индикатора (KS0108) к PIC микроконтроллеру. Часть 1 – Теория
» Схемы » Интерфейсы · Применение микроконтроллеров
31-01-2012
Использование графического индикатора кардинально меняет внешний вид вашего проекта. Он предоставляет больше свободы при отображении данных, чем символьный ЖК индикатор на базе контроллера HD44780.
В статье мы рассмотрим как подключить графический индикатор на контроллере KS0108 (или совместимом) к микроконтроллеру PIC производства компании Microchip.
Статья разделена на несколько частей, в которых мы последовательно рассмотрим аппаратную и программную части проекта.
Выбор микроконтроллера PIC16F887 связан с тем, что приложения с графическим ЖКИ требуют достаточно много ресурсов микроконтроллера (линии ввода/вывода, встроенная память) и данный микроконтроллер имеет 36 линий ввода/вывода и 14 КБайт Flash-памяти.
Графический ЖКИ, который используется в нашем проекте – это модуль WDG0151-TMI монохромного индикатора производства компании Winstar с разрешением 128×64 точки. Он выполнен на базе двух контроллеров NT7108C и NT7107C, которые совместимы с контроллерами Samsung KS0108B и KS0107B.
KS0108B – это 64 канальный точечный драйвер ЖК сегментов. Модуль WDG0151-TMI содержит два таких контроллера, чтобы обеспечить управление 128 сегментами.
С другой стороны контроллер KS0107B (NT7107C) – это 64 канальный драйвер общих линий индикатора, который генерирует временные сигналы для управления двумя сегментными драйверами.
Это очень распространенные и хорошо зарекомендовавшие себя контроллеры, которые применяются и в индикаторах других производителей.
Блок-схема модуля Winstar WDG0151-TMI
Нажмите для увеличения
Контроллер NT7107C управляет 64 общими линиями дисплея (COM1 – COM64). Первый контроллер NT7108C управляет левой половиной сегментов (SEG1 – SEG64) дисплея, второй NT7108C – правой половиной сегментов (SEG65 – SEG128).
Доступ к двум половинам дисплея осуществляется индивидуально посредством сигнальных линий Chip Select (CS1, CS2). Каждая половина дисплея представлена 7 горизонтальными страницами памяти, каждая высотой 8 бит (1 Байт).
Начиная с 0 страницы в левoй половине (/CS1=0), если вы передадите 1 байт данных, они будут отображены в первом столбце страницы 0.
Если повторить данный процесс 64 раза и затем переключиться на вторую половину дисплея и повторить операции, пока не будет достигнута 128 позиция, мы получим отображение первых 8 линий на дисплее.
Для отображения следующих 8 линий необходимо повторить эти операции, но сменив адрес страницы памяти. Общее количество байт, необходимое для отображения одного кадра (128×64 точки), в нашем случае равно 2×64×8 = 1024.
Модуль дисплея Winstar WDG0151-TMI GLCD имеет встроенный генератор отрицательного напряжения для управления контрастностью. Потенциометр регулировки контрастности (обычно 10 кОм) подключается между выводами VEE и VCC. Расположение линий ввода/вывода индикатора не стандартизировано, поэтому необходимо обратиться к технической документации на дисплей при подключении его к микроконтроллеру.
В общем случае количество выводов у графического индикатора 20.
Первые два вывода – выбор контроллера левой или правой части индикатора, активный уровень – низкий, однако существуют индикаторы с высоким активным уровнем (поэтому и понадобится еще раз техническое описание используемого индикатора от производителя).
С помощью вывода 6 индикатора D/I (Data/Instruction) пользователь указывает, что поступает на шину данных индикатора: данные или команды (инструкции). Управляющие сигналы R/W и E имеют такое же назначение, как и в символьных индикаторах на контроллере HD44780.
Назначение выводов модуля ЖКИ WDG0151-TMI
Номервывода | Обозначение | Уровень | Описание |
1 | /CS1 | Низкий | Выбор сегментов 1 – 64 |
2 | /CS2 | Низкий | Выбор сегментов 65 – 128 |
3 | Vss | 0 В | Общий («земля») |
4 | VDD | 5.0 В | Напряжение питания |
5 | Vo | переменный | Подстройка контрастности |
6 | D/I или RS | Низкий/Высокий | Высокий: данные;Низкий: инструкции |
7 | R/W | Низкий/Высокий | Высокий: чтение данных;Низкий: запись данных; |
8 | E | Высокий | Разрешение записи/чтения |
9 – 16 | D0 – D7 | Низкий/Высокий | Шина данных |
17 | RST | Низкий | Сброс модуля ЖКИ |
18 | VEE | Выход отрицательногонапряжения | |
19 | A | Анод подсветки дисплея | |
20 | K | Катод подсветки дисплея |
Контроллеры KS0107B и KS0108B не имеют своего знакогенератора, поэтому его функции будет выполнять программа микроконтроллера. Сам ЖКИ поддерживает ряд инструкций, которые приведены ниже в таблице. Необходимо помнить, что вывод RS (D/I) должен быть в высоком состоянии при операциях чтения/записи данных и оставаться в низком состоянии, когда передаются инструкции.
Команда | RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | Назначение |
ДисплейВКЛ/ВЫКЛ | L | L | L | L | H | H | H | H | H | L/H | Управляет вкл/выкл отображения. Не влияет на внутреннее состояние и данные ОЗУ изображения. L: ВЫКЛH: ВКЛ |
Установитьадрес | L | L | L | H | Адрес Y (0 ~ 63) | Заносит адрес Y в счетчик адреса Y | |||||
Установить страницу(адрес Х) | L | L | H | L | H | H | H | Страница (0 ~ 7) | Заносит адрес X в регистр адреса X | ||
Начальная строкаотображения | L | L | H | H | Начальная строкаотображения (0 ~ 63) | Указывает данные ОЗУ изображенияотображаемые вверху экрана | |||||
Чтениесостояния | L | H | BUSY | L | ON/OFF | RESET | L | L | L | L | Чтение состояния.BUSY L: ГотовностьH: Выполняется командаON/OFF L: Отображение ВКЛ H: Отображение ВЫКЛRESETL: Нормальный режимH: Сброс |
Запись данныхизображения | H | L | Данные для записи | Записывает данные (DB0:7) в ОЗУ данных изображения. После записи инструкции, адрес Yувеличивается на 1 автоматически. | |||||||
Чтение данныхизображения | H | H | Данные для чтения | Читает данные (DB0:7) из ОЗУ данныхизображения на шину данных |
Часть 2 – Схема, программа микроконтроллера для инициализации индикатора
Источник: https://www.rlocman.ru/shem/schematics.html?di=113044
Подключение графического LCD дисплея KS0108(WG12864B1) к LPT порту
Adblockdetector