Наверное, значительная часть моих читателей так или иначе интересуется темой DIY. Кроме того, различным самодельным устройствам может потребоваться отображение некоторой информации на дисплее, например текста, графики или какого-либо типа анимации. Для разных задач существуют разные дисплеи. В сегодняшнем материале мы хотели бы систематизировать и собрать подробное руководство по использованию дисплея нерабочего мобильного телефона. Какие протоколы и шины данных есть, как прочитать схему устройства и определить контроллер дисплея, какие дисплеи стандартизированы, какие нужно переворачивать самому, что делать с подсветкой и т.д. В практической части статьи мы будем использовать протокол MIPI DBI для подключения дисплея к RP2040 с помощью DMA интересный? Так что добро пожаловать в статью!
❯ Виды дисплеев и их протоколы
Пожалуй, с момента своего появления ЖК-дисплеи стали основным инструментом отображения информации и взаимодействия с пользователями. Первые ЖК-панели были монохромными и требовали отдельного драйвера, отвечавшего за вывод изображения на экран и формирование напряжения, необходимого для его работы.
Все стало намного проще и теперь каждый, кто любит электронику своими руками, может подключить дисплей к своим проектам и использовать его в любых целях. Неудивительно, что десятки библиотек типа AdaFruit LCD созданы для упрощения задачи программиста и выполнения готовых простых операций типа «нарисовать линию» или «нарисовать изображение». Это дает вам такую возможность. Однако хотя готовые библиотеки, конечно, хороши, не всегда можно понять, как такие дисплеи работают на программном и аппаратном уровне. Об этом расскажет первая часть статьи.
В мире матриц дисплеев существует несколько общепринятых аппаратных протоколов. Некоторые из них легко использовать в собственных проектах с помощью микроконтроллера, но другие требуют некоторой доработки:
-
Параллельная шина 8080 — одна из самых простых и понятных шин данных как в теории, так и на практике. Суть его очень проста. Каждому биту назначается одна сигнальная линия плюс две дополнительные линии для сообщения о состоянии передачи. RD означает запрос на чтение, а WR означает запрос на запись. Большинство дисплеев используют девятый неявный бит D/C, чтобы сообщить контроллеру, указываете ли вы номер команды или уже записали аргументы для этой команды. Самое приятное то, что шина по сути стандартизирована, и для многих дисплеев ID-контроллер получает команду на начало записи в видеопамять идентично. Шина может быть 8-битной или 16-битной (ее состояние задается битами IM0..IM2 и используется не только для дисплеев, но и для параллельного подключения микросхем флэш-памяти, оперативной памяти и т д.) до 480х320.
-
SPI — это шина, с которой наверняка знакомо большинство наших читателей. Это очень просто. Имеется две сигнальные линии с входными (MISO) и выходными (MOSI) битами, а также тактовый сигнал, который координирует передачу данных. Итак, мы знаем, что автобус полнодуплексный. Фактически каждый байт пересылается по одному биту по одной сигнальной линии, поэтому по сравнению с 8080 необходимо увеличить тактовую частоту SPI-контроллера, но при этом значительно увеличивается количество выводов, используемых MCU или самим процессором. Это будет меньше. С программной точки зрения большинство дисплеев, продаваемых в различных интернет-магазинах, полностью совместимы с дисплеями 8080, поскольку SPI — это лишь один из режимов работы. Единственное предостережение: не всегда возможно вычесть идентификатор контроллера из дисплея SPI или прочитать что-либо из регистров дисплея.
-
Шина I2C относительно редко используется для дисплеев из-за своей низкой производительности, но она все равно очень подходит для микроконтроллеров (так как использует только две сигнальные линии: SDA для данных и SCL для тактовой частоты). Даже выбор чипа здесь программный, потому что: Дело в том, что у каждого устройства есть свой адрес!), но именно это можно увидеть на дисплеях некоторых мобильных телефонов начала 2000-х.
-
TTL/Parallel RGB — Вообще меня несколько раз критиковали за то, что я продолжаю называть это TTL, но исторически сложилось так, и в даташитах эта шина тоже упоминается как таковая. С логической точки зрения это очень просто. Имеется 16/24 сигнальных линий, из которых 5 (или 8) бит используются для красного и синего каналов, а 6 (или 8) бит используются для зеленого цвета. 16-битный цвет имеет RGB565, а 24-битный цвет — RGB888). Он поставляется с сигналом HSYNC для горизонтальной синхронизации и сигналом VSYNC для вертикальной синхронизации. В общем, вам не обязательно использовать все сигнальные линии, которые предоставляет ваш дисплей. Например, вы можете использовать RGB332 и использовать только 8 сигнальных линий. Однако для отображения изображения необходимо строго соблюдать время синхронизации, иначе дисплей просто побелеет. Помимо цифровой версии, существует также аналоговая версия, очень похожая на RGB или VGA на телевизоре. Такие дисплеи обычно используются для матриц до 1024х768.
-
MIPI DSI — это протокол, используемый для дисплеев с высоким разрешением 480x800 и выше и включенный в большинство современных смартфонов и планшетов. Кроме того, в таких дисплеях используется относительно мало контактов: по два на каждый канал LVDS (обычно около 2-4 каналов на смартфоне) + две сигнальные линии для тактирования. Все ли звучит хорошо? Это не так. Протокол является дифференциальным, с двумя сигнальными линиями (одна положительная и одна отрицательная) для каждого канала (т е логический бит). Затем одно вычитается из другого, чтобы получить окончательный сигнал. Это сделано для уменьшения помех при передаче данных по нескольким линиям на очень высоких тактовых частотах без увеличения разрядности шины.
-
LVDS/eDP — протокол, используемый в матрицах ноутбуков, телевизоров и иногда планшетов. На физическом уровне это близко к DSI, а на программном уровне, честно говоря, не знаю, но слышал о какой-то стандартизации и высоком уровне совместимости. Даже «неродные» матрицы ноутбуков, даже с разным разрешением дисплея, после прошивки родного EEPROM загружаются очень хорошо!
В приведенном выше списке мы рассмотрели некоторые распространенные аппаратные шины дисплея. В этой статье мы разберемся с программными возможностями таких дисплеев и выясним, где можно приобрести один из типов дисплеев SPI, I2C и 8080.
❯ Виды дисплеев и их протоколы
Возможно, было бы плохой практикой писать статью, содержащую только готовые примеры, без объяснения «внутреннего» принципа работы. Поэтому предлагаем немного разобраться в системе команд наиболее распространенных современных контроллеров дисплеев.
Поскольку рассматриваемые нами дисплеи имеют собственную видеопамять, нам не нужно соблюдать тайминг, а также мы не можем писать общий набор команд (или аппаратных регистров) для изменения поведения дисплея. Если просто включить дисплей и попытаться что-то вывести, ничего не получится. Это связано с тем, что для каждого аппаратного сброса состояние большинства регистров, кроме SleepOn и PowerOn, не определено и может содержать «мусор». Чтобы дисплей работал правильно, он должен отправить определенный набор команд, называемый инициализацией, который настраивает параметры драйвера дисплея, такие как контрастность, настройки цвета и направление, в котором изображение сканируется из видеопамяти. Некоторые люди называют это командой display Register, и это означает то же самое!
Пример инициализации. На самом деле, никто не особо беспокоится об удалении функции чтения/записи регистров дисплея. Это потому, что он потребляет ценное ПЗУ. Например, AVR позволяет сохранять команды инициализации в ПЗУ и считывать их из PROGMEM.
Если дисплей инициализирован неправильно, вы можете наблюдать ложные сканирования, артефакты и полосы на дисплее. Если вы прошивали на свой смартфон другие версии прошивки, возможно, вы сами замечали аналогичный эффект.
Набор инструкций контроллера дисплея частично стандартизирован спецификацией MIPI DBI, которая описывает и назначает определенные адреса регистров, общие для всех контроллеров дисплея. Сюда входят, например, настройки «окна», такие как запись (0x2B и 0x2A), спящий режим (0x11) и т д. Собственные команды сохраняют настройки питания, сканирования, контрастности и самого драйвера дисплея. Ну не только все виды LUT, но и режимы палитры (если они есть) уникальны.
Вот пример одной из этих стандартизированных команд:
Почти все дисплеи разделяют байты и данные, отправляемые командам (или выбирают номера регистров для чтения/записи). Способ обработки текущего байта определяется другим выводом (или битом в зависимости от конфигурации дисплея), называемым D/C (данные/команда), также известным как RS. Обычно ЦОД должен быть низкого уровня для записи команды и высокого уровня для записи данных. Идея проста. Запишите номер команды (или регистр) на нижнем уровне D/C, затем добавьте необходимые аргументы (или конфигурацию регистра) на более высоком уровне D/C.
так:
Когда дело доходит до сброса настроек, дисплеи обычно выполняют два разных процесса. Аппаратный сброс с использованием соответствующих контактов и программный сброс с помощью специальных команд. Вывод RESET не следует оставлять «в воздухе» (т.е не подключенным) в надежде, что «на шине заведомо нет мусора, потому что состояние вывода МК после сброса известно». Мусора может и не быть, но дисплей будет находиться в состоянии постоянного сброса, поскольку он ожидает перехода сигнала RESET на высокий уровень. То же самое касается и вывода CS, отвечающего за выбор устройства на шине. Если вам не нужен CS и на шине висит только одно устройство, просто опустите его на землю. Некоторые контроллеры (например, ILI9325) хорошо реагируют на бортовую CS, а другие нет. Только после того, как RESET перейдет в высокий уровень, дисплей начнет принимать команды:
перейдем конкретно к выводу данных. Чтобы начать вывод изображений на дисплей, необходимо выполнить команду 0x2C. Это переводит контроллер дисплея в режим записи данных в видеопамять. После этого просто установите высокий уровень на контакте постоянного тока и отправьте непрерывный поток пикселей. Контроллер дисплея сам увеличивает координаты на дисплее, и когда координаты пересекают границы нужной области, дисплей сам преобразует координаты обратно в исходные координаты. Поэтому достаточно инициализировать дисплей только один раз и отправить на него данные, используя, например, DMA.
Все просто и понятно :)
❯ Дисплеи с шиной 8080
Эти дисплеи, вероятно, найти проще всего, поскольку в 2000-х годах они использовались на большинстве кнопочных телефонов. Такие экраны встречаются на многих моделях Nokia, Samsung, LG, Fly, Sony Ericsson и большинстве мобильных телефонов китайского производства. В поиске назначения контактов и разводки такого дисплея все относительно просто и в то же время сложно. Для некоторых моделей телефонов (например, почти всех Нокиа) в Гугле можно легко найти схему для определения распиновки дисплея. Разъём...но этот разъём предварительно надо выдуть и вывести на коммутационную плату, либо выдернуть перемычку под микроскопом. В некоторых случаях (например, серия Siemens S) дисплей просто прижимался к контактам на плате, а сами контакты выходили за пределы шага пайки.
Из схемы Nokia N70. Этот дисплей использовался во многих смартфонах Nokia Symbian того времени (N-Gage/N-Gage QD, N70, N72, 6600 и т д.
Однако дисплеи с паяемыми кабелями с большим шагом контактов могут оказаться особенно полезными. Они включены в некоторые телефоны Samsung и большинство китайских телефонов. Любопытный читатель может спросить: «Я знаю, что это на китайском, так где мне найти эту диаграмму?» И здесь нас радостно радуют китайские производители. Потому что, за редким исключением, такие дисплеи имеют стандартизированную распиновку. Я лично знаю 37-контактные, 39-контактные и 44-контактные матрицы. Как найти эти назначения контактов?Давайте напишем на "Arica" или "Taobao" 37-контактный LCD TFT и посмотрим. В описании продавцы часто указывают распиновку (хотя у 37-контактного нет контакта IM для регулировки ширины шины, а у 16-контактного нет распиновки) (обратите внимание, что такого нет) битовые интерфейсы могут быть энергоемкими с точки зрения количества контактов):
Если вы китаец, возможно, вы сможете найти схему вашего устройства (нажмите на зеленую стрелку). Например, почти для всех моделей Fly схемы есть в бесплатном доступе, и в большинстве случаев там можно найти распиновку дисплея. В некоторых случаях производитель выводит тестовые точки на всех сигнальных линиях, что позволяет пользоваться сенсорным дисплеем, не распаивая плату!
Расположение контактов Fly IQ239. Внизу изображения, конечно, видно, что такой большой дисплей еще можно купить за копейки :)
а вы когда-нибудь задумывались откуда взялись кнопки "домой", "сообщения" и "телефон" на сенсорном дисплее с надписью "али"? Именно такие использовались в "ноклесах" Это тот же самый дисплей, только припаянный к удобному доска. :) Кроме того, вы также можете легко найти технические характеристики дисплея на китайском языке. Обычно используются контроллеры ST или ILI, в зависимости от разрешения дисплея.
Кстати, об устройстве на фото выше есть отдельная статья. Там мы вам расскажем, что такие устройства нужно не снимать, а запчасти, ведь можно писать полноценные родные программы!
Концептуально аппаратная реализация протокола проста и ее может понять каждый. Программа устанавливает состояние каждого бита передаваемого байта на сигнальных линиях D0–D7 (D00–D15, если шина 16 бит).), затем просто «потяните» линию RD (чтение или чтение) или WR (запись или запись) при переходе от низкого к высокому. Это сообщает контроллеру дисплея, что он должен понимать байты (или слова, если байты). 16-битный интерфейс) от шины. Переход с высокого уровня на низкий переводит контроллер обратно в режим ожидания следующего байта от шины.
Где взять такой дисплей?Да почти везде! Но лучше всего приобретать дисплеи от китайцев. К этим коммутационным панелям можно прикрепить дисплеи, которые можно заказать в «Арике» за несколько сотен рублей.
Обратите внимание, как бессистемно распаяна подсветка на некоторых дисплеях. И это завод!
Обратите внимание: Ещё несколько отличных кнопочных телефонов.
Лучше позвонить прямо перед подачей еды. Забыл, надеялся на производителя и в итоге сгорела подсветка :(Другой вопрос, где искать информацию о них. Помимо схем, вы можете легко поискать на Алике «37-контактный TFT ЖК-дисплей», «39-контактный TFT-дисплей», «24-контактный TFT-дисплей» и т д. Обычно продавец сам указывает расположение булавок, а также прикладывает идентификатор контроллер дисплея. Тем не менее, иногда можно столкнуться с различиями в распиновке, поэтому обратите внимание, куда идут провода от подсветки и провода от резистивного тачскрина (если он у вас есть), и назовите все контакты землей. Это поможет вам выбрать правильную распиновку без всякой логики анализатор. Например, вот дисплей нерабочей китайской реплики Nokia 130 с рабочим дисплеем 2,4 дюйма. Кажется совершенно неочевидным, что это за дисплей, но проявите смекалку, чтобы найти расположение контактов!
❯ SPI-дисплеи
Дисплеи SPI в мобильных телефонах встречались относительно редко. В основном такие дисплеи были включены в модели начала 2000-х годов, такие как Siemens, Motorola, ранние автомобили Sony T-серии и Nokia S40. Современные кнопочные телефоны могут иметь дисплеи SPI. Обычно они поставляются с кабелями с числом контактов менее 15, как у некоторых моделей Fly. Контроллеры дисплея обычно поддерживают несколько аппаратных шин одновременно, и даже на этапе подключения кабеля к контроллеру дисплея производитель телефона выбирает необходимую шину и замыкает необходимые контакты IM, поэтому протокол программного обеспечения фактически такой же, как и дисплей. На автобусе 8080.
Несомненным преимуществом SPI-дисплеев является меньшее количество контактов для управления матрицей. Если вы установите RESET на VIO, достаточно только двух (также добавьте сигнал постоянного тока, если ваш дисплей не 9-битный). Или трех (или четырех) достаточно. Если вы хотите вручную управлять аппаратным сбросом. Однако есть и некоторые недостатки. Например, не все микроконтроллеры могут работать в 9-битном режиме и, возможно, последний бит приходится отправлять «без пинка» (что ухудшает возможность реализации DMA).
Многие дисплеи с таким интерфейсом описаны на известных форумах и сайтах, таких как VRTP, Radikot и easyelectronics, с начала 2000-х годов, поэтому проблем с подключением не возникнет даже у новичков. Даже крутые и уважаемые ребята, такие как @DIHALT, написали полезный материал об использовании FSMC с STM32.
Вы можете получить новый прямо сейчас. Иногда они продаются в различных магазинах запчастей для телефонов по 20-30-40 рублей... Я недавно себе купил целую коробку просто для ремонта смартфона для будущей статьи :)
❯ I2C-дисплеи
Дисплеи с такой шиной очень редки и обычно встречались на телефонах с меньшим разрешением дисплея начала 2000-х годов. Все, что я знаю, это Ericsson и ранние Sony Ericsson T-серии, ODM Motorola (головастики и т д.) и.. может быть, это все.
Как вы думаете, полезен ли I2C при работе с дисплеями, требующими активного вывода графики?Ведь он такой медленный! Однако в некоторых проектах это все же может быть полезно, и большинство МК часто сталкиваются с аппаратным TWI.
Кроме того, дисплей I2C полезен для отладки. Периферийное устройство должно сообщить ACK (успешное получение байта) главному устройству, чтобы оно могло немедленно определить, нарушена ли линия на дисплее. Но я не могу написать о них конкретную информацию - они все совершенно разные :(Но поделюсь полезной ссылкой. У участника VRTP-форума есть хорошая таблица про разные контроллеры дисплея, в том числе: I2c!
❯ Подсветка
Еще один вопрос касается темы подсветки дисплея. Поначалу может показаться, что здесь все просто. 5 В достаточно для современных дисплеев, но для старых дисплеев вы можете либо измерить добавочное напряжение с помощью работающего устройства и создать свой собственный повышающий преобразователь постоянного тока, либо использовать готовый драйвер, известный в некоторых кругах как LTYN, например. . На самом деле, здесь тоже есть свои нюансы.
Так как же реализована подсветка в данном устройстве?Как правило, реализация заключается в последовательном соединении двух и более светодиодов, образующих небольшую полоску под рассеивающей пленкой Masu. Современным китайским дисплеям для работы на максимальной яркости требуется всего лишь источник питания 5 В + токоограничивающий резистор. Но самое приятное то, что подсветка такого дисплея работает от напряжения 3,3 В, и она хоть и менее яркая, но все равно вполне читаема.
Если вы создаете портативное маломощное устройство, работающее от одной литий-ионной батареи, вам достаточно подать напряжение 3,3 В от линейного стабилизатора, формирующего напряжение VSYS для микроконтроллера. Это обеспечивает стабильную подсветку среднего уровня яркости. Как альтернативный «бомж» вариант, если собрать штатный драйвер подсветки не получается, можно попробовать подключить светодиоды напрямую к аккумулятору, но по мере разряда дисплей будет медленно «тускнуть». Еще один «плохой» вариант — разобрать модуль дисплея, вырезать дорожку на ленте, соединить пару светодиодов параллельно и вытащить светодиоды через отверстие, откуда выходит кабель дисплея. Однако это увеличит потребление подсветки значительно увеличится.
Правильное решение — взять усилитель подсветки с индуктивностью и другой необходимой проводкой от того же телефона и собрать усилитель самостоятельно. Вышеупомянутый мобильный телефон Samsung LTYN (это клеймо знаменитого драйвера LT1937) когда-то пользовался особой популярностью. Для управления уровнем подсветки таких усилителей в телефоне используется встроенный ШИМ-контроллер. Вы также можете использовать это :)
❯ Запускаем дисплейчик на практике
В первой части статьи мы постарались ввести вас в курс дела и кратко объяснить, как работают «под капотом» такие дисплеи. Как видите, с теоретической точки зрения ничего сложного нет. Просто отправьте данные на дисплей и в нужный момент вытащите контакт постоянного тока. Но что это на самом деле означает?
К сожалению, подходящего дисплея от телефона у меня на руках не оказалось (по скидке купил новый, но не всё работало корректно). Поэтому в качестве рабочего примера возьмем практически того же «китайца». Вид со стороны Алика. Однако не волнуйтесь. Для большинства дисплеев принцип работы один и тот же (для дисплеев 2005 года выпуска и ранее).
В качестве МК выделю свой фаворит - RP2040, который, на мой взгляд, не привлекает к себе лишнего внимания. Время от времени я создаю на основе этого МК всякие крутые девайсы, так что очень рекомендую всем читателям :)
Перейдем к практической части статьи!
Обычно при создании проекта вы клонируете образец, используя готовый файл CMake из Git RPi, запускаете hello world, настраиваете CMakeLists.txt и создаете программу. У Малинки пока нет удобного метода создания проектов вроде idf.py create-project :)
Конечно, мы всегда включаем встроенную в чипсет эмуляцию UART через USB, чтобы облегчить отладку.
если (цель tinyusb_device)
add_executable(hello_usb
main.cpp
)
# включаем общие зависимости
target_link_libraries (hello_usb pico_stdlib hardware_spi)
# Включить выход USB и отключить выход UART
pico_enable_stdio_usb (hello_usb 1)
pico_enable_stdio_uart (hello_usb 0)
# Создать файлы Map/bin/hex/uf2 и т д.
pico_add_extra_outputs (hello_usb)
# Добавляем URL через pico_set_program_url
example_auto_set_url(hello_usb)
еще если (PICO_ON_DEVICE)
Сообщение (предупреждение «hello_usb не будет собрано, поскольку подмодуль TinyUSB не инициализирован в SDK")
конециф()
Затем инициализируйте стек USB и привязку к нему стандартного вывода:
stdio_init_all();
sleep_ms (1000);
Здесь важна задержка. Если не промедлить, устройство больше не будет определяться в системе. Перейдем к самой компоновке дисплея. Для работы требуется только источник питания, подсветка, общее заземление и четыре сигнальные линии (MOSI, CLK, DC, RESET). В CS на той же шине, что и дисплей, обычно больше ничего не висит, поэтому вы ставите перемычку с землей.
Перейдем к инициализации дисплея. Этот экран основан на контроллере ST7735R и имеет разрешение 128x160. Сначала назначьте функцию пину и нажмите RESET:
gpio_set_function (LCM_SPI_CLK, GPIO_FUNC_SPI);
gpio_set_function(LCM_SPI_MOSI, GPIO_FUNC_SPI);
// аппаратный сброс
gpio_init(LCM_RESET);
gpio_set_dir (LCM_RESET, правда);
gpio_put (LCM_RESET, ложь);
сон_мс (400);
gpio_put (LCM_RESET, правда);
gpio_init (LCM_DC);
gpio_set_dir (LCM_DC, правда);
spi_init (spi0, 105535000);
скажите, это очень редко? Ну, с небольшими изменениями здесь будут работать дисплеи любого разрешения, даже 480x320. Перейдем непосредственно к инициализации:
void lcmCommand (байты без знака)
{
gpio_put (LCM_DC, 0);
spi_write_blocking(spi0, &byte, sizeof(byte));
}
void lcmData (байты без знака)
{
gpio_put (LCM_DC, 1);
spi_write_blocking(spi0, &byte, sizeof(byte));
}
...
команда lcm (0x11);
сон_мс (120);
команда lcm (0xB1);
лкмДанные (0x01);
лкмДанные (0x2C);
лкмДанные (0x2D);
команда lcm (0xB2);
лкмДанные (0x01);
лкмДанные (0x2C);
лкмДанные (0x2D);
команда lcm (0xB3);
лкмДанные (0x01);
лкмДанные (0x2C);
лкмДанные (0x2D);
лкмДанные (0x01);
лкмДанные (0x2C);
лкмДанные (0x2D);
команда lcm (0xB4);
лкмДанные (0x07);
команда lcm (0xC0);
лкмДанные (0xA2);
лкмДанные (0x02);
лкмДанные (0x84);
команда lcm (0xC1);
лкмДанные (0xC5);
команда lcm (0xC2);
лкмДанные (0x0A);
лкмДанные (0x00);
команда lcm (0xC3);
лкмДанные (0x8A);
лкмДанные (0x2A);
команда lcm (0xC4);
лкмДанные (0x8A);
лкмДанные (0xEE);
lcmCommand(0xC5);//VCOM
лкмДанные (0x0E);
lcmCommand(0x36);//режим MX, MY, RGB
лкмДанные (0xC8);
команда lcm (0xe0);
лкмДанные (0x02);
лкмДанные (0x1c);
лкмДанные (0x07);
лкмДанные (0x12);
лкмДанные (0x37);
лкмДанные (0x32);
лкмДанные (0x29);
лкмДанные (0x2d);
лкмДанные (0x29);
лкмДанные (0x25);
лкмДанные (0x2b);
лкмДанные (0x39);
лкмДанные (0x00);
лкмДанные (0x01);
лкмДанные (0x03);
лкмДанные (0x10);
команда lcm (0xe1);
лкмДанные (0x03);
лкмДанные (0x1d);
лкмДанные (0x07);
лкмДанные (0x06);
лкмДанные (0x2e);
лкмДанные (0x2c);
лкмДанные (0x29);
лкмДанные (0x2d);
лкмДанные (0x2e);
лкмДанные (0x2e);
лкмДанные (0x37);
лкмДанные (0x3f);
лкмДанные (0x00);
лкмДанные (0x00);
лкмДанные (0x02);
лкмДанные (0x10);
команда lcm (0x2A);
лкмДанные (0x00);
лкмДанные (0x02);
лкмДанные (0x00);
лкмДанные (0x81);
команда lcm (0x2B);
лкмДанные (0x00);
лкмДанные (0x01);
лкмДанные (0x00);
лкмДанные (0xA0);
lcmCommand(0x3A);//режим 65k
лкмДанные (0x05);
lcmCommand(0x29);//Отображение
// устанавливаем область просмотра
команда lcm (0x2A);
lcmData (0 >> 8);
lcmData (0 и 0xFF);
lcmData(128>>8);
lcmData (128 и 0xFF);
команда lcm (0x2B);
lcmData (0 >> 8);
lcmData (0 и 0xFF);
lcmData(160 >> 8);
lcmData (160 и 0xFF);
Давайте прошьём МК и посмотрим, что получится. Видите ли вы шум на экране?Это означает, что дисплей инициализирован правильно!
После инициализации дисплея вы можете отображать данные. Настройте один из каналов DMA, чтобы процессор мог выполнять другие действия во время отправки изображения на дисплей. Контроллер DMA отвечает за отправку данных из ОЗУ в другой раздел ОЗУ (аппаратный memcpy) или на периферийное устройство. Только во втором случае, т.е при отправке данных на SPI-контроллер, мы используем DMA!
Выделите кадровый буфер для вывода изображения и установите канал DMA:
int backBufSize = LCM_WIDTH * LCM_HEIGHT * 2 + 1;
backBuffer = (byte*)malloc(backBufSize);
printf("LCM: Настройка канала DMA...\n");
bulkDMA Channel = dma_claim_unused_channel (истина);
cfg = dma_channel_get_default_config (bulkDMAChannel);
channel_config_set_transfer_data_size(&cfg, DMA_SIZE_8);
channel_config_set_dreq(&cfg, spi_get_dreq(spi0, true));
Выведем изображение на дисплей. Чтобы просто установить цвет пикселя в произвольных координатах экрана, просто вычислите смещение от начала указателя на фреймбуфер до конкретной координаты экрана. Формула очень проста и понятна. Ширина отображения * координата Y + координата X и результат предыдущей операции, умноженный на количество байтов в 1 пикселе.
__inline voidPixelAt(короткий x, короткий y, короткий цвет)
{
if(x <0 || y < 0 || x >= LCM_WIDTH || y >= LCM_HEIGHT)
возвращаться;
byte*col = (byte*)&color;
*((short*)&backBuffer[(y * 128 + x) * 2]) = цвет;
}
Эта функция включает проверку границ отображения. Если вы уверены, что границы отображения не будут превышены, снятие галочки ускорит процесс.
Теперь для вывода изображения мы просто копируем исходное изображение во фреймбуфер и просим канал DMA вывести изображение на дисплей. Для прозрачного изображения без альфа-канала (т е изображения с цветовым ключом) функция будет такой:
Вот как со всем этим справиться:
stdio_init_all();
sleep_ms (1000);
printf("Монофонический. Для справки: тест LCM\n");
lcmInitИнтерфейс();
lcmAllocBackBuffer();
лкминит();
grDrawBitmapTransparent((void*)&pikabu, PIKABU_WIDTH, PIKABU_HEIGHT, 0, 0);
лкмфлеш();
Тем временем (1)
{
}
Начнем, и...
Мы могли бы немного усложнить задачу, добавив альфа-смешение и аффинные преобразования (возможность вращать и масштабировать изображения), но на данный момент у нас нет таких задач. Ну что, все очень просто и понятно? :) Примеры прошивок есть у меня на GitHub!
Работу этого метода на RP2040 можно увидеть в этом видео (из-за ограничений на количество медиа-элементов его не удалось загрузить на Пикаб). Обратите внимание, что предложенный выше подход особенно подходит для вывода динамических изображений без «грязных» областей. Подходит для устройств, выводящих динамическую информацию, таких как игровые консоли, камеры, анимация или осциллографы. Если вы обновляете изображения нечасто, например, если вы собираете умные часы с плеером, вы можете записывать данные непосредственно в видеопамять, и буфер кадров не должен занимать много оперативной памяти. Решать вам, в зависимости от вашей конкретной ситуации :)
❯ Заключение
Вот почему мы систематизировали информацию о том, как использовать дисплеи мобильных телефонов в ваших проектах. Я надеюсь, что эта информация будет полезной!
Однако у меня есть к вам просьба. Не стоит «раздирать» рабочий аппарат «на запчасти» :(
Что касается нашего «технозначка», то это не очень гуманно. Наоборот, мы пытаемся найти применение старым устройствам :)
Был ли материал полезен, напишите, пожалуйста, в комментариях.
❯ Важное объявление для читателей касательно будущей рубрики
Друг! Как и многие мои читатели, я, помимо программирования и железа, еще люблю автомобили. Особенно автомобили, где нужно что-то доделывать самому... И конечно же речь идет об умывальнике. Я долго думал и наконец решился. Сейчас я коплю на интересный будущий проект, связанный со сверхмалобюджетной электронной модификацией автомобилей старше меня в 1,5 раза. Может, поговорим. ВАЗ 2108/2109/21099 может оснащаться карбюратором. У нас запланирован очень крутой проект. Его содержание следующее: Спроектировать очень дешевый бортовой компьютер (т.е панель) для управления автомобилем на основе дешевого б/у планшета стоимостью несколько сотен рублей. Планшет подключается к управляющему МК по UART (о такой связи по аппаратным протоколам я уже писал две статьи. Создание своего Linux-смартфона и игровой планшет с неработающим тачскрином) (переход на консоль). С планшета можно не только управлять основными системами автомобиля (стеклоподъёмник, центральный замок, соленоид багажника), но и карбюратором без электроники (!) и собирать информацию о расходе автомобиля, пробеге и стабильности работы двигателя.Также можно примерно посчитайте. Система поставляется с завода!
Если двигатель вашего автомобиля вдруг оживился и быстро запустился, можно попробовать реализовать дистанционный прогрев :)
В нашу задачу входит не только проектирование аппаратной части такого оборудования, но и разработка хорошего интерфейса самой панели, чтобы он был не хуже, чем у BMW. :D Мы поделимся всеми диаграммами, исходным кодом и шагами в каждой статье. И как всегда подробно объясню все детали реализации. Уже есть некоторые идеи и разработки. Почему бы не попробовать? В этом блоге появится новый раздел «Модернизация автомобилей глазами инженеров-электронщиков и опытных программистов.
Фото не мое, оно из интернета
Если вам понравилась моя статья, значит вы заинтересованы, хотите и имеете возможность развивать такой раздел. Вы можете поддержать проект значительной суммой, используя форму пожертвования ниже. Пикабу позволяет делать пожертвования анонимно без регистрации. На данный момент у меня есть личные сбережения в размере 40 тысяч рублей, а на покупку самой машины я намерен выделить 70-80 тысяч рублей (живу в Краснодарском крае, поэтому на такие деньги смогу прожить +- У вас еще есть шанс что-нибудь найду). Поэтому остается только собрать около 30-35 тысяч рублей. Готов объяснить каждую копейку (с учетом того, что купил машину, выложу фото машины и ДКП, объявлю будущий объем работ и сразу приступлю к работе над проектом).
[my]Исследования Гаджеты Покупка Программирование C++ Raspberry PiArduino Экран дисплея 2D-графика Встроенная программа «Сделай сам» Код микроконтроллера Электроника Аппаратное обеспечение Длинный пост 7Больше интересных статей здесь: Гаджеты.
Источник статьи: Мобильные экранчики в ваших проектах: большой и понятный о гайд о различных дисплеях!.