Подключение дисплеев от телефонов к микроконтроллеру
В процессе приобретения новых навыков и расширения сферы своих интересов, новоявленный специалист по встраиваемым системам, а попросту - разработчик схем на микроконтроллерах, сталкивается с необходимостью отображения большого количества разноплановой информации. Первые радостные впечатления при освоении алфавитно-символьных индикаторов на основе HD44780 и графических индикаторов WG12864A постепенно угасают, т.к. первые обладают лишь минимумом возможностей, а вторые, несмотря на их "продвинутость", обладают излишней громоздкостью и являются монохромными, да и цена на них тоже немаленькая.
Также и меня когда-то посетили такие мысли, и я стал искать альтернативу, пока не попался на глаза форум, где такие же радиолюбители рассматривали вопросы по применению различных дисплеев от мобильных телефонов.
Когда-то, самым первым моим телефоном был Siemens A50, вторым - Siemens A60, и если первый ещё в здравом уме и доброй памяти, от второго остался только корпус и дисплей, который было решено приобщить к делу. Анализ данной проблемы показал, что в многочисленных любительских конструкциях хит-парад держат экраны от Nokia и от телефона Siemens S65, другим же дисплеям, которые ещё несложно найти (по сравнению с тем же Siemens S65) и применить для своих целей, уделено недостаточно внимания.
Являясь одно время владельцем двух телефонов Siemens, решил уделить внимание дисплеям этой некогда популярной фирмы. Основным критерием выбора типа дисплея стали: 1) дисплей должен быть цветным; 2) простота применения в электронных конструкциях; 3) доступность и относительная низкая стоимость.
После поиска и изучения информации о типе применяемого дисплея, способа его управления и анализа разных кодов была написана библиотека на С, полностью удовлетворяющая мои скромные запросы.
Итак, целью данной статьи является рассмотрение вопроса применения дисплея LPH8731-3C (контроллер EPSON S1D15G14), который применялся в телефонах Siemens A60, C60, М55, MC60, S55, и которые ещё не сложно найти на барахолках или в центрах ремонта мобильной связи. Контроллер, применяемый в данном дисплее, присутствует также в дисплее LPH 9116-1 (телефоны Siemens A75), из чего следует, что команды для работы с данным индикатором идентичны.
Вообще, в телефонах Siemens A60, C60, М55, MC60, S55 применялись три типа дисплея - LPH8731-3C, LM15SGFNZ07 (контроллер Hynix HM17CM4101) и реже - LM15SGFNZ04. Разрешение всех данных дисплеев составляет 101х80 пикселей, что, при использовании библиотеки символов разрешением 5х8 пикселей, даёт возможность выводить текстовую информацию на 10 строк по 16 символов.
Дисплеи LPH8731-3C и LM15SGFNZ07:
У всех дисплеев разные контроллеры, поэтому и библиотека для работы с ними будет отличаться.
Распиновка дисплея LPH8731 - 3C:
1 - CS – Chip Select. При установке в «0» контроллер дисплея принимает информацию;
2 - RESET – вывод для сброса контроллера;
3 - RS – вывод для определения типа передаваемых данных («0» - команда, «1» - данные);
4 - CLK – вывод тактового сигнала для передачи данных;
5 - DAT – вывод передачи данных;
6 - VDD – к источнику питания от +1.6V до +3.6V;
7 - GND – общий провод (земля);
8 - LED_1A – вывод питания подсветки;
9 - LED_К – вывод катодов светодиодов подсветки (к GND);
10 - LED_2A – вывод питания подсветки.
Сопряжение дисплея с микроконтроллером можно сделать следующим образом:
Для универсальности, свои дисплеи я оформляю в виде модулей, которые легко подключить напрямую к портам микроконтроллера. Немного громоздко, но, на мой взгляд, удобно.
Кому пришлась по душе такая конструкция, в архиве может найти чертёж печатной платы в формате PCB Layout.
Библиотека работы с LPH8731-3C разрабатывалась для работы с компилятором CVAVR и содержит следующие пользовательские функции:
1. void LCD_init ()
2. void Put_Pixel (char x, char y, unsigned int color)
Функция вывода точки (пикселя). x и y – координаты экрана, где будет отображён пиксель цветом color.
3. void LCD_Putchar (char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
Функция вывода одного символа ASCII-кода. Данная функция рассчитана на вывод символов размером 5х8 пикселей, библиотека которых находится в файле Symbols.h. symbol – выводимый на экран символ в ASCII-кодировке; x и y – начальная координата вывода символа; t_color – цвет пикселя; b_color – цвет фона; переменные zoom_width и zoom_height увеличивают символ на экране в указанное число раз; rot – угол поворота текста (0º , 90º, 180º, 270º).
4. void LCD_Putchar_Shadow (char symbol, char x, char y, int t_color, char zoom_width, char zoom_height, int rot)
То же, что и 3, только без цвета фона.
5. void LCD_Puts(char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
Функция вывода строки, расположенной в ram-памяти микроконтроллера. x и y - координаты пикселя начала вывода строки. .
6. void LCD_Puts_Shadow (char *str, int x, int y, int t_color, char zoom_width, char zoom_height, int rot)
То же, что и 5, только без цвета фона.
7. void LCD_Putsf(flash char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
Функция вывода строки, расположенной во flash-памяти микроконтроллера.
8. void LCD_Putsf_Shadow (flash char *str, int x, int y, int t_color, char zoom_width, char zoom_height, int rot)
То же, что и 7, только без цвета фона.
9. void LCD_FillScreen (unsigned int color)
Функция заливки экрана цветом color.
10. void LCD_Output_image (char x, char y, char width, char height, flash char *img, int rot)
Функция вывода картинки. x и y начальная позиция выводимого на экран изображения; width и height – ширина и высота изображения (в пикселях); *img – указатель на массив данных, составляющих изображение; rot – угол поворота изображения (0º , 90º, 180º, 270º). Данная функция предполагает, что массив данных изображения расположен во flash-памяти микроконтроллера. Для преобразования необходимого вам изображения в массив, содержащий цвет пикселей, можно воспользоваться программами Image2Lcd или Nokia Image Creator, которые несложно найти на просторах интернета. Единственное требование – направление вывода массива изображения должно выполняться слева-направо, сверху-вниз! При использовании 12-ти битной палитры, при преобразовании изображения в массив типа char, обязательно старший байт должен идти первым!
11. void LCD_DrawLine (char x1, char y1, char x2, char y2, int color)
Нарисовать линию. x1 и y1 – начальная позиция линии; x2 и y2 – конечная позиция линии.
12. void LCD_DrawRect (char x1, char y1, char width, char height, char size, int color)
Нарисовать рамку. size - толщина рамки.
13. void LCD_FillRect (char x1, char y1, char width, char height, int color);
14. void LCD_DrawCircle (char xcenter, char ycenter, char rad, int color);
Нарисовать окружность. rad – радиус окружности в пикселях.
15. void LCD_FillCircle (char xcenter, char ycenter, char rad, int color);
Нарисовать круг, заполненный цветом color.
16. void LCD_DrawTriangle (char x1, char y1, char x2, char y2, char x3, char y3, int color)
Нарисовать контуры треугольника.
17. void LCD_FillTriangle (char x1, char y1, char x2, char y2, char x3, char y3, int color)
Нарисовать треугольник, заполненный цветом color.
Дисплей LPH8731-3C даёт возможность работать с двумя цветовыми палитрами – 256 цветов и 4096 цветов. В первом случае цвет одного пикселя задаётся 8 битами, во втором - 12 битами.
В самом начале библиотеки, если объявлен макрос _8_BIT_COLOR, то цветовая палитра дисплея будет составлять 256 цветов, иначе - 4096 цветов. Макрос _GEOMETRICAL позволяет использовать функции вывода линии, рамки, прямоугольника и окружности.
Дисплей в составе работы COM-терминала:
Для тех, кто хочет выжать «все соки» из данного дисплея, для скачивания прилагается Datasheet на контроллер.
Почитать про азы управления данным индикатором можно в статье "Простенькие часики на MSP430".
Версия библиотеки для LPH8731-3C обновлена до версии v 1.1.
Просьба обновить скачанные Вами файлы библиотеки для LPH8731-3C, т.к. в новой версии исправлены ошибки в функциях работы с 12-битной палитрой и расширен функционал, аналогично библиотеке для LPH9157-2.
Рис. 1. Преобразователь напряжения.
Рис. 2. Временная диаграмма передачи данных в LCD.
На рис. 2 показана самая «крупномасштабная» временная диаграмма передачи данных, изображающая передачу данных одной строки изображения. Передача происходит по фронту сигнала CLK, и сопровождается высоким уровнем сигнала разрешения данных DEN. Передача происходит в формате RGB, при этом биты Data0 — Data7 соответствуют синему цвету, Data8 — Data15 — зеленому, Data16-Data23 — красному.
Перед передачей данных строки и после передачи данных вставляются «пустые», не несущие информации импульсы CLK. Передача строки предваряется импульсом горизонтальной синхронизации HSYNC (LCD_LP).
Тактовая частота индикатора составляет 6,4 МГц (её можно уменьшить, но тогда становится заметным мерцание кадров).
Рис. 3. Временная диаграмма передачи кадра в LCD
Временная диаграмма передачи полного кадра в LCD показана на рис. 3. Передача кадра начинается с 13 «пустых» строк, далее следуют 240 строк с изображением, после которых опять идут «пустые» строки. Передача кадра начинается с импульса вертикальной синхронизации.
Также подключим к микроконтроллеру резистивный сенсор. Описание этого подключения будет приведено ниже.
Полную схему подключения индикатора к микроконтроллеру я приводить не буду, в силу ее очевидности, приведу лишь таблицу соответствия выводов индикатора и пинов контроллера.
Таблица 1. Соответствие сигналов LCD и выводов контроллера
Рис. 4. Платы макета устройства
Рис. 5. Макет устройства (частично собран)
Рис. 6. Макет устройства в сборе
Теперь, когда всё подключено, можно приступить к написанию кода. Первое, что нужно сделать, это сконфигурировать и протестировать внешнюю SRAM память:
Теперь записываем в ROM тестовую картинку и копируем ее в RAM:
Рис 7. Тестовая картинка
Рис. 8. Результат работы.
Подключение резистивного сенсора
Рис. 9. Схема подключения резистивного сенсора к микроконтроллеру.
Идея, лежащая в основе такого подключения, состоит в следующем. Каждый вывод микроконтроллера может находиться в одном из следующих состояний: выход с логическим 0, выход с лог. 1, вход (т. е., фактически, неподключенный вывод), и вход, подтянутый к напряжению питания через резистор. Выводы YU и XL могут также служить входами АЦП.
Вся процедура определения координат нажатия может быть условно разделена на три фазы. В первой фазе выводы, к которым подключен сенсор, находятся в следующем состоянии: (рис. 10).
Рис. 10. Определение координат нажатия. Фаза 1.
При замыкании пленок сенсора на вход микроконтроллера поступает сигнал лог. 0, и программа переходит к фазе 2, определению x-координаты нажатия (рис. 11). Затем следует фаза 3, определение y-координаты. (рис. 12).
Популярные в своё время сотовые телефоны фирмы Nokia, такие модели, как 3210 3310 3315 3330 3350 3410 5110 5120 5130 5160 6150 6210, обладали монохромными графическими дисплеями, с экраном 84x48 точек, на базе контроллера PCD8544.
Времена этих телефонов прошли, но дисплеи не канули в Лету, они оказались чрезвычайно удобным и дешёвым вариантом для вывода графической и текстовой информации, при использовании в сочетании с микроконтроллерами.
Сейчас на ebay можно за порядка 100 рублей (вместе с доставкой)купить такой дисплей, установленный на печатную плату 45х45мм, которая также обеспечивает подсветку.
О подключении таких дисплеев, на базе контроллера PCD8544, и пойдёт речь ниже.
О контроллере
Контроллер PCD8544 разработан фирмой PHILIPS. Документацию на него можно скачать здесь
Одной из особенностей этого контроллера является то, что информация может быть только выведена на дисплей, но не считана с него. В частности, это накладывает два ограничения:
— Нет возможности узнать состояние дисплея, в т.ч. и вообще факт его присутствия программными средствами. Это требует точного соблюдения таймингов при выводе информации. К счастью контроллер может работать на достаточно большой скорости и это не является проблемой.
— Невозможно работать с изображением в режиме «чтение-изменение-запись». Вывод сложного изображения, где потребуется совмещение разной графической информации, может быть осуществлён только с использованием внеэкранного буфера, или предварительного полного расчёта совмещения изображений.
В то же время, контроллер обеспечивает крайне низкое энергопотребление: менее 300мкА (с типичными дисплеями Nokia) в рабочем режиме, и около 1.5мкА в режиме отключения.
Контроллер имеет встроенный генератор повышенного напряжения, поэтому отдельно подводить напряжение для питания дисплея не требуется.
Сам же контроллер работает при напряжении 2,7 – 3,3 Вольта.
Подключение
Подключение модуля дисплея на базе чипа PCD8544 к МК ATmega8AКак упоминалось выше, контроллер работает на напряжении 2,7 – 3,3 Вольта. Это значит что сопряжённый микроконтроллер должен либо работать на том же напряжении, либо же как-то согласовать уровни на выводах, например, при помощи делителей.
Кроме «земли» и «питания», к контроллеру дисплея должны идти 5 линий:
* SCLK — тактовый импульс для передачи данных.
* SDIN — передаваемые данные.
* D/C̅ — выбор типа передаваемых данных: высокий уровень — графические данные, низкий — инструкция.
* S̅C̅E̅ — выбор чипа. Передача данных осуществляется при низком уровне на этой линии. При высоком уровне данные игнорируются.
* R̅E̅S̅ — сброс. При низком уровне происходит аппаратный сброс контроллера.
Поскольку, согласно спецификации (см п.8.1) аппаратный сброс является необходимым для инициализации дисплея, линия R̅E̅S̅ также должна быть подключена.
В принципе, линия S̅C̅E̅ может быть притянута постоянно к земле, но в этом случае, если по какой либо причине контроллер дисплея потерял синхронизацию с МК, это никак не удастся обнаружить. При подключении к МК, рекомендую притягивать эту линию к высокому уровню подтягивающим резистором 100-500кОм, чтобы исключить реакцию контроллера на помехи, пока МК находится в состоянии сброса.
Передача осуществляется по протоколу SPI, но только в одном направлении. При работе с микроконтроллерами AVR, удобно использовать USART в режиме SPI-master, когда включен только передатчик. Режим SPI-3 (CPHA=1, CPOL=1). Это значит, что пока обмен отсутствует, на линии SCLK должен присутствовать высокий уровень, а чтение данных с линии SDIN контроллер осуществляет по нарастающему фронту на линии SCLK в течение 100нс. При этом они должны быть выставлены минимум за 100 нс до нарастания фронта. Передача осуществляется по 8 бит, сначала старший.
Уровень на линии D/C̅ определяет, как трактовать полученные данные. Высокий уровень означает, что переданные данные должны быть выведены на дисплей, низкий уровень – что передана команда. Контроллер читает значение на этой линии вместе с последним (младшим) битом каждого переданного байта данных. При использовании асинхронной аппаратной передачи с этим могут возникнуть трудности. Перед установкой уровня необходимо дождаться завершения передачи предыдущего байта.
Максимальная частота, на которой может осуществляться обмен с PCD8544 – 4 МГц. При программном формировании импульсов это, обычно не является проблемой, но при использовании аппаратной передачи, в случае если частота работы МК превышает 8МГц, следует ограничить максимальную скорость передачи.
Кроме линий передачи данных, на модуле с дисплеем обычно присутствует вход управления подсветкой, соединённый с катодом светодиодов. Аноды же через ограничивающие резисторы подключены к линии питания. Для постоянно работающей подсветки можно данный вход подключить напрямую, или через резистор к «земле». Для управления от МК подсветка может быть подключена через транзистор. Поскольку подсветка потребляет менее 20мА, при подключении к МК AVR возможно также подключать её напрямую к выводу МК.
Команды контроллера
См. раздел 8 спецификации
Команды передаются контроллеру дисплея, когда на линии D/C̅ низкий уровень.
Контроллер работает с двумя наборами команд: обычным и расширенным.
Команда 00100PVH присутствует в обоих наборах команд. Значение бита H определяет какой набор команд будет использоваться: 0 – обычный, 1 – расширенный. Установленный бит P означает режим отключения (power-down). V – выбирает режим адресации: 1 – вертикальная, 0 – горизонтальная.
Обычный набор команд
Обычный набор команд выбирается после передачи 00100PV0 (см. выше)
В нём присутствуют команды:
Команда 00001D0E — выбирает режим работы дисплея. E – признак инверсии изображения. D – признак вывода изображения. Если D = 0, дисплей либо полностью очищен (E = 0), либо полностью чёрный (E = 1)
Команда 01000yyy, или 0x40 + y — выбор номера строки (страницы) на которую выводится изображение. Где y = 0 – самая верхняя строка, 5 – самая нижняя. Строка имеет высоту 8 пикслей.
Команда 1xxxxxxx, или 0x80 + x — выбор горизонтальной позиции в текущей строке, куда будет выводиться изображение. Где x = 0 – самая левая позиции, 83 – самая правая.
Расширенный набор команд
Расширенный набор команд выбирается после передачи 00100PV1 (см. выше)
В нём присутствуют команды:
Команда 000001tt, или 0x04 + t — выбор одного из четырёх режимов температурной коррекции. В зависимости от режима будет по-разному изменяться напряжение дисплея в зависимости от температуры.
Команда 00010bbb, или 0x10 + b — выбор одного из восьми режимов расчёта смещения уровней для управления LCD. Для обычных дисплеев от Nokia рекомендуется режим 0001011, или 0x13
Команда 1vvvvvvv, или 0x80 + v — выбор напряжения на генераторе повышенного напряжения для LCD. При v = 0 генератор отключен. Выходное напряжение рассчитывается по формуле (см. спецификацию п.8.9): Vlcd = 3.06 В + v * 0.06 В.
В зависимости от выбора способа коррекции напряжения, это значение изменяется в зависимости от температуры. Чтобы не повредить дисплей при низких температурах, рекомендуется чтобы это значение не превышало 8.5 Вольт, т.е. v <= 90.
Для обычных дисплеев Nokia это нормальное рабочее значение этого параметра примерно равно 56, т.е. команда принимает вид 10111000, или 0xB8.
Инициализация дисплея
Инициализация должна быть выполнена в течении 30мс после появления питания.
Дисплей инициализируется следующей последовательностью:
1. Выполнить аппаратный сброс, установив на линии R̅E̅S̅ низкий уровень минимум на 100нс;
2. Включить дисплей и выбрать расширенный набор команд, послав 0x21;
3. Установить схему смещения напряжения, команда 0x13;
4. Установить режим температурной коррекции, команда 0x04;
5. Включить генератор повышенного напряжения на уровне 6.42 Вольта, команда 0xB8;
6. Вернуться в стандартный набор команд, послав 0x20;
7. Включить вывод графической информации на дисплей командой 0x0C.
После этой последовательности дисплей готов к работе.
Вывод графической информации
Дисплей имеет размер 84х48 пикселей. Информация выводится вертикальными блоками высотой 8 пикселей, значения которых определяются значениями бит в выводимом байте. Младший бит кодирует верхний пиксель.
Таким образом, графическая область дисплея представлена в виде шести строк, каждая по 8 пикселей в высоту.
Команды 1xxxxxxx и 01000yyy определяют координаты курсора — строку и позицию, в которых будет отображены следующие 8 бит данных. После того как байт выведен, курсор смещается на соседнюю позицию.
Если командой 00100PVH выбран горизонтальный режим адресации (V = 0), то курсор смещается вправо и следующий байт данных будет отображён на соседней позиции справа. Когда достигнут правый край экрана, курсор перемещается на начало следующей строки. Если же выбрана вертикальная адресация (V = 1), то курсор смещается вниз, на следующую строку, а после последней строки курсор смещается на одну горизонтальную позицию вправо и устанавливается на верхнюю строку.
Пример кода
В работе выглядит вот так:
В настоящее время для радиолюбителей стали весьма доступны недорогие и качественные дисплеи от (для) мобильных телефонов. Для конкретной возможности применения одного из них в различных радиолюбительских конструкциях автором создан модуль, описание которого приведено в этой статье. Автор не считает свою разработку идеальной, но надеется, что этот модуль будет востребован радиолюбителями. Советы и рекомендации по его улучшению принимаются.Чтобы использовать в своей конструкции миниатюрное цветной дисплей, совсем не нужны особо мощные процессоры или дорогостоящие дисплеи. Если нужен размер экрана порядка 2.5”, то можно применить дисплеи от телефона. Например, LS022-LS024 от телефонов NOKIA N76, N82, N73, 6303, 6500. Подойдет и самый большой дисплей от N95 (2.6”).
Все эти дисплеи оснащены котроллером, имеющим небольшой, но достаточно полный, набор команд. Даташит на контроллер дисплея MC2PA8201, который является аналогом LS022-LS024 прилагается. Правда, не все функции 100% работают, как описано.
Дисплей имеет разрешение 240х320 пикселей и цветовую гамму 24 бит. Стоимость от 200 рублей. Разъём со шлейфом стоит столько же. Оборванный шлейф в ремонте могут отдать бесплатно. Известную трудность представляет только его пайка и изготовление под него платы.
Дисплей имеет три напряжения питания: 1,8 В, 2,5 В и 12 В. Последнее подается на подсветку через ограничивающий резистор. Ток подсветки примерно равен 20 мА. Распиновка разъёма N76 показана рис.1.
Сам этот разъем выглядит так:
Примеров работы с этим дисплеем в сети имеется достаточно много. Используя их, я разработал и собрал модуль как заготовку для создания своего графического интерфейса. Схема модуля приведена на рис.2.
Основой модуля является распространенный микроконтроллер PIC18F452. Программа для него написана на Си.
Для питания дисплея я применил два стабилизатора LM1117 на соответствующее напряжение. Номинальное напряжение на сигнальных линиях 1,8 В.
При упрощённом подключении (через делитель на резисторах), которое я использовал для согласования уровней выходных сигналов МК и входных дисплея, невозможно чтение из памяти дисплея, но это и не понадобилось. Однако, при желании, можно применить более правильное согласование этих уровней.
Индуктивности в цепях питания, использованные в схеме телефона, думаю, можно проигнорировать, так как в телефоне применены импульсные преобразователи питания, а у меня линейные.
Достоинство рассматриваемого дисплея, как и его проблема, заключается в 24-битном цвете. То есть для вывода 1 пикселя надо передать 5 байт, что снижает скорость вывода и требует приличных объёмов для хранения изображений. Поэтому тактовую частоту процессора надо стараться выбирать как можно выше. Я использовал 40 МГц. При этом скорость рисования вполне устраивает, а скорость вывода картинки маловата. Как вариант, можно на время прорисовки больших заставок гасить экран.
Изображения, заставки, значки решил хранить на microSD-карточке. Небольшие сейчас мало где продаются, но стоят совсем копейки, объёма хватит с запасом, а удобство заключается в лёгкости редактирования отображаемых элементов прямо на компьютере в виде .bmp файлов. В последующем, карточку можно использовать также для записи, например, лога каких-нибудь событий.
В прилагаемой программе имеется библиотека необходимых графических функций (описанная в файле LS_driver.h):
- вывод точки;
- вывод символа;
- вывод текста;
- вывод байта значения;
- рисование линии;
- рисование прямоугольника (с заливкой или без нее);
- рисование круга;
- рисование окошка типа WINDOWS;
- чтение из карточки и вывод рисунка .BMP 24bit/pix
Детальные инструкции по функциям расписаны в файле LS_driver.h, и особо не требуют пояснений, за исключением 2-х моментов.
- При выводе картинки следует придерживаться вертикальной ориентации экрана (сам файл картинки предварительно развернуть в редакторе).
- При выводе файлов и рисовании картинок следует учитывать размеры экрана. Значения Х и Y меняются местами при изменении текущей ориентировки вывода с горизонтальной на вертикальную и наоборот, поэтому проверка на превышение размеров не производится (не известен текущий максимум Х или Y).
Всё это, конечно, давно известно, но я попробовал собрать в кучу.
Получился более-менее универсальный модуль, который можно встроить в готовую или разрабатываемую конструкцию.
В интерфейсе карточки заблокированы необязательные, на мой взгляд, функции: работа с директориями, запись, поддержка FAT32, но их можно включить в любой момент.
В качестве примера приведено рисование вертикальной шкалы в зависимости от значения АЦП (см. заглавное фото). В верхней части экрана выведена картинка – заставка.
Читайте также: