1. Введение в LCD12864
- Жидкокристаллический дисплей LCD12864, то есть на экране всего 128 * 64 точек, и каждая точка имеет только два состояния: включено и выключено
- Здесь я использую библиотеку шрифтов, которая может отображать китайский язык напрямую, без самостоятельного кодирования и отправлять данные в 8-битном параллельном режиме.
- Я не буду рассказывать, как отображать картинки, инструкции и быстрый старт знаний, чтобы получить отображаемые результаты.
Чем отличается экран lcm12864c от 12864b
Графический дисплей 128×64: инструкция, примеры использования и документация
Используйте графический дисплей 128×64 для вывода текста, отрисовки графиков и отображения простых картинок. Монохромный экран выполнен по технологии LCD c разрешением 128×64 пикселей.
Графические дисплеи применяются в домашних охранных системах, робототехнике, МФУ-устройствах, вендинговых автоматах и турникетах общественного транспорта.
Примеры работы для Arduino
Мозгом для проекта выступит платформа Arduino Uno.
Подключение и настройка
Для начала необходимо собрать железо и выполнить программную настройку.
Что понадобится
Схема подключения
| Контакт дисплея | Контакт Arduino | |
|---|---|---|
| 1 | VCC | 5V |
| 2 | GND | GND |
| 3 | VO | К потенциометру, подробности ниже. |
| 4 | DB0 | 13 |
| 5 | DB1 | 12 |
| 6 | DB2 | 11 |
| 7 | DB3 | 10 |
| 8 | DB4 | 9 |
| 9 | DB5 | 8 |
| 10 | DB6 | 7 |
| 11 | DB7 | 6 |
| 12 | CS1 | 5 |
| 13 | CS2 | 4 |
| 14 | RST | — |
| 15 | RW | GND |
| 16 | DC | 3 |
| 17 | EN | 2 |
| 18 | VEE | К потенциометру, подробности ниже. |
| 19 | LED A | 5V |
| 20 | LED K | GND |
Центральный контакт потенциометра подключите к контакту дисплея VO, а два крайних — к контактам дисплея VEE и земле GND.
Программная настройка
Вывод текста
Для старта выведем на дисплей приветствующую строку Hello World.
В отличии от текстовых дисплеев, графический экран не хранит в себе алфавиты и типографические символы. Шрифты загружаются в контроллер вместе с пользовательской программной. Библиотека U8g2 предоставляет широкий список шрифтов на любой вкус и цвет..
Вывод текста: шрифты
Внесём немного красок в проект, выведем текст на экране различными шрифтами.
Вывод текста: кириллица
В продолжении выведем на дисплей текст в кириллице. Для вывода кириллицы используйте соответствующие шрифты.
Вывод геометрических фигур
Далее отрисуем на дисплее геометрические фигуры.
Вывод символов Unicode
А ещё графический дисплей позволяет выводить символы из кодировки Юникод. Для вывода Unicode используйте соответствующие шрифты.
Вывод изображений
В завершении выведем на экран дисплея монохромное изображение. Для этого воспользуйтесь графическим редактором GIMP и преобразуйте исходную картинку в текстовый массив чисел .xbm .
Основные правила при конвертации изображения:
Элементы дисплея
Дисплей
Дисплей MT-12864J выполнен на монохромной жидкокристаллической матрице с разрешением 128×64 пикселей. Каждый пиксель поддерживает только два состояния: включён или выключен, 1 или 0, true или false.
Матрица экрана подключена к драйверу дисплея, который выполняет роль посредника между экраном и управляющим микроконтроллером.
Драйвер дисплея
В систему драйвера входит три чипа: два контроллера сегментов KS0108 и один контроллер общих линий KS0107.
Контакты подключения
На плате дисплея выведено 20 контактов для подключения питания и взаимодействия с управляющей электроникой.
Мини-панель приборов на дисплее LCM12864 и ATmega64
Предлагаю всем желающим собрать новую, более модернизированную версию устройства, которая теперь включает в себя следующие функции:
- индикации текущего времени с применением более точной микросхемы RTC DS3231 (на Ali)
- измерения температуры двигателя с помощью датчика PT-100 (на Ali)
- измерения температуры окружающего воздуха с помощью DS18B20 или с помощью датчика температуры, встроенного в микросхему реального времени
- измерения напряжения бортовой сети (со шкалой) 7 — 16В
- измерения частоты вращения коленчатого вала двигателя (со шкалой) 300 — 9900 об/мин
- измерения скорости движения 0 — 255 км/ч
- одометры: суточный с возможностью сброса, и общий; запись в энергонезависимую память микроконтроллера
Шрифты, отображающие температуру и обороты двигателя увеличены, а часов — уменьшены.

Так же устройство имеет дополнительные функции, такие как
- автоматическая смена яркости подсветки дисплея в зависимости от внешнего освещения (более плавная по сравнению с предыдущей версией устройства)
звуковые и визуальные:
- индикация включенных указателей поворота
- предупреждение о слишком низком или недопустимо высоком напряжениях бортовой сети
- предупреждение о перегреве двигателя
- есть возможность отключить звук
- программная калибровка вольтметра
- установка верхнего и нижнего порогов предупреждений для контроля напряжения бортовой сети
- установка порога предупреждения о перегреве двигателя
- настройка параметров «длина окружности колеса» и «кол-во магнитов» для датчика скорости мотоцикла; для автомобильного датчика «длина окружности колеса» устанавливается 100 см, а «кол-во магнитов» — количество импульсов на 1 метр
- установка значения «импульс/оборот» для тахометра, и возможность указать максимальные обороты, при которых шкала будет полностью заполнена
- установка уровня яркости подсветки для дневного и ночного времени
Для настроек и управления добавлена 3-я кнопка «—», уменьшающая параметр. Добавлен быстрый перебор устанавливаемого параметра при длительном удержании кнопки. Печатная плата разведена под размер дисплея и его контакты, а питание устройства и входные сигналы выведены на одну сторону платы.

Схема уже довольно большая, но на самом деле ничего сложного в ней нет.

Основа — микроконтроллер ATmega64, вывод информации — графический дисплей 128х64 точек с контроллером KS0108 и звуковой излучатель типа 1212FXP обязательно со встроенным генератором. Питание цифровых элементов — на стабилизаторе 7805, микроконтроллер питается отдельно (линия U1_VCC) через диод Шоттки D2, и в момент отключения питания от бортовой сети, срабатывает детектор выключения на R1 и R2 — программа обработки прерывания INT5 записывает значения одометров в энергонезависимую память. В это время микроконтроллер питается энергией, накопленной конденсатором C4. Все остальное — обработка входящих сигналов транспортного средства, кратко о них в статье предыдущей версии. JP1 — джампер переключения в режим программирования — во время прошивания МК вывод PEN нужно подтянуть к GND. Разъём J1 ISP — для внутрисхемного программирования. Фьюзы выставляются следующим образом:

По фьюзам хочу дать совет тем, кто мало знаком или впервые работает с AVR микроконтроллерами. Чтобы не «запороть» камень, в любой программе (PonyProg, Khazama AVR Programmer и т.п.), делается так: сначала считываем фьюзы, смотрим, отмечен ли SPIEN галочкой; если да, то фьюзы ставим как на картинке в статье, если нет — выставляем инверсно. Правильно собранная схема с прошитым микроконтроллером в настройке не нуждается и запускается сразу. Разве что нужно покрутить RV1 для установки контрастности дисплея и RV2 для калибровки датчика температуры двигателя. Для этой цели был выбран датчик PT-100, — стоит он недорого, позволяет измерять, в отличие от DS18B20, температуры более +125°С и выглядит примерно так:

Измерение температуры окружающего воздуха (или если кому надо — внутри салона) может осуществляться двумя способами: с помощью встроенного в микросхему часов датчика или внешнего DS18B20. Чтобы измерять датчиком из DS3231, на разъем ISP нужно поставить перемычку (джампер) как на фотографии, подтянув линию TEMP_SENS к GND. Для измерения цифровым внешним датчиком, его нужно подключить к тому же разъему программирования (ISP) согласно полярности (VCC, GND), а линию TEMP_SENS (на ISP она совпадает с MOSI) к выводу DQ датчика.

Печатная плата изготавливается из двухстороннего фольгированного текстолита.






Кнопки располагаются на отдельной плате со шлейфом и разъемом для подключения:

Управление осуществляется следующим образом. В основном режиме:
— кнопка M/SEL/ HR при длительном удержании вводит устройство в режим установки времени — часы устанавливаются этой же кнопкой, минуты — ENT/+/ MIN .
— кнопка ENT/+/MIN при коротком нажатии сбрасывает суточный одометр, но не сразу. На месте счетчика появляется вопрос «Сброс?», подтверждаем кнопкой M/SEL/HR. Если не подтвердить, то через 3-4 секунды устройство вернется в нормальный режим. Общий одометр сбросить кнопками нельзя. Если нужно обнулить или выставить начальное значение пробега, надо считать программатором EEPROM из микроконтроллера, общий пробег содержится в 4-х байтах, начиная с 16-й ячейки (выделено красным):

При этом они расположены от младшего к старшему. То есть если брать пример с картинки выше, в красном прямоугольнике записано число 01 6A (00 00 01 6A) в шестнадцатеричном формате, что соответствует десятичным 362 км пробега. Редактируем считанный файл EEPROM, выставляя нужный пробег. Прошиваем.
— кнопка » — » при коротком нажатии включает-выключает звук на устройстве. При выключенном звуке справа от часов появляется значок перечеркнутого динамика.
Чтобы попасть в меню настроек, нужно произвести включение устройства с зажатой кнопкой M /SEL/HR:

выбор пункта осуществляется той же кнопкой M/ SEL /HR
вход в выбранный пункт — с помощью ENT /+/MIN
установка параметра с помощью ENT/ + /MIN и » — «
При первом входе в меню некоторые значения могут быть 255 или 65535 — это следствие того, что ячейки энергонезависимой памяти еще пусты. Нужно установить адекватные параметры настроек и выйти из меню выбрав пункт «Сохранить и выйти».
К статье прикреплены 2 архива. Первый содержит прошивки для версий устройства со спидометром-одометром и без них, проект Proteus, файл печатной платы в формате LAY. Второй содержит прошивку, печатную плату и проект для этого же устройства, только с дисплеем разрешением 192×64 точек. Места на нем предостаточно, поэтому шкала и цифры тахометра и скорости, заметно больше:



В ближайшее время планирую добавить функцию измерения уровня топлива с калибровкой — для этого на платах устройств уже зарезервированы входы на незадействованные половины операционных усилителей. Прошивки обязательно добавлю в эту статью.
Подключение графического ЖК дисплея ST7920 к Arduino
Обычные ЖК дисплеи 16х2 достаточно широко распространены в современных радиоэлектронных проектах, однако их возможностей хватает далеко не всегда, поскольку они могут отображать на своем экране только буквы и цифры (и некоторые другие символы) фиксированного размера. Поэтому в данной статье мы рассмотрим подключение графического ЖК дисплея ST7920 к плате Arduino. Данный дисплей имеет размер 128х64 точек, то есть общее количество точек на экране этого дисплея равно 8192, что эквивалентно 8192/8 = 1024 пикселям. Поэтому кроме обычных букв и цифр данный дисплей способен отображать на своем экране и различные графические изображения.

На нашем сайте мы уже рассматривали подключение различных дисплеев к плате Arduino:
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Графический ЖК дисплей 128х64 ST9720 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Соединительный провода.
- Макетная плата.
Работа схемы
Схема подключения графического ЖК дисплея ST7920 к плате Arduino представлена на следующем рисунке.

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

Графический ЖК (жидкокристаллический) дисплей 128х64
Данный дисплей отличается малым энергопотреблением и подходит для использования в устройствах, питание которых осуществляется от батареек. Он поддерживает диапазон питающих напряжений от 2.2v до 5.5v, 8/4-битный параллельный режим работы и поставляется вместе с микросхемой контроллера/драйвера ST7290. Кроме параллельного режима работы можно также использовать последовательный режим работы по шине PSB (processor side bus) (PIN 15). Этот графический ЖК дисплей имеет автоматическое управление мощностью и возможность программного сброса, что позволяет без проблем подключать его к большинству современных микропроцессорных платформ, например, 8051, AVR, ARM, Arduino и Raspberry Pi.

При необходимости более подробного изучения возможностей данного ЖК дисплея вы можете изучить даташит на него.
Назначение контактов графического ЖК дисплея ST7920 приведено в следующей таблице.
| № контакта | Название контакта | Описание |
| 1 | Gnd | земля |
| 2 | Vcc | входное питающее напряжение (от 2.7v до 5.5v) |
| 3 | Vo | контрастность |
| 4 | RS | Выбор регистра: RS = 0 — регистр инструкций, RS = 1 — регистр данных |
| 5 | R/W | управление чтением/записью |
| 6 | E | Enable (доступность) |
| 7,8,9,10,11,12,13,14 | DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7 | контакты данных (возможна работа в 8 и 4-битном режиме) |
| 15 | PSB | выбор интерфейса: Low(0) — последовательная связь, High (1) — 8/4 параллельный режим |
| 16 | NC | Not connected (не соединен) |
| 17 | RST | Reset Pin (сброс) |
| 18 | Vout | выходное напряжение (Vout<=7 В) |
| 19 | BLA | подсветка (положительный вывод) |
| 20 | BLK | подсветка (отрицательный вывод) |
Конвертирование изображения в шестнадцатеричный код
Для того, чтобы иметь возможность отображения изображения на графическом ЖК дисплее необходимо знать шестнадцатеричный код (HEX code) данного изображения. Далее мы рассмотрим несколько шагов чтобы выполнить подобное конвертирование. Но перед этим удостоверьтесь в том, что размер вашего изображения не превышает 128х64.
Шаг 1. Уменьшите размер вашего изображения до 128х64 или менее. Это можно сделать в любом графическом редакторе, например, MS paint.

Шаг 2. Сохраните изображение в формате bmp (“image_name.bmp”).

Шаг 3. Конвертирование полученного изображения в шестнадцатеричный код. Для этого можно использовать, к примеру, редактор GIMP 2. На следующем рисунке показан пример открытия изображения в данном редакторе.

Шаг 4. После открытия изображения (в формате bmp) в редакторе GIMP 2 сохраните его в формате “.xbm” (X BitMap) (см. рисунок ниже). После этого откройте полученный файл в любом текстовом редакторе, например, Notepad, и вы получите шестнадцатеричный код изображения.
Сначала выберите опцию «Export as» в редакторе.

Затем выберите формат, показанный на следующем рисунке, и нажмите кнопку Export.

После этого экспортирования вы получите файл в формате “.xbm”. Откройте его с помощью Notepad (или любого другого аналогичного редактора) и вы получите шестнадцатеричный код изображения как показано на следующем рисунке.

Объяснение программы для Arduino

Для работы с рассматриваемым в данном проекте графическим дисплеем необходимо скачать библиотеку по следующей ссылке. Далее эту библиотеку необходимо подключить в программу:
Дисплей 12864b v2.0 (Arduino)
Графический дисплей 12864b v2.0 (ST7920) представляет собой ЖК-матрицу с разрешением в 128 на 64 точек, предназначен для вывода графической и текстовой информации. Поддерживает 8/4-битный параллельный режим работы и поставляется вместе с микросхемой контроллера/драйвера ST7290. Также дисплей поддерживает последовательный режим работы по шине PSB (программный SPI), именно в этом режиме будет работать описанный в этой статье дисплей.

Основное напряжение питания +5 В, дополнительное 3,3 В используется для подсветки дисплея. Рассматриваемый в статье дисплей на плате имеет регулятор контрастности, но может поставляться и без него, тогда на вход Vo подается напряжение с потенциометра (см. схему).


Подключение дисплея к Arduino Nano:
| Дисплей | Arduino |
| Vss или GND | GND |
| Vdd или VCC | +5V |
| Vo | не используется (см. выше) |
| RS | D12 |
| R/W | D11 |
| E | D10 |
| PSB | GND |
| BLA |
+3.3V |
| BLK |
GND |
При работе с дисплее можно использовать библиотеку U8glib , в папке библиотеки много различных примеров скетчей. Установить библиотеку можно через менеджер библиотек Arduino IDE.


Для поддержки русского шрифта скачайте архив шрифта и распакуйте его в папку со скетчем.
Ниже показан пример создания простых часов, в примере используется модуль часов реального времени DS3231. Время устанавливается по времени компиляции.

Для поддержки семисегментных цифр скачайте архив шрифта и распакуйте его в папку со скетчем.
Графической дисплей WG12864B-TML-T (Arduino)
Графический дисплей WG12864B-TML-T (G12864B REV.J) представляет собой ЖК-матрицу с разрешением в 128 на 64 точек, предназначен для вывода графической и текстовой информации. Контроллер дисплея ks0108, который имеет восьми битовый интерфейс. Вывод Обозначение Назначение 1 Vcc Напряжение питания (5V)) 2 GND Общий вывод (0V 3 V0 Вход питания ЖК панели 4 DB0 Шина данных (младший бит) 5 DB1 Шина данных 1-й разряд 6 DB2 Шина данных 2-й.
OLED 1.3″ I2C 128х64 (Arduino)
OLED 1.3″ I2C 128х64 дисплей обладает высокой контрастностью, высоким разрешением и низким энергопотреблением. В OLED дисплее отсутствует дополнительный слой подсветки всей поверхности экрана. Каждый пиксел, формирующий изображение, испускает самостоятельное свечение. Чип драйвера — SH1106, который обеспечивает связь I2C. Параметры дисплея SH1106: Технология дисплея: OLED Разрешение дисплея: 128 на 64 точки Диагональ дисплея: 1,3 дюйма Угол обзора > 170° .
LCD0802 (Arduino)
LCD0802 дисплей работает на контроллере HD44780 и полностью совместим с библиотекой LiquidCrystal которая интегрирована в Arduino IDE. Дисплей имеет две строки по 8 символов. Размеры платы дисплея 58х32 мм. Схема подключения Распиновка Настройка контрастности производится путем установки резистора 2. 2,7 К между выводами Vo и GND. Тестовый скетч: #include <LiquidCrystal.h> // подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16×2 LiquidCrystal lcd(12, 11.
Дисплей 2X16 VFD (Arduino)
Дисплей VDF1602 (16T202DA1E) выполнен на базе вакуумно-люминесцентного индикатора, который может отображать ASCII символы в 2 строки (16 знаков в 1 строке) каждый символ в виде матрицы 5х7 пикселей. Дисплей 16T202DA1E программно полностью совместим с дисплеем LCD1602 контроллере HD44780, поэтому использует стандартную библиотеку LiquidCrystal которая интегрирована в Arduino IDE. Для правильной работы базе вакуумно-люминесцентного индикатора требуется два.
Жидкокристаллический монохромный дисплей QC12864B(LCD12864 на ST7920) в связке с ARDUINO NANO(ATmega328). Тест производительности на параллельном интерфейсе, программном SPI и аппаратном SPI.

Данный дисплей был приобретён из-за относительной дешевизны, распространённости и доступности — у нас в Казахстане не любую радиодеталь можно пойти и купить в магазине. Непосредственно этот дисплей куплен для отображения работы контроллера освещения в аквариуме… Ну и параллельно — часы, барометр, термометр и прочая… Но сейчас не об этом.
Пока суть да дело, связка данного дисплея и Ардуино НАНО предполагалась для разного рода экспериментов. Шибко нужен мне в машину многоканальный осциллограф… Потому скорость отображения информации сильно напрягала.
В первую очередь была собрана самая скоростная(как утверждается везде) схема с параллельным подключением. Для работы была выбрана библиотека u8glib_arduino_v1.18.1.
Естественно без танцев с бубном не обошлось. Маркировка выводов везде неоднозначная и пришлось немного поиграть в пятнашки, нащщупывая нужную комбинацию соединения выводов между собой. В итоге получилось вот это:

Прилагаемые к библиотеке примеры заработали и тут во всей красе встала проблема дефицита цифровых выводов на Ардуине — их осталось всего 3… :(((
Извернуться конечно можно(нам не привыкать!), но немного поразмыслив я решил таки поэкспериментировать с SPI. Везде в инете заявляется более медленная работа SPI по сравнению с параллельным интерфейсом(не даром же столько ног и проводов изводится?!), но точной цифры не указывал никто. Неминучее замедление вывода на дисплей страшно расстраивало, но деваться было некуда… Опчем, я решился на эксперимент!
Сам дисплей по умолчанию сконфигурирован на заводе под параллельный режим. Переключиться на последовательный режим простой подачей соответствующего сигнала не получилось — всё тут же вырубалось нах. Оказывается вместо резистора на плате припаяна перемычка(экономят даже на этом?!) и без пайки SMD деталей обойтись не получилось.
Перепаял потроха дисплея связанные с PSB и получил программный SPI:
Резистор(с нулевым сопротивлением) R9(красная стрелочка) выпаиваем.
На пустое место резистора R10 припаиваем резистор, какой не жалко — от 1 кОм до 100 кОм.
Всё. Дисплей теперь гутарит только на SPI.
Запустил для начала на тех же проводах, ничего в шлейфе вообще не перепаивая. Каково же было моё удивление, когда FPS(кадры в секунду) не только не уменьшился, но и возрос! Простенький тест FPS библиотеки показал рост от двадцати процентов до полутора раз. Вот тебе бабушка и юрьев день!
Воодушевлённый таким поворотом дел я полез разбираться с аппаратным SPI. Аппаратный SPI можно реализовать только на определённых ножках микропроцессора, потому опять пришлось помудрить с проводами:

Но всё в итоге заработало.
Тест показал очередной, оченна приличный рост производительности!
В итоге при втрое меньшем количестве проводов и задействованных цифровых выводов имеем в ДВА с половиной РАЗА(! ! !) бОльшую производительность дисплея! Если сравнить видеоролики(см. ниже) — то разница в производительности связки "микропроцессор-дисплей" визуально раз в пять-семь выше. Почему так — не знаю, но то что на ARDUINO NANO еле ползёт при работе через параллельный интерфейс — реально летает при работе через HW SPI.
Ну и для начинающих приведу примеры инициализации дисплея для разных режимов для библиотеки u8glib_arduino_v1.18.1 в Ардуино IDE v1.6.10:
U8GLIB_ST7920_128X64_4X u8g(5,6,7,8,9,10,11,12,4,1,0); //Для параллельного интерфейса, цифровые выводы ардуино произвольны — при замене просто меняется строка инициализации.
U8GLIB_ST7920_128X64_4X u8g(4,1,0); //Для последовательного программного интерфейса SPI, цифровые выводы ардуино произвольны — при замене просто меняется строка инициализации.
U8GLIB_ST7920_128X64_4X u8g(10); //Для последовательного аппаратного интерфейса HWSPI, цифровые выводы ардуино задействуются только так, как указано на схеме!
