LCD 128×64 — Arduino
Подключение монохромного дисплея 128×64 к Ардуино.
Схема подключения
В продаже встречаются два варианта дисплеев, со встроенным потенциометром (крутилка для регулировки контраста) и без него.
На дисплее потенциометр выглядит вот так:
Маркировка контактов на дисплеях может различаться, но расположение одинаково для всех:
Vss или GND — GND.
Vdd или VCC — 5 вольт.
Vo — потенциометр.
D/I или IRS — пин 12 (ардуина).
R/W или IR/W — пин 11 (ардуина).
E или IE — пин 10 (ардуина).
CS1 или PSB — GND.
A или BLA — 3.3 вольта (подсветка дисплея).
K или BLK — GND (подсветка дисплея).
Пины ардуины можно использовать любые.
Схема подключения дисплея с встроенным потенциометром:
Схема подключения дисплея без встроенного потенциометра:
Потенциометр можно использовать любой от 2кОм до 20кОм.
Ардуина
Скачайте и установите библиотеку u8glib, и залейте в ардуину нижеприведённый скетч:
Для выбора шрифта необходимо обратиться к файлу (из библиотеки) utility/u8g.h.
Находим блок /* font definitions */, копируем строку в кавычках и вставляем её в void setup().
Координаты начала строки устанавливаются в функции u8g.drawStr(2, 10, «istarik.ru»);, первая цифра — отступ слева, вторая — отступ сверху.
Вот и всё )))
Вступайте в Telegram-группу Arduino
Lcd 128×64 st7920 spi подключение arduino
В продаже встречаются два варианта дисплеев, со встроенным потенциометром (крутилка для регулировки контраста) и без него.
На дисплее потенциометр выглядит вот так:
Маркировка контактов на дисплеях может различаться, но расположение одинаково для всех:
Vss или GND — GND.
Vdd или VCC — 5 вольт.
Vo — потенциометр.
D/I или IRS — пин 12 (ардуина).
R/W или IR/W — пин 11 (ардуина).
E или IE — пин 10 (ардуина).
CS1 или PSB — GND.
A или BLA — 3.3 вольта (подсветка дисплея).
K или BLK — GND (подсветка дисплея).
Пины ардуины можно использовать любые.
Подключение дисплея с встроенным потенциометром:
Без встроенного потенциометра:
Потенциометр можно использовать любой от 2кОм до 20кОм.
Скачайте и установите библиотеку u8glib, и запрограммируйте в ардуину скетч:
U8GLIB_ST7920_128X64 u8g ( 10 , 11 , 12 , U8G_PIN_NONE ); // настройка пинов
int val = 2015 ;
char val_to_char [ 5 ]=< 0 ,>;
void setup ()
<
u8g . setFont ( u8g_font_6x10 ); // Выбор шрифта
>
void loop ()
<
sprintf ( val_to_char , «%d» , val ); // функция sprintf переведёт число в строковый массив
do
<
u8g . drawStr ( 2 , 10 , «cyber-place.ru» ); // выведет надпись cyber-place.ru
u8g . drawStr ( 2 , 27 , val_to_char ); // выведет число 2015
>
Выбор шрифта в файле (из библиотеки) utility/u8g.h.
Находим блок /* font definitions */, копируем строку в кавычках и вставляем её в void setup().
.
/* font definitions */
extern const u8g_fntpgm_uint8_t u8g_font_m2icon_5 [] U8G_FONT_SECTION ( «u8g_font_m2icon_5» );
extern const u8g_fntpgm_uint8_t u8g_font_m2icon_7 [] U8G_FONT_SECTION ( «u8g_font_m2icon_7» );
extern const u8g_fntpgm_uint8_t u8g_font_m2icon_9 [] U8G_FONT_SECTION ( «u8g_font_m2icon_9» );
extern const u8g_fntpgm_uint8_t u8g_font_u8glib_4 [] U8G_FONT_SECTION ( «u8g_font_u8glib_4» );
extern const u8g_fntpgm_uint8_t u8g_font_u8glib_4r [] U8G_FONT_SECTION ( «u8g_font_u8glib_4r» );
extern const u8g_fntpgm_uint8_t u8g_font_6x12_75r [] U8G_FONT_SECTION ( «u8g_font_6x12_75r» );
extern const u8g_fntpgm_uint8_t u8g_font_6x13_75r [] U8G_FONT_SECTION ( «u8g_font_6x13_75r» );
.
LCD ST7920 и Arduino: Вывод различных данных
В статье познакомлю вас со способом, как можно вывести некоторую информацию на LCD дисплей разрешением 128×64 пикселей и контроллере ST7920 с помощью Arduino Mega. Будем выводить температуру и влажность датчиком DHT 11, время и дату с помощью модуля реального времени, уровень освещения двумя аналоговыми датчиками освещенности на фоторезисторах.
А как вывести картинку на такой дисплей узнаете здесь.
Начнем с подключения библиотек.
Библиотека U8glib — скачать
Библиотека dht11 — скачать
Библиотека RTClib — скачать
Далее производим объявление переменных.
Следующий шаг — назначение вводов и выводов.
Теперь нужно сделать прорисовку на дисплее. Сверху делаем белую строку сплошной закраски.
Устанавливаем шрифт, которым будем писать в этой самой строке. Его, кстати, тоже нужно скачать и поместить в папку библиотеки дисплея.
Шрифт LCD дисплея u8g_font_5x8 — скачать.
Нужно указать, что следующие символы мы будем писать на белом фоне отключая пиксели (0).
В этой строке мы выведем время и дату.
u8g.setPrintPos( 2, 8); u8g.print(now.day() / 10);
u8g.setPrintPos( 7, 8); u8g.print(now.day() % 10);
u8g.setPrintPos( 11, 8); u8g.print(«.»);
u8g.setPrintPos( 15, 8); u8g.print(now.month() / 10);
u8g.setPrintPos( 20, 8); u8g.print(now.month() % 10);
u8g.setPrintPos( 24, 8); u8g.print(«.»);
u8g.setPrintPos( 29, 8); u8g.print(now.year(), DEC);
u8g.setPrintPos( 101, 8); u8g.print(now.hour() / 10);
u8g.setPrintPos( 107, 8); u8g.print(now.hour() % 10);
u8g.setPrintPos( 112, 8); u8g.print(«:»);
u8g.setPrintPos( 117, 8); u8g.print(now.minute() / 10);
u8g.setPrintPos( 122, 8); u8g.print(now.minute() % 10);
Заметьте, каждому символу в строке попиксельно указано, где он будет находиться.
Теперь настроим вывод температуры и влажности. Все это уже будет написано другим шрифтом 6х10.
Шрифт LCD дисплея u8g_font_6x10 — скачать.
u8g.setPrintPos( 3, 20); u8g.print(«Humidity»);
u8g.setPrintPos( 53, 21); u8g.print(«=»);
u8g.setPrintPos( 60, 20); u8g.print(DHT.humidity, 1);
u8g.setPrintPos( 73, 20); u8g.print(«%»);
u8g.setPrintPos( 3, 31); u8g.print(«Temp»);
u8g.setPrintPos( 29, 32); u8g.print(«=»);
u8g.setPrintPos( 37, 31); u8g.print(DHT.temperature, 1);
u8g.setPrintPos( 49, 31); u8g.print(«°C»);
u8g.setPrintPos( 3, 42); u8g.print(«Light»);
u8g.setPrintPos( 29, 43); u8g.print(» — «);
if (digitalRead(sensor1) == HIGH) <
u8g.setPrintPos( 45, 42); u8g.print(«On»);
>
else
<
u8g.setPrintPos( 45, 42); u8g.print(«Off»);
>
И тут добавляем число, которое в процентом отношении показывает уровень освещенности. Подробнее об этом уже рассказывалось.
int val = analogRead(sensor2);
val = map(val, 0, 1023, 0, 100);
u8g.setPrintPos( 73, 42); u8g.print(val);
u8g.setPrintPos( 86, 42); u8g.print(«%»);
И вот что должно получиться.
#include «U8glib.h» \\библиотека для работы с LCD дисплеем
#include «dht11.h» \\библиотека для работы с датчиком влажности и температуры
#include \\библиотека для работы с I2C интерфесом
#include «RTClib.h» \\библиотека для работы с модулем часов реального времени (RTC — Real_time_clock)
RTC_DS1307 rtc;
dht11 DHT; // Объявление переменной класса dht11
int chk;
#define DHT11_PIN 12 // Датчик DHT11 подключен к цифровому пину номер 13
const int ledlight = 9;
const int sensor1 = 2;
const int sensor2 = 0;
U8GLIB_ST7920_128X64_1X u8g( 13, 11, 10); // Создаём объект u8g для работы с дисплеем, указывая номер вывода CS для аппаратной шины SPI
pinMode(ledlight, OUTPUT);
pinMode(sensor1, INPUT);
Программирование дисплея на контроллере ST7920
Здравствуйте, я хочу рассказать о программировании дисплея на контроллере ST7920 с использованием ATtiny2313 контроллера.
Характеристики дисплея
Приблизительная цена: 15$
Размер дисплее вместе с платой: 93.0 (Длина) × 70.0(Ширина) × 13.50(Высота) мм
Размер видимой области: 70×38 мм.
Дисплей имеет 2 режима работы:
- Графический
- Текстовый
В текстовом режиме дисплей имеет 4 строки и 16 знакомест на строку
В графическом режиме разрешение: 128×64 пикселя.
3 режима подключения:
- Подключение по 8 битной шине
- Подключение по 4 битной шине
- Подключения по SPI (3 битной шине)
Имеются 2 режима работы:
- Нормальный: потребление 450 мкА, 5 В
- Спящий режим: потребление 30 мкА, 5 В
В данном посте я расскажу о:
- Работе в текстовом режиме
- Подключения и программирование по 8 битной шине
- Подключения и программирование по SPI
Для того что бы подключить дисплей к контроллеру нам понадобится:
- Дисплей на контроллере ST7920
- 2 подстрочных резистора на 10 кОм.
- Для 8 битного режима резистор на 4.7 кОм (или больше)
- Контроллер ATtiny2313
- Источник питание на 5В.
Схема подключения
Подключение по 8 битной шине данных
Распиновка контактов:
GND — Земля
VCC — +5В
V0 — Настройка контрастности
RS — Определяет режим передачи данных (1 — это данные, 0 — это команда)
RW — Запись или чтения (1 — чтения, 0 — запись)
E — Строб
D0-D7 — Шина данных
PSB — Определяет какой протокол передачи данных будет использоваться ( 1 — 8/4 бит шина, 0 — SPI)
BLA — Анод подсветки (+)
BLK — Катод подсветки (-)
На схеме DB0-DB7 и PB0-PB7 не замкнуты, это 8 битная шина данных.
Реальное соединения таково:
DB0 — PB0
DB1 — PB1
DB2 — PB2
DB3 — PB3
DB4 — PB4
DB5 — PB5
DB6 — PB6
DB7 — PB7
Подключение по SPI
Распиновка контактов:
GND — Земля
VCC — +5В
V0 — Настройка контрастности
RS — (CS) Начало/окончание передачи данных (1 — начало, 0 — окончание)
RW — (SID) Шина данных
E — (SCLK) Строб
PSB — Определяет какой протокол передачи данных будет использоваться ( 1 — 8/4 бит шина, 0 — SPI)
BLA — Анод подсветки (+)
BLK — Катод подсветки (-)
Подстроечные резисторы
RP1 — Регулятор контрастности
RP2 — Регулятор яркости
Описание протоколов программирования дисплея
8 битный режим
И так, с начало я расскажу о том как в общих чертах происходит работа с дисплеем.
Для того что бы работать с дисплеем нам нужно отправлять команды и данные на дисплей.
К командам относится: Включения/выключение дисплея, отображение курсора, перемещение курсора и т.д. К данным относятся например символы которые вы хотите видеть на дисплее.
Давайте рассмотрим пример того как производится инициализация для 8 битного режима.
Давайте рассмотрим пример того как производится инициализация:
- Задержка в 50 мкс.
- Отправляем команду установки 8 битного режима.
- Задержка 120 мкс.
- Отправляем команду включения дисплея ( в ней же указывается, включить ли курсор, и мигать ли курсором)
- Задержка в 50 мкс.
- Повторно отправляем функцию установки 8 битного режима
- Задержка 120 мкс.
- Отправляем команду отчистить экран
- Задержка 20 мкс.
- Устанавливаем ENTRY MODE (эта команда говорит о том в какую сторону сдвигать курсор после написания символа, нам соответственно нужно вправо)
Вот и все, после выполнения этих действий, если вы указали в команде включения дисплея отображать курсор, на экране вы увидите курсор.
Рассмотрим как отправить одну команду на дисплей в 8 битном режиме:
- Устанавливаем низкий уровень E
- Устанавливаем низкий уровень RS
- Устанавливаем низкий уровень RW
- Задержка 1 мкс.
- Устанавливаем высокий уровень E
- Отправляем в порт данных байт команды
- Задержка 1 мкс.
- Устанавливаем низкий уровень E
- Задержка 50 мкс.
Для отправки одного байта данных выполняется абсолютно то же самое, только в начале устанавливается высокий
уровень RS.
RS = 0 Команда
RS = 1 Данные
Вот как отправляется один байт данных:
- Устанавливаем низкий уровень E
- Устанавливаем высокий уровень RS
- Устанавливаем низкий уровень RW
- Задержка 1 мкс.
- Устанавливаем высокий уровень E
- Отправляем в порт данных байт команды
- Задержка 1 мкс.
- Устанавливаем низкий уровень E
- Задержка 50 мкс.
Давайте рассмотрим код отправки команды
Для начала установим константы что бы было удобнее:
Функция отправки команды:
Функция отправки данных:
В коде был использован макрос LCD8_MACRO_DELAY, вот его код
Теперь рассмотрим команды инициализации дисплея в текстовом, 8 битном режиме:
Команда FUNCTION SET: 0 0 1 DL 0 RE 0 0
DL:
- Если установлено 1 то устанавливаем 8 бит передачу данных
- Если установлено 0 то устанавливается 4 бита передача данных
RE:
- Если установлено 1 то устанавливается набор расширенных команд
- Если установлено 0 то устанавливается набор базовых команд
Следующая команда это DISPLAY STATUS: 0 0 0 0 1 D C B
D:
- Если установлено 1 то дисплей включен
- Если установлено 0 то дисплей выключен
С:
- Если установлено 1 то курсор включен
- Если установлено 0 то курсор выключен
B:
- Если установлено 1 то курсор будет мигать
- Если установлено 0 то курсор не будет мигать
Следующая команда простая CLEAR – отчистка экрана: 0 0 0 0 0 0 0 1
И последняя команда это ENTRY MODE SET – установка направления движения курсора: 0 0 0 0 0 1 I/D S
- Если I/D = 1 то курсор сдвигается вправо
- Если I/D = 0 то курсор сдвигается влево
На основе этих четырех команд можно написать функцию инициализации дисплея:
После выполнения инициализации на экране вы должны увидеть мигающий курсор.
Режим SPI
Теперь о функции приема передачи команды/данных по SPI.
В этом режиме участвуют 2 линии:
- SID это контакт передачи данных, на дисплее он же RW
- SCLK – это линия строб, на дисплее он же E
- CS – это начала/окончания передачи данных, на дисплее он же RS
В SPI режиме передача одной команды или 1 байта данных происходит при передачи 24 бит
Протокол передачи данных таков:
- Устанавливаем высокий уровень CS
- Передаем 4 единицы подряд
- Передаем 1 бит RW – чтения или запись
- Передаем 1 бит RS – Команда или данные
- Передаем 0
- Передаем 4 бита старшей половины байта данных
- Передаем 4 нуля
- Передаем 4 бита младшей половины байта данных
- Передаем 4 нуля подряд
- Устанавливаем низкий уровень CS
На этом передача одного байта завершена.
После каждого переданного бита делается строб, то есть:
- Задержка 1 мкс.
- Устанавливаем высокий уровень SCLK
- Задержка 1 мкс.
- Устанавливаем низкий уровень SCLK
- Задержка 1 мкс.
Рассмотрим функцию передачи команды/данных в режиме SPI, но сперва объявим константы:
А теперь сама функция:
Текстовый режим
Теперь после того как вы научились инициализировать дисплей вы можете выводить любые символы на экран, например вывести букву A:
И на дисплее вы увидите букву A.
И так, теперь о том как устроенно адресное пространство в текстовом режиме:
Экран делится на 8 столбцов и 4 строки, в каждый столбец вы можете записать по 2 обычных символа или 1 иероглиф.
Адресное пространство находится от 0 до 31.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Как видите первая строчка это адреса от 0 до 7
Вторая же строчка от 16 до 23
Третья строчка от 8 до 15
То есть если вы напишете 16 букв подряд с адреса 0, то они будут в первой строчке,
но если вы напишите 17 символов, то последний символ будет не на второй строчке, а на третей!
Есть специальная команда установки адреса курсора: 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0
С помощью этой команды можно поставить курсор в нужное место вписав за место AC0-AC6 адрес от 0 до 31.
Графический режим
И напоследок, для тех кто хочет использовать графический режим, есть такая статья: LCD 12864 на контроллере ST7920. Параллельный режим (8 бит)