Подключение и тестирование LCD 240RGBx320 c параллельным интерфейсом
Июль 2015г.
1. Начало этой истории
Как-то в Алиэкспресс появились жидкокристаллические дисплеи с диагональю 2,2 дюйма и разрешением 240RGBx320 по очень соблазнительной цене. Я оказался в числе соблазнившихся и приобрел парочку таких изделий по 90 руб. за штуку. Забегая наперед, могу сказать, что авантюра оказалась удачной: несмотря на мягкую упаковку, неотслеживаемый трек-номер и несоответствие модели дисплея, товар дошел без повреждений, экранчики удалось подключить, протестировать и никаких дефектов выявлено не было. Но, как говорится, скоро сказка сказывается...
Подключение такого рода экранчиков не является суперсложной задачей. Но, правда, при одном условии - наличии технической документации, которая в самом минимальном виде должна содержать назначение выводов LCD, список команд и алгоритм инициализации. Могут потребоваться и еще некоторые "секреты". Чтобы не оказаться "счастливым" обладателем, хотя и не дорогого, но бесполезного хлама, я заранее нашел в интернете и скачал документацию. Но, получив на почте конвертик, как и многие "братья по счастью", я с удивлением обнаружил в нем... не совсем те LCD, какие были в описании у продавца. Единственное, что совпадало - это диагональ и разрешение. Впрочем, проверить разрешение удалось позднее - только после включения. Различия же начинались уже с количества выводов - их было 32 вместо обещанных 26. Пришлось искать информацию теперь уже на реальный дисплей. Не скажу, что поиск был долгим и трудным, но это лишь благодаря тому, что на одном из форумов уже была открыта подобная тема: http://forum.easyelectronics.ru/viewtopic.php?f=9&t=22577 Мужики, оказавшиеся в аналогичной ситуации, раздобыли нужную информацию.
Теперь дисплеи нужно было проверить. А это означало, как минимум, физическое подключение и создание программы для их инициализации и тестирования. Требовалось собрать некую схему для тестирования дисплеев, не имея при этом возможности протестировать саму эту схему по причине отсутствия заведомо исправного LCD. Это означало, что схема должна быть предельно простой - настолько простой, чтобы вероятность ошибки в ней стремилась к нулю. Она также должна быть максимально открытой, чтобы ее работу легко можно было проверить, например, в пошаговом режиме, измеряя напряжения на выводах LCD. Нужно было выбирать: собирать схему на микроконтроллере или без него. Предпочтение было отдано второму варианту. Во-первых, при этом отпадала необходимость писать программу для контроллера и возиться с ее отладкой. Во-вторых, для организации пошагового режима не нужно было ничего специально выдумывать. В-третьих, при внесении изменений в программу не требовалась перепрошивка чего-либо - достаточно было сохранить изменения в текстовом файле, и - можно снова запускать программу. Недостаток же у этого метода, пожалуй, всего один - низкая скорость записи информации в LCD. Но с этим недостатком решено было смириться, учитывая назначение данной схемы. Я не собирался постоянно использовать LCD с таким способом подключения. Мне нужно было лишь удостовериться в исправности экранчиков, разобраться с алгоритмом их инициализации, поэкспериментировать, потестировать. Описываемая ниже схема отлично справилась с этими задачами. Заполнение всего экрана графической информацией с ее помощью длится, конечно, довольно долго - нужно передавать в LCD большой объем информации при том, что интерфейс LCD реализован путем его программной эмуляции, да еще и через сдвиговые регистры, управляемые также программно. Однако длительность инициализации, как и длительность настройки режимов LCD, не столь велика и укладывается в приемлемые рамки. Это объясняется тем, что для инициализации или настройки достаточно выполнить максимум нескольких десятков операций записи.
2. Схема устройства
Рассмотрим подробнее порядок подключения LCD, несущего на себе загадочные надписи TC220-85-C-P4-J-E и TFT8K0291FPC-A1.
1. О назначении первого вывода я могу лишь строить предположения. Возможно, он сигнализирует о физическом присутствии LCD в системе. Во всяком случае, без него можно обойтись.
2. Подключается к общему проводу.
3. Питание +2.8V
4. Выбор кристалла. Активный уровень - низкий. Его полноценное задействование имеет смысл в том случае, если шина данных используется более чем для одного устройства. В простейшем случае достаточно подать на него константу - логический "0".
5. Обязательно должен быть подключен и программно доступен. Этот сигнал принимает разные уровни в зависимости от того, что записывается в LCD: команда (0) или данные (1). Здесь можно запутаться. Дело в том, что в концепции разработчиков микросхемы вместо понятия "команда" используется понятие записи в "индексный регистр". Это почти то же самое, но с указанием на архитектуру кристалла. Индексный регистр является указателем адреса того регистра, куда будут записываться данные. Иначе говоря, команда - это номер в адресном пространстве регистров, предназначенных для записи данных. В качестве данных могут быть как настройки режимов, так и графическая информация.
6. Строб записи. Активный уровень низкий. Подключать обязательно. Когда записываемая информация на шине данных сформирована, этот сигнал должен быть переведен в активное состояние и обратно. При этом происходит запись информации в LCD.
7. Строб чтения. Активный уровень низкий. Можно не использовать, подав на него константу - логическую единицу. Нужен только в том случае, если предполагается читать что-либо из LCD.
8. Этот вывод сделан для красоты. Подключения не требует.
9,10,11,12. Выводы сенсорной панели, которой нет.
13. Общий анод светодиодов подсветки. Соответственно, подключается к плюсу источника питания подсветки.
14,15,16,17. Катоды светодиодов подсветки. Подключаются к минусу источника питания подсветки. Причем, вместе их лучше не соединять из-за разброса параметров светодиодов.
18. На этот вывод лучше подать константу, а вот какую - это дело личных предпочтений. Я решил подать логическую единицу. Нет, не от того, что к единицам больше тяготею, чем к нулям. Дело в том, что при этом возможности данного дисплея раскрываются по-максимуму. Надо отметить, что разработчики очень "постарались" с разрядностью шины данных и внутренних регистров. Так вот, подав логическую единицу на этот вход, мы получим аж 9-разрядную шину данных и максимальный набор цветовых и яркостных градаций. При нуле на этом входе становится ненужным вывод 19 (DB9), а шина данных превращается в 8-разрядную.
19...27. Шина данных DB9...DB17. Без нее не обойтись.
28. Аппаратный сброс. Активный уровень - низкий. Он нужен, но в самом простом случае к нему можно подключить даже обычную кнопку с подтягивающим резистором.
29. Питание +2.5...3.3 V.
30. Питание +2.8V.
31. Подключается к общему проводу.
32. Этот вывод сделан для красоты. Подключения не требует.
Для связи с компьютером использован простенький конвертер USB-RS232TTL на микросхеме PL-2303. Вовсе не обязательно применять именно такой конвертер, но у этого есть свои преимущества. Главное из них заключается в отсутствии необходимости подключать дополнительное питание. Все питающие напряжения можно получить прямо от этого модуля. Кроме обычного для USB напряжения +5V, данный модуль имеет выход +3.3V. Зачем создателям микросхемы PL-2303 понадобилось утруждаться формированием этого напряжения, я не очень понимаю. Казалось бы, питание подключенных к модулю устройств - не их забота, но раз такое напряжение уже сформировано, было бы грех этим не воспользоваться. С помощью диода VD1 и резистора R29 напряжение 3.3V снижается примерно до 2.8V и используется для питания LCD. В качестве VD1 подойдет любой кремниевый диод.
Микросхемы DD2 и DD3 питаются напряжением 5V, которое также снимается с модуля преобразователя интерфейса. С помощью этой же цепи питания формируется ток питания светодиодов подсветки. Величина этого тока ограничивается резисторами R30...R33. Соединять катоды светодиодов подсветки между собой не рекомендуется.
На резисторах R3...R26 собраны делители напряжения. Они нужны для понижения уровня логической "1" сигналов, поступающих с выходов микросхем DD2, DD3 на входы LCD. Если этого не сделать, на входах LCD будет появляться напряжение логической "1", значительно превышающее напряжение питания LCD, что недопустимо.
Эмуляция интерфейса LCD выполняется путем последовательного наполнения сдвиговых регистров DD2 и DD3. Благодаря наличию в этих микросхемах дополнительного регистра хранения, процесс их наполнения не меняет состояние выходов до тех пор, пока не будет подан сигнал параллельной загрузки на выводы 12. Это позволяет управлять логическим уровнем любого разряда на выходах Q0...Q7 указанных микросхем, оставляя неизменными состояния остальных выходов.
Для наполнения сдвиговых регистров (74595) на вывод 14 микросхемы DD2 последовательно подаются вводимые данные, начиная со старшего разряда. Сдвиг выполняется положительным фронтом синхроимпульса на выводах 11 обеих микросхем. По окончании наполнения регистров на выводы 12 микросхем DD2 и DD3 подается импульс логической единицы, по фронту которого происходит одновременное (параллельное) отображение накопленных последовательным способом данных на выходах регистров. Передача сдвигаемых данных от DD2 к DD3 выполняется при помощи вывода 9 микросхемы DD2, который отражает состояние старшего разряда сдвигового регистра, минуя параллельный регистр хранения. В общей сложности для управления сдвиговыми регистрами как описано выше требуется три сигнала: данные, сдвиговый синхроимпульс и синхроимпульс параллельного вывода.
Указанные сигналы формируются программно на выходах DTR, RTS и TXD конвертера USB-RS232TTL. Сигналы DTR, RTS и TXD в данном случае используются нестандартно, но никакого "криминала" в этом нет, и, как показывает опыт, такой метод достаточно надежен. Задействованный в данной схеме конвертер не имеет удобно выведенных выходов DTR и RTS, поэтому пришлось прорезать окно в термоусадочной оболочке и припаять проводники напрямую к выводам микросхемы PL-2303. У данной микросхемы на выводе 1 формируется сигнал TXD, на выводе 2 - DTR, на выводе 3 - RTS. Но такой метод получения доступа к необходимым сигналам подойдет не всем - пайка мелкая. Расстояние между первым и четырнадцатым выводами микросхемы PL-2303 составляет всего 8,8 мм. Можно пойти другим путем - применить конвертер USB-RS232TTL в виде шнура-переходника. Тогда все необходимые сигналы можно снять с обычного разъема, как у COM-порта. Питание схемы в этом случае придется организовывать другим способом. При замене конвертера USB-RS232TTL на другую модель необходимо учитывать возможность инвертирования (или его отсутствия) некоторых сигналов в зависимости от модели конвертера. Нет никаких требований по инвертированию, которые влияли бы на выбор конвертера. Нужно лишь иметь в виду, что может потребоваться внести соответствующую поправку в программу (в самом начале скрипта, где описаны настроечные константы).
В цепи питания 5 В и 2,8 В полезно добавить конденсаторы емкостью 0,1...1 мкф, чтобы снизить вероятность сбоя из-за помех по питанию.
3. Программная часть
Аппаратная часть подключения данного LCD не содержит в себе ничего особенного, если не обращать внимания на девятиразрядность шины данных, что, впрочем, не страшно. А вот с точки зрения программирования данного дисплея можно сказать, что его создатели намудрили основательно: все внутренние регистры считаются 18-разрядными (даже индексный, использующий всего 7 разрядов), запись из-за этого всегда выполняется двумя операциями (сначала - старшие 9 бит, затем - 9 младших), инструкции в то же время 16-разрядные (что вызывает особый "перекос" с 18-разрядным внутренним регистром записи), а графические данные используют все 18 бит при условии, что шина данных работает в 9-разрядном режиме. Причем три элементарных цветовых пикселя в одной триаде передаются также за две операции записи: сначала 6 бит красного и 3 старших бита зеленого, затем 3 младших бита зеленого и 6 бит синего. Ко всему в придачу алгоритм инициализации придуман как будто с расчетом "чтобы враги не догадались" - для запуска данного LCD требуется обилие замысловатых настроек и команд.
a=1;
while a<=24 do
begin
Инд='20'; SetIndex(); Дан='0040'; SetData();
Инд='21'; SetIndex();
Дан=Str.SetLen.Right(Str.DecToHex(Y),4,'0'); SetData();
Инд='22'; SetIndex();
b=1;
while b<=24 do
begin
if (a<=4) or (a>20) then
Точка='000000000000000000' else
if (b<=4) or (b>20) then
Точка='000000000000000000' else
Точка='111111000000000000'; //красный
OutToGRAM();
b=b+1;
end;
Y=Y+1;
a=a+1;
Sys.PM();
end;
С учетом вышесказанного, рассматриваемый LCD трудно назвать простым для программирования. Делаю такой вывод, имея возможность сравнивать: в прошлом довелось "поиграться" с похожим экранчиком, имеющим также разрешение 240x320 и такую же диагональ. Но тот LCD удалось запустить в буквальном смысле голыми руками - схема подключения состояла только из батареек (питание), проводов, кнопок и не содержала никаких микросхем! Шина данных там была 8-разрядная. Каждая запись в LCD состояла из одной операции записи. Элементарные цветовые пиксели кодировались каждый своим целым байтом. Команды для инициализации приходилось набирать перемычками. Всего команд для запуска дисплея нужно было штуки три, и это было не трудно. И все получилось! С описываемым в данной статье LCD такой фокус бы не прошел.
Рассмотрим основные принципы программирования LCD. Сигнал аппаратного сброса (вывод 28 LCD) может быть полностью аппаратным, или же, как в нашем случае, - программно управляемым. Работа с LCD начинается с подачи активного логического уровня на вход сброса, после чего данный сигнал возвращается в неактивное состояние. Далее программное взаимодействие с LCD состоит из операций записи в него и чтения из него. В самом простом случае можно обойтись только операциями записи. Так и сделано в рассматриваемом примере.
Теперь подробнее об особенностях данного LCD, которые необходимо учитывать при его программировании. Прежде всего необходимо знать, что запись любой информации в данный LCD выполняется в два этапа. Это позволяет передать 18 бит через 9-разрядную шину данных. Никаких специальных переключателей, позволяющих отличить первую половину данных от второй, не предусмотрено. "Склеивание" 18-разрядного слова происходит внутри дисплея автоматически. Нужно лишь соблюдать последовательность - первыми идут старшие биты, затем - младшие. Далее, чтобы избежать путаницы, будем называть такую двойную запись полным циклом записи (ПЦЗ).
Различают передачу в LCD команд и данных. Аппаратно эти два вида ПЦЗ четко разделены при помощи сигнала "RS" (вывод 5 дисплея). Данные тоже различаются: в зависимости от ранее переданной команды это могут быть установки режимов и настроек, либо отображаемые на экране графические данные. Во втором случае данные можно передавать многократно, не повторяя ввод команды, - внутренний счетчик адреса LCD после каждого ПЦЗ автоматически увеличивается на единицу, что выглядит на экране, как переход к следующей RGB-триаде элементарных пикселей.
Что бы мы ни пытались сообщить дисплею, первым всегда идет ПЦЗ команды. По-другому это еще называют записью в индексный регистр. Код, который мы заносим в этот регистр по сути является номером одного из регистров, предназначенных для приема данных. Это значит, что заполняя индексный регистр (передавая команду), мы сообщаем тому или иному регистру данных, что последующая запись данных будет производиться в него. После ПЦЗ команды выполняется один или множество ПЦЗ данных. LCD различает запись данных и запись команд с помощью своего 5-го вывода (RS), устанавливаемого в состояние логического нуля при записи команд, и в состояние логической единицы - при записи данных. Вот, собственно, и все, что касается общего подхода к программированию LCD, но есть свои особенности в распределении разрядов 18-разрядного слова внутри ПЦЗ.
Возьмем, к примеру, ПЦЗ в индексный регистр. Этот регистр в действительности использует всего 7 бит. Обратите внимание на рисунок, показывающий соответствие между передаваемой информацией и записываемой в регистр.
Данные для той или иной команды являются 16-разрядными (кроме графических). На следующем рисунке показано, как передаваемые за один ПЦЗ 18 разрядов "упаковываются" в 16-разрядный регистр данных.
И, наконец, передача в LCD одного полного RGB-пикселя (триады) также не лишена особенностей. Данные одной триады передаются за один ПЦЗ. На рисунке показано кодирование триады (18 бит = 6 бит "R" + 6 бит "G" + 6 бит "B").
Желающие могут скачать RAR-архив программы (471 Кб). Написана она в виде скрипта (файл "Тест LCD 240RGBx320.pms" в папке "PMS"), для исполнения которого требуется интерпретатор, входящий в состав программы "Перпетуум М". Получить "Перпетуум М" (6 Мб) также можно по прямой ссылке. Таким образом должно получиться два архивных файла. Установка программного обеспечения сводится лишь к созданию новой папки на жестком диске и распаковке в нее содержимого обоих архивов. После этого можно запускать файл perpetuum.exe
Программа (скрипт) содержит функции эмуляции интерфейса LCD, алгоритм инициализации дисплея и тесты, два из которых заполняют экран черными и белыми полями, а третий выводит картинку. Просматривать и изменять данную программу можно с помощью обычного текстового редактора. Перед первым запуском программы уточните в диспетчере устройств Windows имя используемого порта и, при необходимости, внесите соответствующую поправку в текст скрипта (строка: "ИмяПорта='COM4';" - вместо цифры 4 может стоять другая цифра). Также при использовании другой модели конвертера USB-RS232TTL может потребоваться изменение настроек инвертирования сигналов (строки скрипта, начинающиеся со слова "Высокий"). Проверить инвертирование сигналов конвертером USB-RS232TTL можно с помощью одного из примеров, содержащегося в инструкции к программе "Перпетуум М" (раздел функций для работы с портом).
Здесь также можно найти таблицу инструкций LCD c драйвером S6D0129. Эта таблица поможет разобраться в режимах и настройках дисплея.
Кроме PL-2303 существуют и другие микросхемы, на которых создаются конвертеры интерфейса, подобные использованному в данной разработке. Читайте описание ещё одного преобразователя USB-UART (на микросхеме CH340G) и о его доработке до полноценного USB-RS232TTL.
Комментарии по данной статье можно оставлять в гостевой книге.
Сообщения из гостевой книги по данной статье
08.11.2015 14:53
Eugene
Добрый день!!! Подскажите пожалуйста какие уровни на экране. Не сгорит ли он если я подключу на 3.3 вольта шину данных???
Заранее спасибо.
P.S. Допустимый суммарный ток подсветки до 60 мА (по 15 мА на светодиод). Резисторы R30..R33 470 Ом создают щадящий режим. Для получения большей яркости их можно уменьшить.
18.09.2015 10:53
Владимир
Добрый день. Спасибо за обширную статью по дешевому дисплею. Данный дисплей(или ему подобные) заинтересовал и очень хотелось увидеть на видео как он работает в динамике, смена картинок или текста, ну если это возможно, в любом случае огромное спасибо за полные разъяснения принципа работы, подключения и программирования. На страницу попал случайно, но проекты очень интересные.