Чем отличается экран lcm12864c от 12864b
Перейти к содержимому

Чем отличается экран lcm12864c от 12864b

  • автор:

LCD 12864 графический дисплей 128×64 (синий)

Мы даем гарантию на любой товар приобретенный в нашем магазине: 6 месяцев на товары, кроме батареек и аккумуляторов 14 дней на батарейки и аккумуляторы В случае наступления гарантийного случая товар бесплатно ремонтируется, меняется на аналогичный или возвращается полная сумма его стоимости Внимательно ознакомьтесь с условиями гарантии

Вы можете задавать вопросы письменно по e-mail или по контактным телефонам нашего магазина
395 грн с НДС

  • Описание
  • Отзывы (40)
  • Задать вопрос

Графический дисплей 128х64 точки с подсветкой на контроллере ST7920. В отличии от текстовых дисплеев позволяет выводить так же и картинки. Может быть подключен как по параллельному так и по последовательному интерфейсу.

Дисплей поддерживает как параллельный, так и последовательный интерфейс передачи данных. Оба интерфейса поддерживает и библиотека U8glib позволяющая работать с дисплеями 12864B V2.0. Для передачи данных по последовательному интерфейсу библиотека U8glib может использовать как аппаратный так и программный SPI. При использовании параллельного интерфейса или программного SPI дисплей можно подключить к любым выводам Arduino. А при использовании аппаратного SPI дисплей подключается только к выводам аппаратной шины SPI.

Выводы Arduino подключённые к дисплею указываются при объявлении объекта библиотеки.

Для параллельного интерфейса:

#include «U8glib.h»
U8GLIB_ST7920_128X64_1X u8g( DB0,DB1,DB2,DB3,DB4,DB5,DB6,DB7, E , RS [, RW [, RST ]] );

Для последовательного интерфейса (программный SPI):

#include «U8glib.h»
U8GLIB_ST7920_128X64_1X u8g( SCK , MOSI , CS [, RST ] );

Для последовательного интерфейса (аппаратный SPI):

#include «U8glib.h»
U8GLIB_ST7920_128X64_1X u8g( CS [, RST ] ); // выводы SCK и MOSI подключаются к аппаратной шине SPI

Выводы для последовательной передачи данных:

№ вывода Обозначение Назначение

4 RS (IRS) (D/I) CS — линия выбора устройства

5 R/W (IR/W) MOSI — линия данных от Arduino к дисплею

6 E (IE) SCK — линия тактирования

15 PSB (CS1) Для последовательной шины — уровень логического «0»

17 RST Сброс при подаче логического «0»

Выводы для параллельной передачи данных:

№ вывода Обозначение Назначение

4 RS (IRS) (D/I) Registers «1» — регистры данных / «0» — регистры инструкций

5 R/W (IR/W) Read / Write «1» — чтение данных / «0» — запись данных

6 E (IE) Enable Сигнал разрешения

7 DB0 Data Bus 0 Линия 0 параллельной шины данных

8 DB1 Data Bus 1 Линия 1 параллельной шины данных

9 DB2 Data Bus 2 Линия 2 параллельной шины данных

10 DB3 Data Bus 3 Линия 3 параллельной шины данных

11 DB4 Data Bus 4 Линия 4 параллельной шины данных

12 DB5 Data Bus 5 Линия 5 параллельной шины данных

13 DB6 Data Bus 6 Линия 6 параллельной шины данных

14 DB7 Data Bus 7 Линия 7 параллельной шины данных

15 PSB (CS1) Parallel Serial Bus Для параллельной шины — уровень логической «1»

16 NC (CS2) Select Column Выбор второго блока колонок

17 RST Reset Сброс при подаче логического «0»

Характеристики:

  • напряжение логических уровней 5В/3В
  • рабочий диапазон температур: -20 до +70 град. С
  • размеры платы: 93х70 мм
  • размеры рамки экрана: 73х51 мм
  • размер рабочей области экрана: 72х40 мм

Ссылки:

Отзывы покупателей про LCD 12864 графический дисплей 128×64 (синий)

Maxim (27.06.2023)

Працює добре.Із мінусів ніжок не поклали.Мале енергоспоживання.Правда контрастність мала при живленні від li-pol / li-ion.Підключив по SPI.Бібліотека: «U8glib».

admin (27.06.2023)

Дисплей не комплектується контактами. Їх необхідно придбати окремо.

Виктор (22.12.2022)

Размеры рамки экрана: 78.5х51.3 мм

Самойлов Антон Олександрович (07.05.2022)

Потрібно використовувати логічні рівні 3.3в
То тоді на vcc потрібно подавати 5в чи 3.3в?

admin (11.05.2022)

Доброго дня. Живлення подається 5В а для отримання логічних рівнів 3,3В потрібно поставити конвертер. Наприклад — https://arduino.ua/prod557-preobrazovatel-logicheskih-yrovnei-dvynapravlennii-ot-sparkfun

Сергей (17.04.2020)

Андрей (01.11.2019)

Все работает, все супер. Библиотека u8g2.
Но есть вопрос:
— в сравнении с OLED как у них с ресурсом? они так же выгорают?

admin (02.11.2019)

Они не выгорают. Ресурс светодиода подсветки при ограничении тока не менее 5 лет. Сами же кристаллы (пиксели), которые формируют изображение служат намного дольше.

Володя (28.12.2018)

запустився з першого разу, контрастний, інформативний, суттєва перевана над текстовими дисплеями

Андрей (16.08.2018)

Оперативная доставка. Рекомендую. Отличные дисплеи, уже больше десятка таких использовали. Удобно, что работают по spi.

Антон (22.07.2018)

Взял два таких дисплея. Подключаю по HW SPI (10, 11, 13 пины). На обеих вижу только синюю подсветку, демки не работают. Пока копаю.
Железо: Arduino Uno SMD; библиотека u8glib.

Игорь (17.03.2018)

Отличный дисплей и библиотека U8glib.

Подключил экранчик, как на нарисованной картинке, подключил библиотеку, появились примеры и они сразу заработали после добавления одной строчки настройки:

U8GLIB_ST7920_128X64_1X u8g(13 /* SCK */, 12 /* MOSI */, 11 /* CS */ /*, [RST] */);

Интересно, что последняя картинка (large_aoc164_7.jpg) с подписями ножек для меня не подошла: на ней первый вывод сверху, а у меня — снизу.

Алексей (19.03.2018)

Вот тут куски кода из одного моего проекта для мониторинга и управление в зависимости температуры , экранном там служит этот дисплей

драйвер на ассемблере для работы с данным экранном занимает реально меньше 500 байт ))
там все расписано.

Ваша библиотека U8glib сожрет большую часть памяти флещ — например на ардуино нано )) для другого и ничего не останется))

также лежит драйвер для работы с max6675 который продается тут https://arduino.ua/prod1785-termopara-k-tipa-s-cifrovim-ysilitelem-na-max6675

Денис (14.02.2018)

Немного дезинформация о том, что дисплей имеет напряжение логических уровней 5В/3В.

На самом деле дисплей нормально работает ТОЛЬКО на 5V. При подключении к 3.3v — изображение на дисплее настолько блеклое, что разглядеть его можно только сильно постаравшись и всматриваясь. В самом даташите написано, что логика и питание тут сугубо 5V.
Будьте внимательны.

admin (15.02.2018)

Напряжение логических сигналов может быть и 3,3В при напряжении питания 5В. Возможно Вы подавали напряжение питания 3.3В — в таком случае потребуется дополнительно отрегулировать контрастность.

Денис (15.02.2018)

Да, подавал питание 3.3.
Контрастность вытянуть не получается никак при таком вольтаже (по крайней мере распаянным на плате переменным резистором) — дисплей остаётся нечитаем.
Обидно, планировал использовать его с pro mini 3.3v

Булавков Владимир Владимирович (05.02.2018)

Дисплей по качеству сборки и картинке хорош. На одной из картинок на сайте (самая правая), неверная нумерация. Еле нашел код инициализации. Для изменения контрастности надо резистор вешать между землей, Vo и + 5v. То есть Vo должно быть больше чем vdd (3.3v). Пока так.

Алексей (05.02.2018)

JP3 замыкая контакт — не нужен переменный резистор на контрастность )))

Денис (14.02.2018)

На моем экземпляре уже был впаян переменный резистор. Его видно на третьем фото с конца.

Алексей (19.03.2018)

вот этот контакт его и замыкает чтоб включить ))

Ярослав (28.08.2017)

Доброго времени суток! данный экран сможет работать с этим модулем arduino-ua.com/prod424-I2C_modyl_dlya_rasshireniya_vivodov_Arduino ?

admin (28.08.2017)

Может, но стандартной библиотекой такая связка не поддерживается. Дисплей можно так же подключать через SPI интерфейс.

FatHarry (17.06.2017)

Приветствую!
Дисплей получен, спасибо.
Предоставьте пожалуйста даташит на сам дисплей.
Интересует JP2.

Алексей (20.06.2017)

JP2 замыкая средний контакт на «S» или «P» у вас и будет или SPI или Parallel
JP3 замыкая контакт — не нужен переменный резистор на контрастность

Алексей (15.03.2017)

Начал тестить данный экран подключил по трем проводам., написал драйвер на ассемблере 500байт занял.
Закинул в нано..очень быстро откликается..
Данный экран кстати поддерживает русские шрифты(16х16) , Они по адресу А720-А770 , есть шрифты для построения таблиц и других прикольных вещей..

Кстати могу написать небольшую статью про него и выложить драйвер..))

Владимир Викторович (22.12.2016)

Пока в реальной работе девайс не применял. Просто проверил работоспособность и пока положил в ящик. Когда закуплю остальные детали уже буду мудрить.
Экран рабочий, упакован отлично (ни ударов ни уронов на почте не боится (пупырышки и картон в не один слой)). Доставка молниеносная. Цена, наверное, одна из лучших в Украине.
А что ещё надо от хорошего магазина?
🙂

Виталий (14.01.2017)

Если не секрет, для каких целей куплен, в каком проекте будет использоваться?

Павел Савчук (02.11.2015)

Покупкой доволен. В этом интернет магазине делаю не первую покупку, работают ну ОЧЕНЬ оперативно. Спасибо.

Иванчук Михаил Михайлович (08.06.2015)

Дуже зручний у використанні дисплей. Використовую для роботи з STM32F1xx (бібіліотеки власного написання :))

П.С. Дякую за гарний сервіс і оперативність роботи http://arduino-ua.com

Хандожко Виктор (04.03.2015)

Хороший дисплей. Не ожидал, что будет так просто его подключить. Использовал библиотеку u8glib.

Саня (почти) Паскаль (06.08.2015)

У меня то же самое.

Саня Паскаль (16.01.2015)

Извиняюсь, не Єто, а Это.

Бессокирный Денис Сергеевич (03.01.2015)

Спасибо.Очень хороший дисплей за разумные деньги..

Олег Прокопчук (31.10.2014)

хороший дисплей. качественный, большой, четкий, яркия. все работает как ожидалось. запустился с первого раза. спасибо вам за быструю доставку.

Сергей (05.10.2014)

Качество хорошее. Все работает.

В описании товара не помешала бы фотография работающего дисплея с выключенной подсветкой. Оказывается без подсветки разглядеть что-то сложно.

Cаня Паскаль (16.01.2015)

Саня Паскаль (06.08.2015)

Булат Владимир Сергеевич (14.06.2014)

Мой первый опыт работы с графическим и дисплеями.Очень доволен результатом. Собираюсь купить еще всяких интересных штук.

Мирослав (26.11.2013)

Графічний індикатор використовую для навчання студентів у гуртку технічної творчості. Орієнтуюсь на програмування мікроконтролерів, і розробку пристроїв на їх основі.

Студенти в захопленні від цього девайса. Вже планують свої розробки з його використанням.

В майбутньому збираюсь замовити для гуртка інші цікаві компоненти у цьому магазині.

Vitalii Samotayev (07.10.2013)

отличный дисплей.
Просто замечательно работает с библиотекой u8glib. для создания меню я использую m2tk — открытую библиотеку с поддержкой массы хороших дисплеев.

Консультирую/разрабатываю. обращайтесь на shurupovert@gmail.com

Написать отзыв:

Есть вопросы по «LCD 12864 графический дисплей 128×64 (синий)» ?

Типы экранов для телефонов

Дисплей (экран) – лицо мобильного телефона, от которого во многом зависит комфортность работы с ним. В современных смартфонах преобладают дисплеи, изготовленные по двум технологиям – LCD и OLED.

У нас можно купить

LCD

Описание технологии

Liquid crystal display или жидкокристаллический (ЖК) дисплей, состоит из двух слоёв. Первый содержит множество жидкокристаллических пикселей. Их излучение управляется другим слоем, состоящим из светодиодов. Они могут располагаться по краям экрана, или за ЖК-слоем. В такой конструкции возможность точного контроля излучения каждого пикселя имеет ограничения.

Плюсы и минусы

В сравнении с OLED, главное достоинство LCD-дисплеев – более демократичная цена, распространяющаяся как на экраны, так и на смартфон в целом.

Часть пользователи считает, что LCD-картинка выглядит натуральнее, чем более яркие и контрастные изображения на OLED-смартфонах.

Недостатки LCD-дисплеев – следствие наличия просвечивающего слоя тыловой подсветки. В результате теоретически чёрные участки на практике имеют скорее тёмно-серый оттенок. По той же причине корпус LCD-дисплеев толще и тяжелее.

Типы дисплеев (экранов) для телефонов

IPS

Современные LCD-смартфоны выпускаются с двумя вариантами управляющих схем (матриц) – IPS и TFT.

В матрицах In-Plane Switching жидкие кристаллы располагаются параллельно друг другу. На практике такое построение позволяет во многом нивелировать свойственное LCD-технологии искажённое отображение чёрного цвета. Другое достоинство этих матриц – отсутствие цветового искажения картинки при её наблюдении под большим углом.

TFT

В матрицах Thin Film Transistor жидкие кристаллы в пассивном положении располагаются под углом в 90 градусов относительно друг друга. После подачи напряжения они поворачиваются, образуя нужный цвет. TFT-матрицы – не конкуренты IPS-дисплеям в цветопередаче, контрастности и угле обзора. Но у них есть и свои достоинства.

В TFT-матрицах меньше время отклика пикселя (при смене цвета). Поэтому они лучше проявляют себя при просмотре динамических видеосцен и в играх. Кроме того, они существенно дешевле и потребляют меньше энергии. TFT-матрицы доминируют в бюджетном ценовом сегменте смартфонов.

OLED

Описание технологии

В отличие от LCD, технология Organic light-emitting diode не нуждается в дополнительном слое с подсветкой. Изображение экрана генерируют сами пиксели на органических светодиодах, излучающие свет. Отображение чёрного цвета реализуется идеально – отсутствием активации соответствующих пикселей.

Плюсы и минусы

В OLED-дисплеях источники света – сами пиксели, их яркость может управляться попиксельно. Поэтому картинка OLED-экранов выглядит ярче и контрастнее.

Чёрные участки OLED-изображения отображаются оптимально. Они совсем не расходуют энергию, что экономит её общее потребление.

Отсутствие дополнительного слоя подсветки позволяет OLED-телефонам быть тоньше и легче.

Высокая цена – существенный недостаток OLED-смартфонов. Кроме того, на белом изображении в углах экрана можно заметить цветные (желтоватые, синеватые и зеленоватые) участки. Ещё один минус: при длительной эксплуатации на OLED-экранах возникают выгоревшие участки с контурами часто отображаемой картинки.

PMOLED

В Passive-Matrix OLED-экранах используется пассивное управление органическими светодиодами. В каждый момент времени напряжение подаётся на единственную строку светодиодов: остальные остаются обесточенными. Для обеспечения общей необходимой яркости приходилось пропускать через них довольно мощный ток. В результате OLED-дисплеи быстро выходили из строя. Этот недостаток частично компенсировался доступной ценой.

AMOLED

В Active-Matrix OLED введена дополнительная матрица с тонкоплёночными транзисторами и конденсаторами, поддерживающими постоянное напряжение на светодиодах. Этот приём позволил отказаться от пропускания экстремальных токов и существенно увеличить срок службы. За это пришлось заплатить удорожанием AMOLED-дисплеев.

P-OLED

В P-OLED-матрицах стеклянную подложку заменила пластиковая, что, кроме долговечности, обеспечило повышенную ударостойкость.

Прочие технологии

Кроме двух рассмотренных доминирующих технологий, смартфоны изготовляются и по некоторым другим. Часть названий – маркетинговые, без технологической основы.

Retina и Super Retina

Корпорация Apple с 2010 г. для своих ЖК- и OLED-дисплеев использует маркетинговые названия Retina («сетчатка») и Super Retina соответственно. Экраны Apple отличаются повышенной плотностью пикселей. Производитель заявляет о неразличимости отдельных пикселей даже людьми с отличным зрением.

Super AMOLED

Компания Samsung внесла ряд улучшений в стандартную технологию AMOLED (см. выше). Было сокращено количество синих светодиодов, быстро теряющих эмиссионную способность. Сенсорный слой интегрировался в излучающий без воздушной прослойки между ними. В результате нововведений:

  • образование солнечных бликов уменьшилось на 80%;
  • яркость экрана возросла на 20%;
  • на столько же процентов уменьшилось энергопотребление.

Infinity Display

В отличие от Super AMOLED, термин Infinity Display («бесконечный дисплей») – чисто маркетинговый. Технология подобных смартфонов повторяет Super AMOLED. «Бесконечность дисплея» означает отсутствие боковых рамок и их минимальную ширину сверху и снизу.

Следующие две технологии, уже внедрённые в телевизионные мониторы, считаются ближайшим будущим OLED-смартфонов.

Micro-LED

В основе технологи Micro-LED– микроскопические светодиоды на неорганической природе, не подверженные выгоранию. Другое преимущество – малое время отклика. Оно позволяет просматривать динамические сцены фильмов и играть без искажений.

QLED

Quantum-dot Light-Emitting Diode – «светодиоды на квантовых точках» – технология компании Samsung. Квантовые точки – микроскопические кристаллы диаметром 2–10 нанометров. В зависимости от размера, эти точки излучают свет в разных участках спектра. Технология квантовых точек обеспечивает очень высокую яркость и качество изображения.

Ответы на популярные вопросы

Как определить тип экрана?

Самый простой способ – установить на экране смартфона чёрное изображение, после чего – максимальную яркость. Посветлевший экран указывает на ЖК-дисплей, а оставшийся чёрным – на OLED или его вариации.

Какой экран телефона лучше – IPS или AMOLED?

Естественность чёрного цвета лучше у AMOLED, а белого – у IPS. AMOLED превосходит IPS в насыщенности и яркости картинки. Больше в таких экранах и угол обзора. А IPS-дисплеи долговечнее, в них отсутствует свойственный AMOLED эффект мерцания.

В чём отличие OLED от AMOLED

AMOLED – усовершенствованный вариант технологии OLED. Введение специальной управляющей матрицы из тонкопленочных транзисторов с конденсаторами позволило отказаться от импульсного режима работы светодиодов, и увеличить срок службы дисплеев.

Что лучше – QLED или AMOLED?

QLED-матрица, в принципе, превосходит AMOLED в контрастности, яркости и цветопередаче. Перед производителями стоит задача сохранить эти преимущества при внедрении QLED-технологии в смартфоны.

Дисплей графический LCD 12864B с желтой подсветкой

Дисплей графический LCD 12864B с желтой подсветкой

О товаре

Графический индикатор с углом обзора 70°
Цвет подсветки: желтый
Формат выводимой информации: 80 символов (20×4)
Контроллер: ST7920

Транспортной компанией по РФ и СНГ

Курьером по Москве

Самовывоз из магазина

Для юрлиц – переводом на расчётный счёт

Для физлиц – банковской картой онлайн, наложенным платежом и наличными

Для бизнеса

Аккредитованы на ЭТП

Участвуем в госзакупках по 223-ФЗ и 44-ФЗ

Оказываем помощь в разработке ТЗ

Транспортной компанией по РФ и СНГ

Курьером по Москве

Самовывоз из магазина

Для юрлиц – переводом на расчётный счёт

Для физлиц – наложенным платежом,
безналично и наличными

Для бизнеса

Аккредитованы на ЭТП

Участвуем в госзакупках по 223-ФЗ и 44-ФЗ

Оказываем помощь в разработке ТЗ

Графический индикатор с углом обзора 70°
Цвет подсветки: желтый
Формат выводимой информации: 80 символов (20×4)
Контроллер: ST7920

ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ LCD дисплея 12864B

Характеристики дисплея
Тип дисплея LCD STN
Разрешение 128 × 64
Угол обзора 70°
Тип подсветки LED
Цвет подсветки желтый
Цвет символов черный
Контроллер ST7920
Тип выводимой информации символьный (латиница) и графическая информация
Формат выводимой информации количество строк — 4
количество символов в строке — 20
общее количество символов — 80
Шаг пикселя 0.52 x 0.52 мм
Размер пикселя 0.48 х 0.48 мм
Поддержка платформ Arduino
Контакты модуля GND — GND
VCC — питание модуля +5 В
VO — потенциометр для регулировки контрастности
RS (IRS) (D/I) — «1» — регистры данных / «0» — регистры инструкций
R/W (IR/W) — «1» — чтение данных / «0» — запись данных
E (IE) — cигнал разрешения
DB0 — DB7 — линия 0 параллельной шины данных
PSB (CS1) — для параллельной шины — уровень логической «1»
NC (CS2) — выбор второго блока колонок
RST- сброс при подаче логического «0»
Vout — уровень выходного напряжения (для согласования)
BLA (A)- питание подсветки (Анод +)
BLK (K) — питание подсветки (Катод -)
Область применения применяется в некоторых копировальных и факсимильных аппаратах, лазерных принтерах сетевом оборудовании и д.т.
Общие характеристики
Интерфейс поддерживает как 8-битный параллельный, так и последовательный интерфейс передачи данных
Напряжение питания 3.3 В — 5 В
Максимальный ток потребления 4 мА
Потребляемый ток подсветки 64 мА
Рабочая температура — 20°С — 70°С
Температура хранения — 30°С — 80°С
Относительная влажность 10 % ~ 95 %
Габариты 75 x 58 х 9 мм
Вес ∼ 80 грамм
Комплектация символьный дисплей LCD 128×64 — 1 шт

Схема подключения к Arduino UNO

условные обозначения

Технические характеристики, внешний вид и комплектация товара могут быть изменены производителем без предварительного уведомления.

Работа с графическим дисплеем WG12864 на базе контроллера KS0107

Обычно для вывода информации сигнального дисплея на HD44780 более чем достаточно. Но иногда нужно нарисовать картинку, график или хочется сделать красиво, с модными менюшками. Тут на помощь приходят графические дисплеи. Одним из самых простых и доступных является дисплей на контроллере KS0107 или аналоге. Например, WG12864A от Winstar. Сам дисплей вполне свободно достается, имеет довольно большой размер (диагональ около 80мм) и разрешение 128х64 пикселя. Монохромный. Цена вопроса 400-500р.

Подключение
Управление дисплеем параллельное. Есть шина данных и линии задания направления и вида данных. Это, кстати, один из минусов — требует очень много проводов управления. Занимает почти 16 линий. Но зато и очень прост в работе.

Итак, если взять тот, что у меня WG12864A-TGH-VNW то у него следующая распиновка:

  • Vdd и Vss это питание, оно у него пятивольтовое.
  • Vee — источник отрицательного напряжения. Там примерно минус 5 вольт. Есть не на всех моделях этих дисплеев, у Winstar о наличии такой фенечки говорит буква V в маркировке. WG12864A-TGH-VNW
  • Vo — напряжение регулировки контраста. Туда подается либо 0…5 вольт, либо от -5 до 5, в зависимости от модели и температурного диапазона. Обычно более морозостойкие дисплеи требуют отрицательное напряжение. Схема включения простая:

К контроллеру (ATMega16 на Pinboard) я подключил все следующим образом.

Крупным планом

Данные полностью легли на PORTA, а управление на PORTB. В качестве резистора подстройки контраста я взял многооборотный переменник, что так кстати стоит рядом для подобных случаев. Питание подсветки взял с колодки от дисплеяя. Благо там все уже готово, даже управление от транзистора есть 🙂 Правда я ее просто включил.

Двое из ларца, одинаковых с лица. Адресация
Контроллер CS0107 он может организовать матрицу только 64х64. А у нас в дисплее вдвое большая 128х64. Значит стоят два контроллера. Один отвечает за правую половину экрана, другой за левую.
Он представляет собой этакую микросхему памяти, где все введенные данные отображаются на дисплее. Каждый бит это точка. Кстати, для отладки удобно юзать, выгружая туда разные данные, а потом разглядывая этот дамп). Карта дисплея выглядит так:

Байты укладываются в два контроллера страницами по 64 байта. Всего 8 страниц на контроллер.

Так что для того, чтобы выставить точку с координатами на экране, например, Х = 10, Y=61 надо вычислить в каком контроллере она находится. Первый до 63, второй после, если адрес во втором контроллере, то надо вычесть 64 из координаты. Затем вычислить страницу и номер бита. Страница это Х/8, а номер бита остаток от деления (Х%8). Потом нам надо считать нужный байт из этой страницы (если мы не хотим затронуть остальные точки), выставить в нем наш бит и вернуть байт на место.

Протокол обмена
Тут все просто, без каких либо изысков. Выставляем на линиях RW, DI что мы хотим сделать, линиями CS1 и CS2 выставляем к кому обращаемся. На шину данных выдаем нужное число и поднимаем-опускаем линию строба. Опа! Впрочем, есть одна тонкость. Для чтения данных строб нужно дернуть дважды, т.к. предварительно данные должны попасть в регистр-защелку. Для чтения же флага состояния такой изврат не нужен. Вот примеры временных диаграм для разных режимов.

И запись. Причем запись, в отличии от чтения, можно делать сразу в оба контроллера. Конечно одновременно писать данные в контроллер смысла имеет мало, разве что захочишь двойную картику получить 🙂 А вот команды обычно пишут срзау в оба.

Кстати, еще есть одна особенность — выводы CS могут быть инверсными. Это зависит от модели дисплея. Так что это надо учитывать.

Временные диаграммы, т.е. сдвиг фронтов между собой по времени может быть разным у разных контроллеров. Где то быстрей, где то медленней. Но в целом 1мкс обычно хватает. В реале обычно меньше. Лучше поглядеть в даташите на конкретный контроллер (не дисплей, в ДШ на дисплей обычно редко есть описание самого контроллера). Там обычно есть таблица вида:

Где указаны максимально допустимые временные интервалы. Если они будут меньше или больше, то дисплей скорей всего не будет работать. Или будет работать с ошибками. Если у вас на дисплей в процедуре заливки или очистки экрана полезли всякие левые пиксели и прочие артефакты — значит тайминги не выполняются. Также рекомендую проверять тайминги на чтение и на запись. Делается это просто — гоним последовательно сначала чтение, а потом запись обратно. Если ничего не изменилось — значит все ок. Появились искажения? Крутите временные задержки. Только рекомендую читать не пустоту вида 0х00, а что нибудь более веселое залить, например, шахматную доску из пикселей. По очереди 0х55 и 0хАА.

Система команд.
Она тут простейшая.

Команда D/I R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Назначение
Отображение ВКЛ/ВЫКЛ L L L L H H H H H L/H Управляет вкл/выкл отображения. Не влияет на внутреннее состояние и данные ОЗУ изображения.
L: ВЫКЛ
H: ВКЛ
Установить Адрес L L L H Адрес Y (0 ~ 63) Заносит адрес Y в счётчик адреса Y
Установить Страницу (адрес Х) L L H L H H H Страница (0 ~ 7) Заносит адрес X в регистр адреса X
Начальная Строка Отображения L L H H Начальная строка отображения (0 ~ 63) Скроллинг вверх. На сколько пикселей сдвинуть адресное пространство. При этом уехавшее вверх, за экран, вылезет снизу, словно мы провернули экранную область как барабан
Чтение Состояния L H BUSY L ON/OFF RESET L L L L Чтение состояния.
BUSY
L: Готовность
H: Выполняется команда ON/OFF
L: Отображение ВКЛ
H: Отображение ВЫКЛ
RESET
L: Нормальный режим
H: Сброс
Запись Данных Изображения H L Данные для записи Записывает данные (DB0:7) в ОЗУ данных изображения. После записи инструкции, адрес Y увеличивается на 1 автоматически.
Чтение Данных Изображения H H Данные для чтения Читает данные (DB0:7) из ОЗУ данных изображения на шину данных. После чтения адрес Y сам увеличивается на 1 автоматически

Инициализация дисплея элементарная, в отличии от HD44780, где надо переключать режимы, включать-выключать разные курсоры и отображения.

Надо после сброса задать начальные координаты (адрес точки и страница), значение скролинга (обычно 0) и включить отображение. При включении на дисплее может быть мусор. Поэтому отображение обычно включают после очистки видеопамяти.

У меня ициализация, по командам, выглядит так:

  • 0x3F — включить
  • 0x40 — Адрес Y=0
  • 0xB8 — Страница Х=0
  • 0xC0 — Скролл = 0 (т.е. с самого верха)

Ну и потом еще заливка сразу в оба контроллера.

Код
Итак, приступим к коду. Чтобы было наглядней я все операции с ногами расписал в виде макросов. Заодно будет гораздо проще все перенести на другую архитектуру. Просто написав другие макросы, не правя сам код 🙂
Весь код можно поглядеть в нашей кодосвалке:
lcd_wg128.h
lcd_wg128.c

Покажу тут лишь характерные моменты работы с дисплеем.

Записью команд и данных занимаются следующие функции:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
// Пишем команду в выбранный контроллер void LCD_WR_COM(u08 cmd,u08 CSC) { // Поднятие сигналов: LCD_SET_CMD; // Команда LCD_SET_W; // Запись ON_CS(CSC); // Выбор чипа LCD_DATA_INS(cmd); // Команду на шину данных NOPS; // Подождем LCD_PUL_E; // Дрыгнем стробом NOPS; // Подождем LCD_OFF_CS1; // Выключим LCD_OFF_CS2; // выбор кристалла } // Пишем данные в контроллер void LCD_WR_DATA(u08 cmd, u08 CSC) { // Поднятие сигналов LCD_SET_DAT; // Данные LCD_SET_W; // Запись ON_CS(CSC); // Выбор чипа LCD_DATA_INS(cmd); // Данные на шину данных NOPS; // Подождем LCD_PUL_E; // Дрыгнем стробом NOPS; // Подождем LCD_OFF_CS1; // Выключим выбор LCD_OFF_CS2; // Чипа. } // Чтение данных из байта, адрес которого уже должен быть установлен. Надо только выбрать // контроллер. u08 LCD_RD_DATA(u08 CSC) { u08 outv; // Выставляем линии управления LCD_SET_DAT; // Данные LCD_SET_R; // Чтение ON_CS(CSC); // Выбираем чип (только один!) NOPS; // Ждем LCD_PUL_E; // Дрыг стробом - пустое чтение, активация защелки NOPS; // Ждем LCD_UP_E; // Строб вверх NOPS; // Ждем outv = LCD_DATA_PIN; // Контроллер выдал данные на шину. Читаем их LCD_DN_E; // Строб вниз LCD_OFF_CS1; // Все свободны! LCD_OFF_CS2; return outv; // Возвращаем считанное }

Чтение слова состояния делать не стал. Т.к. дисплей работает весьма шустро, что на круг ожидания можно не уходить, а просто подождать несколько тактов. Собственно этих трех функций уже достаточно для работы 🙂 Остальное все свистоперделки и удобства.

Вроде заливки экрана:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
// Заливка экрана void LCD_FILL(u08 byte) 1)); // Записываем адрес У в контроллер. LCD_WR_DATA(byte,(1 } }

Или установки пикселя. Причем можно загонять его в трех режимах. Просто установить, стереть или инвертировать. Координаты задаются глобальные, а вычисление адреса идет в функции:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
// Процедура установки пикселя. Т.к. пиксель часть байта, то надо сначала вычислить // Контроллер, потом страницу и нужный байт. Считать этот байт. Изменить в нем только один, // нужный, бит и вернуть его на место. // На входе координаты и режим обработки пикселя (вкл, выкл, переключение) void PIXEL(u08 x,u08 y,u08 mode) { u08 CSS, row, col, byte; u08 res,read; if(y>63) // Проверяем в каком контроллере искомый пиксель { CSS = 1CS2; // Если У больше 63 значит во втором. Выставляем 2й col = y-64; // И отнимаем смещение, чтобы не мешалось. } else { CSS = 1CS1; // Иначе контроллер у нас первый. col = y; // А смещения нет. } row = x>>3; // Делим Х на 8, чтобы получить номер страницы. byte = 1x%8; // А остаток от деления даст нам искомый бит, который мы задвигаем // и получаем нужную нам битмаску для модификации байта. SET_ADDR(row,col,CSS); // выставляем адрес read = LCD_RD_DATA(CSS); // Читаем данные (адрес при этом ++ аппаратно). switch(mode) // В зависимости от режима { case 0: // Clear { res = read & ~byte; // Накладываем сбрасывающую (NOT) маску break; } case 1: // Invert { res = read ^ byte; // Накладываем инвертирующую (ХОR) маску break; } default: // Set  res = read  } SET_ADDR(row,col,CSS); // Повторно выставляем адрес. Т.к. чтение его исказило. LCD_WR_DATA(res,CSS); // Вгоняем туда результат нашей модификации. }

Но работа с пикселями медленная штука. Это же каждый надо считать, изменить, закинуть обратно. Куча мороки. На обновление всего экрана в попиксельном режиме уйдет прорва времени. Я подсчитывал, при полной загрузке проца только на это, на заливку попиксельно всего экрана уходит чуть ли не треть секунды.

Куда эффективней работать с дисплеем блоками. Т.е. берем и последовательно записываем сразу куски страниц, на глубину в несколько байт. Например, таким образом удобно рисовать текст. Правда при попиксельном выводе, когда текст попадает между страницами получается неудобно, приходится делать вдвое больше работы. Но все равно намного быстрей чем попиксельно. На порядок!

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
// Запись сразу блока. Удобно для вывода строк или картинок, постранично. // На входе страница Х и колонка У. А также длина блока и адрес откуда брать данные. u08 BLOCK(u08 x,u08 y, u08 len, u16 addr) { u08 CSS,i,col; if(y>63) // Сначала вычисляем нужные нам сегмент (чип) { CSS = 1CS2; col = y-64; } else { CSS = 1CS1; col = y; } SET_ADDR(x,col,CSS); // Ставим адрес // А дальше в цикле гоним байты. Не забывая увеличивать адрес, чтобы была выборка из // памяти. Счетчик, чтобы не сбиться со счета. И номер колонки, чтобы не вылезти за границы // И вообще понимать где мы находимся. for(i=0;i!=len;i++,addr++,col++) { if(64==col) // Попутно проверяем за границы выхода из сегмента { if(CSS == (1CS2)) // Если случилось, и у нас второй сегмент, т.е. конец { // страницы (уже второй в этой строке) return 128; // выходим с кодом ошибки (код больше разрешения экрана) } col=0; // Иначе же обнуляем счетчик колонок. И переключаем банку CSS = 1CS2; // Выбрав второй сегмент экрана SET_ADDR(x,col,CSS); // И выставив новый текущий адрес } LCD_WR_DATA(pgm_read_byte(addr),CSS); // Пишем туда данные прям из флеша (таблица символов). } return y+len; // Возвращаем координату увеличиную на размер блока. }

// Запись сразу блока. Удобно для вывода строк или картинок, постранично. // На входе страница Х и колонка У. А также длина блока и адрес откуда брать данные. u08 BLOCK(u08 x,u08 y, u08 len, u16 addr) < u08 CSS,i,col; if(y>63) // Сначала вычисляем нужные нам сегмент (чип) < CSS = 1else < CSS = 1SET_ADDR(x,col,CSS); // Ставим адрес // А дальше в цикле гоним байты. Не забывая увеличивать адрес, чтобы была выборка из // памяти. Счетчик, чтобы не сбиться со счета. И номер колонки, чтобы не вылезти за границы // И вообще понимать где мы находимся. for(i=0;i!=len;i++,addr++,col++) < if(64==col) // Попутно проверяем за границы выхода из сегмента < if(CSS == (1<col=0; // Иначе же обнуляем счетчик колонок. И переключаем банку CSS = 1 LCD_WR_DATA(pgm_read_byte(addr),CSS); // Пишем туда данные прям из флеша (таблица символов). > return y+len; // Возвращаем координату увеличиную на размер блока. >

Блочный вывод легко превращается в текстовый вывод. Надо лишь совместить таблицу символов с печаталкой блоков. И гнать данные из флеша напрямую.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// Процедура вывода строки. На входе строка, и координаты. Х в страницах, а У в точках. void LCD_putc(u08 x,u08 y,u08 *string) { u08 sym; while (*string!='\0') // Пока первый байт строки не 0 (конец ASCIIZ строки) { if(127y) // Проверяем за границу выхода за экран. Если вылезаем { // Вот тут, кстати, можно поиграть с числом, чтобы не рубило последний символ. y=0; // То обнуляем координату точки. x++; // Выставляем следующую строку if(x>7) break; // Если экран и вниз кончился - выход. } sym = *string-0x20; // Вычисляем из ASCII кода смещение в таблице символов. // Для русского языка и цифр надо условия добавить. Т.к. // таблица там не полная, не 255 байт. y = BLOCK(x,y+1,5,(u16)symboltable+sym*5); // Закатываем этот блок. string++; // Не забывая увеличивать указатель, } }

// Процедура вывода строки. На входе строка, и координаты. Х в страницах, а У в точках. void LCD_putc(u08 x,u08 y,u08 *string) < u08 sym; while (*string!='\0') // Пока первый байт строки не 0 (конец ASCIIZ строки) < if(1277) break; // Если экран и вниз кончился — выход. > sym = *string-0x20; // Вычисляем из ASCII кода смещение в таблице символов. // Для русского языка и цифр надо условия добавить. Т.к. // таблица там не полная, не 255 байт. y = BLOCK(x,y+1,5,(u16)symboltable+sym*5); // Закатываем этот блок. string++; // Не забывая увеличивать указатель, > >

Для еще большего ускорения можно немного оптимизировать функции ввода вывода. Убрав из хвостов возврат сигналов в первоначальное положение. У меня они больше для красоты. Да чтобы на экране анализатора было лучше видно 🙂

Ну и чтение-модификацию-запись делать тоже большими блоками. Загоняя, скажем, страницу в буфер, правя его там и быстро выгружая обратно.

Ну и, традиционно, архив с примером. Сделано все на ATmega16 под WinAVR GCC на Pinboard

  • Пример кода для AVR
  • Пример кода для PIC24 от Chiesel. В ее состав входят файлы «KS0108.c», «KS0108.h», «font_set_6x6_v2.h». В файлах «KS0108test.c» (файл прошивки: «Presentation.hex») и «flying_cursors.c» (файл прошивки: «Flying.hex») представлены примеры работы библиотеки.)

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

118 thoughts on “Работа с графическим дисплеем WG12864 на базе контроллера KS0107”

Зачетно
Надо бы свой прикрутить, попробовать, а то валяется на полке.
Цены на них откровенно безбожные, учитывая, что TFT 2.4″ у китайцев стоят 20$.
Кстати, удобно еще генерить массив какой-нибудь прогой, потом просто выводить на экран. Я с tic-ами там делал. Для статичной фигни.

DI HALT :

TFT так просто не обработаешь, под него нужен мощный контроллер, а лучше ПЛИС и видеопамять. Так что не все так просто. Можно да, но его надо гдето в памяти держать. Тут получается килобайт только фреймбуфер.

Контроллер обычно в таком дисплее есть.
Видеопамяти все равно не напасешься, особенно с двойным буфером.
К примеру, для 7″ (800х480) дисплея с глубиной цвета 24 бит, нужен мегабайт с лишним памяти. RAMа больше 128К я вроде не видел в МК.
Но в целом да, ресурсы все равно нужны свободные.

Мощный то и не нужен, lpc2478 или lh79520 отлично справятся, только если хранить картинки нужно, то лучше прикрутить внешний nand мега на 4

ArxangelRUS :
Ди, нескромный вопросик, а с чем у тебя связана работа? 🙂
DI HALT :
Я уже три года как безработный О_о
ArxangelRUS :

А последняя работа была какая?
Ди. Раз ты тут. Скажи своей жене чтобы она занялась моим заказом 🙂 701 вроде.

DI HALT :

Последний раз я был наладчиком лабораторного оборудования. До этого наладчиком станков ЧПУ, а до этого я был студентом 🙂 Я его уже обработал. Гляди в форум 🙂

DI HALT :
А, ну еще, ради лулзов, преподавал микропроцесосрные системы в ЧПТ.
ArxangelRUS :

А есть ещё такие же по габаритам на контроллере ST7920. Брал у братьев китайцев. Так они ещё и последовательный интерфейс умеют 😉

Вот здесь и брал:
http://cgi.ebay.com/12864-128×64-Graphic-LCD-Display-module-Free-pin-header-/320537663387 А ещё они умеют переключаться в текстовый режим, и вроде даже можно в раму свой знакогенератор грузить.

Какие команды на инициализацию и запись в GDRAM даёте, не подскажете? Бьюсь-бьюсь над таким, всё без толку.

Вопрос снят — у своеобразная адресация GDRAM. Верхняя половина экрана.
y=0 … 31
x=0 … 7 Нижняя половина экрана.
y=0 … 31
x=8 … 15 Посылать два байта данных (2*8 * 8 = 128 точек).

Есть клёвые экранчики от Noka 1110i/1112, по ~50р в каком-нибудь сириусе, рублей за 30 у кетайцев. Протокол контроллера на базе SPI давно уже раскурочен, разрешение 128×160, размеры не очень большие, чёрно-белый. Да и вообще — экраны от телефонов — самые дешёвые, функциональные и есть огромный выбор. Огромное количество протоколов описано тут: http://www.module.ro/, рекомендую.

DI HALT :
Ага и до них скоро доберусь. Проблема этих дисплейчиков в том, что их сложно покупать оптом.
DI HALT :
Растомаживать партию в 100-200 дисплеев пробовал? 😉

Да, растаможка это зло. Можно по 10 штук заказать себе, соседу, маме и другу :). Хотя один раз удалось убедить таможню, что сотня аккумуляторов на 5.5 А*ч нужны для личного потребления 🙂 А можно растаможку оставить на совести Сириуса: http://shop.siriust.ru/product_info.php/products_id/9711
🙂
Даже если у них нет столько в наличии, думаю, под заказ сделают, они один фиг регулярно растамаживают кучу всего.

exception.cpp :

У китайцев вообще много всего интересного. Вот по $9 например шикарнейшие цветные 3″ TFT 256×192 от NintendoDS http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=230457012096&ssPageName=STRK:MEWNX:IT#ht_2157wt_1396
правда выводов туча (распайка с сигналами есть).
Или вот от Самсунга http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=300575859205&ssPageName=STRK:MEWNX:IT#ht_1255wt_1163 на контроллере HD66773R — тоже вариант IMHO.
Но avr’ки гонять на этом конечно не айс. P.S. Вот и получается — что 8-битный AVR+текстровый/граф.ЧБ экран средней фиговости — в сумме ДОРОЖЕ чем 32-битный Cortex M3+навороченный цветной TFT 3″ 🙂

DI HALT :

Ммм я китайцев вообще не рассматриваю. Один два дисплея купишь, а вот сотни три в квартал уже гемор.
Думаю тот же WG12864 в китае тоже стоит копейки. Кстати, а счего это на кортексе хорошая графика взлетает? Памяти у него не сильно то больше, на цветной точно не хватит полноценный фреймбуфер сделать. Ногами дрыгать он умеет плохо. А с внешней видеопамятью + контроллер на ПЛИС который будет ее вгонять в дисплей это уже совсем другая история. Или там спец кортексы, с интерфейсом дисплея и видеопамятью замапленной в адресное пространство?

exception.cpp :

Про оптовые поставки из китая — это всё далется. Списываются с поставщиком (который на том же eBay и прочих), договариваются о форме взаимодействия, оформляют доки, проводят через таможно и т.п. Можно юзать как посредников российские конторы, у которых налажена связь с Китаем. Про кортекс — ага, с внешней SRAM (+ещё 2 копейки), высокая тактовая частота и конечно DMA рулят — можно вполне приличное разрешение использовать. ПЛИС не нужен.

exception.cpp :

В догонку из AN3241 от ST:
The STM32 with its powerful DMA controller and highly flexible FSMC peripheral combine to offer a cost-effective solution for driving a QVGA TFT-LCD with a CPU load of only 1% for static image display.

exception.cpp :
Просто на вскидку — посредники типа:
http://www.chinareferent.ru
taobao.ru.com
exportconsulting.ru

У STM32 FSMC вполне справляется, по-крайней мере с 2.4″ TFT.
Тут скорее зависит от памяти граф. контроллера.
У меня есть плата с Pic32 и граф. контроллером SSD1963, у пика «всего» 32К RAM памяти, в контроллере мег с небольшим. Дисплей 7″ нормально отображает движущиеся объекты, разве что мерцание немного видно под углом.
Видимо буфер передается частями, я пока не разобрался в этой части кода (там microchip GUI немного обработанный и с драйвером под 1963).

DI HALT :

Ну в принципе, SPI на предельной скорости, да через DMA вполне может дать вменяемое быстродействие. Просто сложно всякие эффекты рисовать, придется их по частям прорисовывать если на лету. Или с флешки какой грузить.

STM32F103, AFAIK не имеющий встроенного контроллера, в одиночку справляется со всеми задачами в DSO Nano, включая вывод на дисплей с TFT интерфейсом. Так что, видимо, все не так уж плохо.

Вы ничего не путаете? У этих дисплеев разрешение всего 96 x 68. Неплохо, но всё-таки.

Пардоньте, обшибся.
Просто побывавши на module.ro, глаза разбегаются а мозг затуманивается от обилия перспектив 🙂

dcoder :

На самом деле такие дисплеи среди любителей не так распространены, как дисплейчики от телефонов. ИМХО. Упячкомен доставил 🙂

Именно этот дисплей к интерфейсу внешней памяти не прикрутить. Как раз в статье Steel_ne’ла, об этом и написано — E — сигнал мешается. Для ускорения вывода можно использовать кеш. Т.е. хранить несколько байт в памяти. все операции с установкой пикселя проводить в памяти, и как только последующий пиксель окажется за пределами кэшируемой области — сливать кешь в дисплей, и загружать новые данные с дисплея и опять то же самое.
Быстро получается выводить текст, когда шрифт организован так, как пиксели расположенны в дисплее по байтам, например, в этом дисплее один байт — это вертикальная линиия, значит шрифт надо выводить по вертикальным линиям. Тогда, организовав кэшь размером с ширину одного символа, можно быстро текст печатать. Единственно, после вывода последнего символа надо флашь кэша делать.

Помоему проще сделать контроллер вывода для такого дисплея на отдельном контроллере, и слать ему просто текстовые команды, уже были статьи по «самодельным» контроллерам ввода-вывода. Основной задачей занят один контроллер, опросом кнопок и дисплеем другой, помоему удобно и ускоряет разработку.

DI HALT :
А если надо нарисовать картинку?

Да полюбому, даже на компе многоядерном, и многогигагерцовом картинки рисуют вспомогательные контроллеры.

DI HALT :

в принципе… туда можно запихать виртуальную машину со своим языком и получить сопроцессор графики. На вход скрипты (типо линия с координатами от сих до сих) на выходе линия на дисплее и прерывание «ОК»

Если кому интересно, то такой виртуальной машиной для графики является PostScript и его развитие в виде Adobe PDF, а в основе всего стоит FORTH машина…

Есть такая прикольная штука от Atmel как DB101 с дисплеем 128х64 на контроллере s6b1713.
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4221
http://gandalf.arubi.uni-kl.de/avr_projects/db101_gcc_20080301.zip
К этой штуке идет полный набор графических библиотек с виджетами, кнопками, прокрутками,
окнами….. Вот бы, к этой библиотеке, WG12864 на базе контроллера KS0107 да прикрутить !

«Обычно для вывода информации сигнального дисплея на HD44780»
Почему сигнального? Может символьного?
DuXeN0N :

А дисплей WH1602A от WinStar (16×2) также подключать? Или как в статье «Подключение к AVR LCD дисплея HD44780»?

DI HALT :
AlexX1810 :

Для дисплеев WG12864 в пакете MikroC есть тулза, которая позволят монохромные битмапы загонять в программу в текстовом виде. Удобно.

Ди, можно схему включения немного покрупнее?
или еще одну картинку покрупнее по ссылке «увеличить»
DI HALT :
По ссылке «Увеличить» Картинка с высоким разрешением. Там все читается нормально.
протупил, я о той что выше… большую не разглядывал
shurikss123 :

DI HALT. Не против испробовать такой дисплей WG12864F c контролером T6963. занятная штука имеет на борту 8кб при маленьком изменении можно сделать 32кб отдельно символьные страницы отдельно графические страницы но выводит на экран обе части. возможность переключения между страницами, скорость передачи, приема намного выше чем на KS0107.

DI HALT :

Совершенно не против. Только нет у меня его в наличии 🙂 А заказ я уже сделал и следующий только через несколько месяцев.

shurikss123 :

ну ничего, я к тому что весчь оч. интересная. если что, есть некие наработки, но это только для серьезных конструкций.

Ди, а разве этот экран не на KS0108?
DI HALT :
Это одно и тоже. Его обычно и пишут как KS0107/KS0108

Спасибо за статью. Вдохновился и заказал с e-bay экран 128х64. Но он на контроллере ST7920. Внутри и символьный, и граф. экран.
Управляющую программу начал на Си. Обычно на асм писал.
В симуляторе AVR studio 4 всё работает, как надо.
В реале на порт B выдаются правильные данные. На порт A 3 бита управления (RS — статический 0, RW статический 1, E — правильный пульс)
Может кто подскажет в чём дело?
Код не такой длинный…
http://easyelectronics.ru/repository.php?act=view&id=59

DI HALT :

У тебя между выводом cmd1 и cmd2 нет никакой выдержки. Может контроллер просто не успевает один байт прожевать, а ты ему уже второй пихаешь?

выдержку поставлю… не понимаю почему RS (PortA,0) выдаёт статический ноль…
кстати, на порте C точно такой же код и ситуация иная… RS работает, а E (PortC,2) статический ноль…

DI HALT :

А какой контроллер? Может забыл запитать портА? Плюс на Атмега16,32 по дефолту включен жтаг и порт С наполовину не работает, т.к. на нем висит жтаг. Его надо выключить программно или фузбитом.

так ATmega32 и есть… может быть в этом и кобыла зарыта…
а про порт А не понял… там же ADC входы, просто сконфигурировал их на выход.

DI HALT :
AVCC подключен к питанию?
как проверю, сообщу, что с портом С получилось.
вставил MCUCSR |= (1<DI HALT :
Надо дважды вставлять. Он сбрасывается двойной записью в течении 8 тактов.

DI, спасибо за ответы! Экран заработал через порт С после отмены JTAG. (Грабли, конечно, в следующий раз буду смотреть).

dima_m :
Рыжая лапка котика умиляет. Так хочется ее потрогать.
DI HALT :
Приходи в гости 🙂
dima_m :
Как только жизнь закинет в Челябинск сразу зайду. Надеюсь к этому времени котик не помрет.
Prompt_ :

Di? привет, скажи, примеры кода в чем написаны?
я понимаю что под Атмегу, но я хочу на PIC и уверен что есть под него аналогичная среда программирования.

DI HALT :
AVR Studio. Для PIC вроде бы аналог это MPLab или как то так.
captain_SISka :

Также весьма интересен дисплейчик от телефона Siemens S65. 132×176, 64k colors.
Управляется по SPI (5 проводков в сумме). Есть готовая библиотека для AVR. http://www.superkranz.de/christian/S65_Display/DisplayIndex.html

dima_m :

Di привет. А ведь заметил я, что ты чаще стал писать примеры для статей на си. Видать ассемблер тебя слегка уже подзаколупал.

DI HALT :

Просто я попутно готовлю почву перехода на STM32 и ARM и потому писать на асме это путь в один конец. А на Си код переносится махом. Обрати внимание как он написан, железоориентированного кода в самом коде минимум. Разве что в дефайнах всяких. Потом просто эти примеры под STM32 портирую и все. А так, свои проекты пишу и на том и на другом. В зависимости от масштаба задачи.

Не в тему, но близко: кто знает, существует ли таблица с обзором и сравнением символьных ЖК типа WH-ххyy от различных производителей? Чем отличаются, какие фичи, питания, доп. интерфесы, етс. Развелось куча подобных (типа FECCxxyy,DV-xxxxx, др.),
цены на 1602 видел аж 83р в розницу ..

Если посмотреть на тайминги в даташите, то время исчисляется десятками наносекунд. При тактовой частоте проца 8мгц, за миллисекунду выполняется порядка 8 одно тактовых инструкций. То есть, процессор очень тормозной для LCD дисплея (почти в 1000 раз) и поэтому задержки в командах чтения записи можно полностью убрать.
Я проверял на дисплеях MTG-S12864B WM-G1206M все работает.

patron :

Собрал схемку на меге8, подключил дисплей, у меня HG12605ny, на нём всё тот же ks0107b и 08. В протеусе всё работает, но вот в готовом устройстве дисплей не проявляет никаких признаков жизни. Можно как-то проверить работоспособность в принципе? может демка или чтоб всё вместе засветилось или даже пусть всё болото из памяти какое есть. Посоветуйте.

Важно наличие отрицательного напряжения на выводе Vo. Некоторые урезанные дисплеи не имеют на борту инвертора, выдающего отрицательное напряжение на вывод Vee.

SergBagin :

Всем привет!
Не так давно стал изучать программирование AVR на С c Atmega16
Появился индикатор FDCG12864B хотел бы его подключить вывести графику и текст.
Возник вопрос:
1. линии CS1 и CS2 у моего дисплея инвертные это как?
2. есть у кого программа на С с выводом текста и графики
и подключение его согласно программе?

flamingo :

Добрый день. Подскажите, можно ли «подружить» msp430g2231(14 ножек) с дисплеем WG12864(20 ножек)? есть ли возможность использовать 4-х битную передачу данных?

DI HALT :

Наверняка. Если портов хватает, то не вижу проблем. С другой стороны может быть конфликт уровней 3.3-5 вольт (контроллер скольки вольтовый?), но он решается.

flamingo :

Контроллер на 3.3 В работает, у дисплея мин. 3.5 В. Возникнет конфликт? или это уже надо «вживую» смотреть.
Проблема была в нехватке ножек у контроллера для управления дисплеем. Можно использовать, как выход, сдвиговый регистр 74HC595? Чем это грозит? Сильно скажется на быстродействии?

DI HALT :

Да, надо разбираться с соглассованием уровней. Ставить делители и подобные ухищрения. Можно, но быстродействие упадет раз в ~20 раз. При той же загрузке контроллера. Думаю вам куда проще будет использовать дисплей со SPI интерфейсом. Он требует всего 4 провода максимум.

sasha85ru :
у WG12864B распиновка выводов другая?
KoteNegodue :

DI, не подскажешь в чём может быть ошибка (кроме ДНК):
при вызове функции установки пикселя выводится столбец пикселей.
компилил в AVR Studio 5
индикатор (LGM12641BS1R) подключаю к атмеге 128.
вот такая реакция на PIXEL (0,0);
http://imageshack.us/photo/my-images/854/protn.jpg/ никаких элементов кроме жки и контроллера на схеме нет.

DI HALT :

Где то у тебя маска прохерилась. Т.е. вместо установки пикселя (одного бита) вгоняется байт. Ну и это, протеус нах. Делай вживую.

grigoriy :

При работе с графическими модулями, возникают весьма существенные
трудности/неудобства.
Они связаны с несовершенством имеющихся в наличии программ, которые
рассчитанны на работу с графическими модулями.
В частности, такие трудности/неудобства возникают на стадии
«конструирования» как «кадра», так и его элементов.
На сайте http://ikarab.narod.ru имеются программы KS0108 существено
помогающие при программировании контроллеров PIC.
ВОПРОС: МОЖНО ЛИ ДОДЕЛАТЬ ДЛЯ ТОГО ЧТОБЫ У KS0108 БЫЛА ВОЗМОЖНОСТЬ РАБОТАТЬ С ATmega ?

DI HALT :
Можно конечно, кто мешает? Берите и доделывайте.
Aleksandr88 :

Хорошая статья все работает отлично но вот только не могу вывести картинку
,картинка записана во flash память .Я читаю адрес массива в переменную «а»
char a=pgm_read_byte(&(lol1[0])); вставляю в функцию
BLOCK(1,1,1024,0×0054);но результата 0 .В чем может быть проблема?

badc0d3 :

Ценник в 500 рублей — совершенно конский. За 300 можно купить цветной LCD с SPI интерфейсом для нокии 6100 — 128х128, 65536 цветов. Даташит на контроллер — есть. Более того, олимекс даже кучу плат на полном серьезе с ними выпускает. Как раз по этой самой причине — нет смысла делать допотопно выглядящий девайс когда можно сделать куда симпатичнее и функциональнее за меньшие деньги.

DI HALT :

Смотря куда. В развоую самоделку может и так, а в серийное устройство я ставлю то, что без проблем можно купить, а потом без колхоза установить.

А кто нибудь из вас знает как надо запрограммировать Atmega2560, чтобы подключить к нему TFT дисплей на контроллере SSD1963, SSD1289 или XG7100 ?

redradist :

Подскажи пожалуйста, какие есть визуальные средства редактирования матриц для LCD . Я имею ввиду, чтобы bin файл отображался как на рисунке в виде квадратиков 1 и 0. То есть, чтобы можно было нарисовать визуально в этой матрице шрифт текста или эмблемку какую мне необходимо . И сразу было видно как она будет смотреться на дисплее … )

Dima_Em :
Здравствуйте. Подойдет ли вместо WG12864A вариант?
Dima_Em :

DI HALT немного не понял с системой команд точнее не совсем понятно название первого столбца RS может быть опечатка и надо «DI»

DI HALT :
chiesel :

Привет всем! Это мой первый пост на этом замечательном сайте. Я всего несколько месяцев, как начал программировать на языке Си, ну, и в качестве очередного эксперимента написал небольшую библиотеку для МК PIC24F, работающую с ЖК индикаторами на базе графического контроллера KS0108. Полагаю, при желании не составит труда перенести ее и на архитектуру AVR. Итак, есть проект для Proteus-а и пара небольших примеров, демонстрирующих возможности этого рукобл… делия. Могу выложить их (правда, не знаю, как это сделать… 🙂 ).

DI HALT :
Спасибо, добавил в статью.

Обьясните мне как так получилось что на моем дисплее обратная полярность по питанию. Взял распиновку именно с этой стати, подключил и микросхемы дисплея сразу закипели. Когда начал выяснять в чем проблема то оказалось 1-й вывод это плюс а второй-минус а у Вас в статье наоборот. В итоге дисплей вышел со строя.

DI HALT :

Распиновку надо всегда брать не со статей, а с конкретного даташита. Т.к. Там полно подверсий с разными включениями и кто знает какой у вас.

serj32 :
На рисунке изображена координана не X=45 ,а X=44
xorkrus :

У меня на руках дисплей от плоттера с аналогом KS0108 — s6b0108. Выводы CS1 CS2 сидят на земле. Как быть? И что за вывод Di на схеме?

Volldemar :

CS1 CS2 сидят на земле — значит выбраны оба внуьренних контролера.
D/I — Данные/команда. Логический уровень на этом выводе определяет предназначение кода на шине данных. 1 — данные, 0 — команда.

xorkrus :

какой-то год спустя…
С CS-ами понял: у s6b0108 есть CS1B CS2B CS3. Выбор активного идет как L L H. Вот первые два уже L, а третьим собственно и выбираем. Это так, к слову…
А вот линии D/I нет. Или правильней сказать, я не врубился, как она подключена. Ноги ks0107 и s6b0107 одинаковые, но ни там ни там нет D/I. Какая она должна быть?

Есть плата с mega32, но ноги у неё запаяны наоборот т. е. DB0 к PD7, DB1 к PD6 и т. д. Изображение на экране высвечивается неправильно, что делать?

DI HALT :
Изнутри совать байт в другом порядке только и всего.
«После записи инструкции, адрес Y увеличивается на 1 автоматически.»
Как уменьшать этот адрес?
Volldemar :

Подключаю аналогичный ЖКИ к стм32, в общем то наверное это не важно. Суть такова, что не сбрасывается бит BUSY, т.е при вычитке байта состояния этот бит всегда в 1. Что не нравится индикатору? Из-за чего такое может быть?

Toolbox :

Не то что бы я вам не доверяю, но очень люблю читать официальную документацию, а при поиске ks0107/ks0108 можно найти только описание непосредственно чипов, а при поиске WG12864 только физические параметры дисплея.
Где описан протокол? Или таких доков нет?

Доброго времени суток!
Провожу расследование: http://ru-radio-electr.livejournal.com/1377659.html
Наткнулся на то, что в 2х разных даташитах команды указаны наоборот. Хотя 99% информации совпадает. Такое может быть или опечатка? PS: Мне нужно найти аналог EDT EW13B30GLY

Artos5 :

Добрый день всем!
Задача:
Перевести код под CVAVR.
Проблема:
Уже все переделал кроме этой строки:
LCD_WR_DATA(pgm_read_byte(addr),CSS); // Пишем туда данные прям из флеша (таблица символов).
Ругается на pgm_read_byte(addr) — это что такое? Получение адреса? Подскажите пожалуйста как можно по другому сделать.

DI HALT :

Это чтение данных из флеша. Чисто GCCшный подход. У CVAVR будет что то другое. Ищи как делается в CVAVR чтение данных из памяти программ и делай тем способом.

Алексей :

Вопросик, у знакоситензирующих экранов типа 1604 и графических 12864, данные постоянно регенерируются на экране из буфера самого экрана, т.е. один раз записал в буфер данные выводимые на экран и он сам дальше отображает их, пока не запишешь новые данные для вывода на экран? Или их как у больших RGB TFT 800×640 нужно постоянно с определенной частотой выводить данные обновляя одну и туже картинку?

DI HALT :
Обновлять не надо. Достаточно один раз записать.
Максим :

Интересно.
Повторил эксперимент на похожем индикаторе, у меня это EA DIP128-6. Правда он у меня подключён через MCP23S17 по SPI, а то ног контроллера жалко. Всё работает.
Но есть необходимость улучшений:
при выводе текста неразумно используется RAM: потому что при инициализации сообщения загружаются в RAM (откуда и выводятся программой) из флеша (а откуда ещё?). Логичнее такие сообщения хранить в флеше и выбирать напрямую, не используя RAM.
Например так:
Дополнительная функция на основе Вашей, поэтому многие комментарии не изменены. Изменены имена связанных функций, из-за интеграции в другую систему. // Процедура вывода строки. На входе строка, и координаты. Х в страницах, а У в точках.
// Daten in Flash
void graph_128x64_putsP(u8 x,u8 y,PGM_P data) // aka LCD_putc
// Beispiel: graph_128x64_putsP(0,0,PSTR(«Ich habe das geschafft!»));
// Beispiel: graph_128x64_putsP(2,0,PSTR(«Всё работает. »)); u8 sym;
sym=pgm_read_byte(data); while (sym!=’\0′) < // Пока первый байт строки не 0 (конец ASCIIZ строки)
if(1227) break; // Если экран и вниз кончился — выход.
> //sym = *string-0x20; // Вычисляем из ASCII кода смещение в таблице символов.
// Для русского языка и цифр надо условия добавить. Т.к.
// таблица там не полная, не 255 байт.
sym -= 0x20;
if(sym > 0x5f) sym -= 0x20; y = graph_128x64_block(x,y+1,5,(u16)symboltable+sym*5); // Закатываем этот блок.
data++; // Не забывая увеличивать указатель,
sym=pgm_read_byte(data);
>
>

Максим :

Всё-таки оказалось удобнее выводить текст на графический индикатор не через функцию вывода блока, а через функции с интерфейсом, аналогичным интерфейсу символьного индикатора.
Причины: возможность вывода одиночного символа, единство интерфейса. Две static uint8_t работают как аналоги указателей курсора в LCD. Переменная mode служит для организации инверсного вывода, при котором вначале строки добавляются 2 байта фона и при переносе строки строка заполняется до конца фоном.
static u8 cur_x = 0, cur_y = 0, mode = 0;
// cur_x = 0…7, cur_y = 0…127
// mode = 0 обычно, mode = 0xff инверсно void graph_128x64_setcursor(u8 x,u8 y) < // Set Cursor x=0…7 y=0…127
cur_x = x;
cur_y = y;
> void graph_128x64_setmode(u8 mm) < // 0 = нормально, !0 = инверсно
if(mm) mode = 0xff;
>else mode = 0;
>
> void graph_128x64_schreiblinie(u8 byte) < u8 str = GRAPH_128X64_EN1;
if(cur_y > 63) str = GRAPH_128X64_EN2;
> graph_128x64_writedata(byte, str);
cur_y++;
if(cur_y == 64) graph_128x64_set_addrY(0);
>
> void graph_128x64_zweibytes(void) if(mode) graph_128x64_adrmode();
graph_128x64_set_addrY(cur_y);
graph_128x64_set_pageX(cur_x);
graph_128x64_schreiblinie(mode);
graph_128x64_schreiblinie(mode);
>
> void graph_128x64_tippzeichen(u8 zeichen) < // выводит знак if(cur_y >122) < // если инверсия, заполнить строку
if(mode) graph_128x64_set_addrY(cur_y);
graph_128x64_set_pageX(cur_x);
while(cur_y 7) < // если 7. строка заеончилась , писать в строку 0
cur_x = 0;
> graph_128x64_zweibytes(); // если инверсия, в начале строки 2 линии
> zeichen -= 0x08; // поскольку первые 8 знаков отсутствуют
if(zeichen > 0x77) zeichen -= 0x20; // для русского graph_128x64_adrmode(); graph_128x64_set_addrY(cur_y);
graph_128x64_set_pageX(cur_x); for(u8 i=0;i <5;i++)graph_128x64_schreiblinie(mode ^ symboltable[zeichen][i]);
>
graph_128x64_schreiblinie(mode);
> // Вывод строки в актуальную позицию курсора
// строка находится в RAM
void graph_128x64_string(char *byte) graph_128x64_zweibytes(); while(*byte != 0) graph_128x64_tippzeichen(*byte);
byte++;
>
> // Вывод строки в актуальную позицию курсора
// строка находится во Flash PROGMEM
void graph_128x64_string_P(PGM_P byte) u8 temp; graph_128x64_zweibytes(); temp=pgm_read_byte(byte);
while(temp != 0) graph_128x64_tippzeichen(temp);
byte++;
temp = pgm_read_byte(byte);
>
> // Вывод строки в актуальную позицию курсора
// строка во Flash als const __flash
void graph_128x64_string_F(const __flash char *byte) u8 temp; graph_128x64_zweibytes(); temp = *byte;
while(temp != 0) graph_128x64_tippzeichen(temp);
byte++;
temp = *byte;
>
>

Сергей :

Я https://tehnopage.ru/regulirovka-yarkosti-lcd-128×64 тут подсмотрел как программно регулировать яркость в этом дисплее. В помощь начинающим)

Аноним :

почему выдает ошибки при прошивке контроллера atmega328p pu через программатор arduino uno #include
#include
#include
#include
#include #include int main()
LCD_INIT(); DEBUG_UP;
LCD_putc(2,20,»Di Halt»);
LCD_putc(0,1,»EasyElectronics.ru»);
DEBUG_DN; return 0;
>

DI HALT :
Какие ошибки то?

«Весь код можно поглядеть в нашей кодосвалке:
lcd_wg128.h
lcd_wg128.c» (c)
Заше по ссылкам, а в ответ:
«Листинг не найден!»
О-о-очень надо.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *