Работа с графическим LCD WG12864C

21 ноября 2014

Когда-то сделал маленькую библиотеку для работы с графическим ЖКИ на ассемблере, немного порисовал в Proteus`e, а потом куда-то ее задевал и вот решил недавно подключить WG12864C и повыводить на него какие-нибудь данные и написать программу на С. Что из этого получилось опишу ниже. Итак, в этой статье можно найти как подключить, что куда подать и какими командами управлять WG12864C. Разрешение дисплея 128 на 64 точки. Управляет дисплеем два контроллераKS0108. Это связано с тем, что один контроллер может управлять дисплеем с разрешением 64 на 64 точки. Это  конечно вносит дополнительные сложности в управление этим дисплеем, но мы сможем все это решить. Выглядит дисплей так

 
Подключение питания понятно из рисунка ниже. Подстроечный резистор служит для настройки контраста.
Для управления дисплеем существует 20 выводов на которые подается питание, управляющие импульсы, команды, а также можно читать данные из RAM памяти дисплея. Назначение ножек приведено в таблице ниже. 
Чтобы передать данные на дисплей нужно вывести их на шину данных DB0-DB7 и подать разрешающий импульс на вход E и по спаду импульса данные запишутся в память дисплея, чтобы считать данные нужно подать на вход разрешающий импульс, подождать 500нс и считывать данные с шины DB0-DB7.  Вход D/I служит для указания дисплею что передается данные или команда. Входы CS1 и CS2 управляют включением одного из двух контроллеров для которого предназначена команда или данные. Следует обратить внимание на эти входы, т.к. в одних дисплеях включение контроллеров может происходить подачей высокого уровня на эти выводы, а в других низкого. Обычно в даташите в таблице с назначением выводов это указывается. Если обратить внимание на нашу таблицу, то видим, что у нас включаются контроллеры дисплея подачей на них низкого уровня. Уровень на входе R/W определяет  что мы хотим, прочитать данные с дисплея или записать их туда. RST предназначен для сброса дисплея и обратите внимание, что сброс производится подачей низкого уровня на этот вход.
Теперь нужно выяснить какими командами можно управлять дисплеем. Опять же в даташите найдем таблицу с командами и посмотрим что там есть.
В таблице RS это тоже что и DI в распиновке дисплея. Для включения дисплея нужно послать команду 0b00111111, т.е. установить на шине данных это число, установить низкий уровень на R/W, низкий уровень на D/I, подать разрешающий импульс на E, убрать импульс на E и по спаду команда включит дисплей. Затем мы устанавливаем в нуль все координаты, т.е. для Y подаем команду - 0b01000000, для X - 0b10111000, начальная область отображения - 0b11000000. И все, после этого с дисплеем можно работать.
В общем то все довольно просто и понятно - выставляй данные на шину данных, выставляй нужные уровни на управляющих входах, включай нужный контроллер и все. Только нужно по координатам определять какой контроллер включать.
А теперь напишем какую-нибудь простую программку для вывода, например, точки на экран. Сразу договоримся, что координата X, если смотреть на экран так как на самом первом рисунке, будет идти сверху вниз и изменяться в диапазоне 0..63, а Y - слева на право (0..127).  И область экрана каждого управляющего контроллера разбита на страницы по X. Например, в первую страницу входят строки с координатой X в диапазоне 0..7, во вторую страницу - с координатой X 8..15 и т.д. до 63. Таким образом мы получаем 8 страниц на экране.
Если Y лежит в диапазоне 0..63, то включаем CS1, а если 64..127 - CS2 и отнимаем от координаты Y 64 (т.к. это два отдельных контроллера и в каждом Y изменяется в диапазоне 0..63). Да, и еще, чтобы нарисовать точку сначала будем считывать байт в который попадает точка с координатой (X,Y) изменять соответствующий бит и снова записывать этот байт в дисплей (где-то подсмотрел эту технологию, не помню где). 
Программу в WinAVR можно скачать в конце статьи, а также даташит на WG12864C. Думаю, там все будет понятно из комментариев. Можно подключить какой-нибудь дисплей с контроллером KS0108 в Proteus'e к МК ATmega8 и посмотреть как все это работает. К каким ножкам микроконтроллера подключить дисплей будет понятно из программы, там вначале это определяется
//Определяем порты и биты порта к которым подключен дисплей
#define LCD_PORT PORTD//шина данных DB0-DB7
#define LCD_DDR DDRD
#define CMD_PORT PORTB//управляющий порт
#define CMD_DDR DDRB
#define LCD_PIN PIND
#define DI 0
#define RW 1
#define E 2
#define CS1 3
#define CS2 4
#define RST 5
#define CS 0//определяем каким уровнем включается контроллер
В Proteus'e два дисплея с контроллером KS0108 и они отличаются тем, что контроллеры включаются разными уровнями на CS1 и CS2. Чтобы это учесть ввел параметр CS, записью в который 0 или 1 определяем каким уровнем включается контроллер. Вот собственно и все. В ближайшее время хочу сделать библиотеку для такого дисплея.