Дисплей WG12864. Часть 1.

Статья ниже — это проба пера студента группы автоматики и автоматизации Донецкого института железнодорожного транспорта, известного завсегдатаям easyeleсtronics.ru под ником Konoplj2010 Очень неплохо, я считаю, тем более, для первого раза.
s_black

Приветствую. В данной статье я хочу рассказать вам про графический LCD дисплей модели WG12864A. Без сомнений, для многих радиолюбителей он уже не в новинку, однако, я по себе знаю, что не все, но большинство статей про этот дисплей содержат «грабли», на которые почти каждый новичок наступает. Вторая половина этих статей пишется так заумно, что её не то, что понять — прочитать тяжело. Я же по своей инициативе и по просьбе товарища, хотел бы немного пролить свет на этот вопрос.
Немного теории. Данный дисплей выпускается многими фирмами, но наиболее крупнейшие производители это китайский WINSTAR и российский МЕЛТ. (скорее они просто наиболее распространены у нас — s_black).  Пожалуй, я не сообщу новость о том, что китайский WINSTAR подешевле МЕЛТ-а, и качеством не хуже. Дисплей WG12864A является монохромной жидкокристаллической матрицей с разрешением 128Х64 (по вертикали 128, по горизонтали 64), внутренними управляющими контроллерами KS0108 и внутренней видео памятью 1Кбайт. Внешний вид дисплея показан на фото ниже:

Хотелось бы сразу обратить ваше внимание на одну маленькую деталь. На дисплее имеется две SMD перемычки J1 и J2 и от их положения зависит полярность питания дисплея. Я уже столкнулся с такой проблемой, когда новый дисплей имел перепаянные перемычки. Если у нового дисплея перемычки, впаянные, как показано ниже, то полярность такая же, как и в справочнике:

А в справочнике показано так:

Итак, рассмотрим эту матрицу. Для управления дисплеем нужно две шины: — ШД —  шина данных 8 бит (8 выводов МК); — ШУ — шина управления 6 бит (6 выводов МК). Замечу, что ШУ может быть и 4-х битная, но это замедлит инициализацию дисплея и исключит возможность чтения внутренних данных. Вообще-то я не сторонник экономить выводы МК, если их и так много. Как я уже говорил, на плате дисплея установлены два контроллера KS0108, эти контроллеры имеют внутреннюю память по 512Байт и управляют каждый своей половиной дисплея. То есть, программно и аппаратно дисплей разбит на две части по 64Х64. Обращаться к каждому из них можно как вместе, так и по отдельности. Выводы, отвечающие за это обращение имеют номера 15, 16 и носят название CS1 и CS2. Для выбора нужной половины дисплея необходимо подать высокий уровень на соответствующий вывод дисплея. Тип передачи данных по стробу готовности, поэтому на плате дисплея имеется отдельный вывод строба. Этот вывод под номером 6 и носит название Е. Момент времени, когда дисплей считывает показание с ШД — это тот момент, когда на выводе Е меняется уровень с высокого на низкий . Однако для выполнения внутренних процессов после этой смены уровней необходимо ожидать не меньше чем 10 us. В зависимости от уровня на выводе 4, который называется D/I, контроллер дисплея понимает какой байт ему был передан. Вывод D/I определяет данные или инструкции, если подать высокий уровень на этот вывод, то дисплей будет понимать, что на вывод попали данные, которые необходимо изобразить на матрице под нужным адресом, а если подать низкий, то дисплей поймёт, что это обращение к адресам или чтение состояния дисплея. Для того чтобы опросить дисплей о состоянии каких либо данных или состояний используется вывод 5 который называется R/W. Этот вывод обозначает направление данных, если на вывод R/W подать низкий уровень, то дисплей будет принимать данные с ШД, а если подать высокий, то дисплей будет выдавать на ШД (дисплей передаёт данные только на ШД при этом ШУ не изменяет) данные о внутреннем состоянии или о байте данных под определённым адресом. Вывод под номером 17 называется RST и в комментариях не нуждается. При подаче низкого уровня, дисплей сбросит свою внутреннюю память и выключится. Для его повторного запуска необходимо заново инициализировать и записывать новую информацию. ШД расположена на проводах от 7 до 14, лично я рекомендую подключить к одному целому порту МК для того, чтобы было проще выводить данные за один машинный цикл. Выводы питания: 1 – общий и 2 – положительный вывод. Питание необходимо подавать в пределах от 4.75 – 5.25, в принципе можно подать напряжение ниже, но тогда необходимо увеличивать время инициализации и время строба. Выводы 3 и 18 предназначены для регулирования контрастности изображения аппаратно. Проще говоря, ставится регулируемый резистор по схемам ниже:
Как видно, схемы подключения две, причём обе правильные, разница в том, что в варианте а контрастность при повороте ходунка изменяется сначала плавно, а когда бегунок ближе к половине дорожки резистора контрастность изменяется резко. В варианте б наоборот — сначала резко, а потом плавно.
Контакты 19 и 20 — это выводы Анода(+) и Катода(-) подсветки дисплея. Ток подсветки может достигать до 240 мА при напряжении до 4.6 В что совсем даже не мало. Поэтому следует подключить постоянный резистор на эту подсветку, номинал можно рассчитать следующим образом. Исходим из напряжения питания дисплея Vcc = 5В и получим.
5 — 4.6 = 0.4 [В — В = В]
То есть на 0.4 В должно упасть напряжение на резисторе. И по правилу старого доброго дяди Ома получаем.
0.4 / 0.240 = 1.666… [В / А = Ом]
То есть для того чтобы подсветка горела с максимально допустимой интенсивностью необходимо устанавливать резистор сопротивлением не ниже чем 1.666 Ом. Мощность этого резистора должна быть не ниже чем.
0.4 * 0.240 = 0.096 [В * А = Вт]
То есть принимаем резистор МЛТ 0.125 и его достаточно. Я рекомендую, все-таки подключать эту подсветку ещё через транзистор базой к МК, для осуществлении регулирования интенсивности этой подсветки при помощи широтно-импульсной модуляции ШИМ или выключения вовсе.
Система адресации и команд. Упрощенная таблица адресов и команд изображена ниже: 

В матрице нам необходимо иметь доступ к каждому отдельному пикселю дисплея, для этого, как уже говорилось, область дисплея разбита на 2 равные части по 64Х64.  По вертикали можно обращаться к каждому столбцу отдельно, а по горизонтали дисплей разбит на 8 строк по 8 пикселей в каждом (8* 8 = 64).

При инициализации дисплей сбрасывает все предустановленные координаты в положение Строка №0 Столбец №0 и работает с этим байтом. После ввода каждого последующего байта данных, координата отображения автоматически смещается на 1 столбец в лево, но когда доходит до положения 63 столбца продолжает выводить с 0. Как видно строк всего 8, то есть в двоичном коде их можно пронумеровать используя только три бита данных, но для того чтобы дисплей понял что от него требуется необходимо подать ещё дополнительно пять байт кода строки и того получаем.
Строка №0    —        10111000
Строка №1    —        10111001
Строка №2    —        10111010
Строка №3    —        10111011
Строка №4    —        10111100
Строка №5    —        10111101
Строка №6    —        10111110
Строка №7    —        10111111
Столбцов у нас по 64 в каждой половине, для того чтобы пронумеровать каждый столбец нам необходимо использовать 6 бит. Аналогично, чтобы перейти из одного столбца в другой нам необходимо подать подобный код, но два старших бита будут другими.
Столбец №0  —        01000000
Столбец №1  —        01000001
Столбец №2  —        01000010
Столбец №3  —        01000011
…………………………………………
Столбец №63-        01111111

Небольшой пример: вывести на строку №4 на столбец №16 первой половины дисплея два байта 0хАА и 0х55

Ну и теперь выводим данные.
 В результате получаем, что то похожее на это:

В программе Proteus 7 Professional это выглядит так (на схеме приведён пример аналогичного негативного дисплея AMPIRE 128 х 64):

На практике это выглядит вот так:

Программа тестового проекта содержится в архиве (ссылка в конце статьи). Но всё это игрушки, на практике не приходится выводить на такой дисплей такую ерунду. (ещё и как приходится 🙂 — s_black) Чаще всего приходится выводить информацию в виде цифр или букв, но для таких случаев имеется большой  выбор символьных дисплеев. Но, вот, если рассмотреть символьные дисплеи, то мы видим, что для одного символа достаточно всего 8 строк по горизонтали и 5 столбцов по вертикали. Давайте посчитаем, сколько же подобных символов может вместиться на наш дисплей:
128 / 5 = 25.6
64  / 8 = 8
То есть, 8 строк по 25 символов в каждой строке! Я ещё и не видел символьных дисплеев с подобными параметрами! Самый большой, который я видел, 4 строки на 20 символов в строке, но стоит он в полтора раза дороже, чем WG12864… так зачем платить больше?
Теперь организуем программный знакогенератор.
Я воспользовался кодировкой изображений цифр символьных дисплеев, и в результате получил такой ряд:
 Разберём их по байтно на примере цифры 1:
 И каждый байт по отдельности:
Получаем, что для того, чтобы на дисплее засветилась «1» нам надо подать пять байт с содержанием 0х00; 0х42; 0х7F; 0х40; 0х00; С другими символами, я думаю, разобраться так же можно, вроде бы всё просто и понятно. В итоге получилась программа, которая не превышает 448 Байт flash памяти микроконтроллера. И, напоследок, хотелось бы процитировать одного большого человека Кучеренко А. А. (Доцент кафедры «Автоматизация компьютерных систем управления» Донецкий институт ЖД транспорта) «Ваша задача, как людей из подрастающего поколения, одолеть китайского производителя на нашей территории».
 Здесь исходники в архиве.

Об авторе Konoplj2010

Учение - свет, а неучение - тьма. Вот почему необходимо заниматся электроникой, чтобы быть неучем но при этом освещать себе путь ;-)
Запись опубликована в рубрике Микроконтроллерный конструктор с метками . Добавьте в закладки постоянную ссылку.

Один комментарий: Дисплей WG12864. Часть 1.

  1. M.Stas говорит:

    «Как видно, схемы подключения две, причём обе правильные, разница в том, что в варианте а контрастность при повороте ходунка изменяется сначала плавно, а когда бегунок ближе к половине дорожки резистора контрастность изменяется резко. В варианте б наоборот — сначала резко, а потом плавно.»

    Для регулируемых резисторов существует еще один параметр ≈ зависимость сопротивления между начальным выводом и движком от угла поворота (Ос) движка.

    Различаются переменные резисторы

    группы А (линейная зависимость),
    группы Б (логарифмическая)
    группы В (показательная или обратнологарифмическая зависимость).

Добавить комментарий

Ваш e-mail не будет опубликован.