Схемы и скетчи для lcd 1602 дисплея. Подключение LCD к Ардуино плате. Подключение с помощью I2C модуля

В сегодняшнем уроке будет рассмотрена работа с символьным LCD дисплеем фирмы Winstar на контроллере HD44780. Следует сразу отметить, что аналогов данного дисплея великое множество и прошивка будет работать со всеми ними. Также была проверена работа данного кода с графическими и символьными OLED дисплеями.

Начнем, как и обычно, с постановки задачи. Необходимо подключить дисплей по 4х-битной шине к отладочной плате STM32F4 и вывести на него любой текст.

Итак, начнем с подключения. Существует два типа подключения подобных дисплеев: по 4х- и 8ми-битным шинам, при этом существенной разницы между ними нет, поэтому остановимся на первой, поскольку она требует меньшего количества проводников.

Схема подключения показана на рисунке ниже.

Следует отметить один очень важный момент: 1 вывод - "+5В" и 2 - "GND", на многих дисплеях поменяны местами, поэтому прежде чем подключить дисплей, прочитайте даташит. Неправильное подключение может привести к выходу дисплея из строя.

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

Теперь перейдем к прошивке. Выполним ее в виде отдельной библиотеки, чтобы в дальнейшем упростить подключение дисплея в других проектах - добавляете файл в проект и используете. Библиотеку назовем lcd.h. В библиотеке содержится следующий код:

//---Переопределяем порты для подключения дисплея, для удобства---// #define LCM_OUT GPIOB->ODR #define LCM_PIN_RS GPIO_Pin_0 // PB0 #define LCM_PIN_EN GPIO_Pin_1 // PB1 #define LCM_PIN_D7 GPIO_Pin_7 // PB7 #define LCM_PIN_D6 GPIO_Pin_6 // PB6 #define LCM_PIN_D5 GPIO_Pin_5 // PB5 #define LCM_PIN_D4 GPIO_Pin_4 // PB4 #define LCM_PIN_MASK ((LCM_PIN_RS | LCM_PIN_EN | LCM_PIN_D7 | LCM_PIN_D6 | LCM_PIN_D5 | LCM_PIN_D4)) GPIO_InitTypeDef GPIO_InitStructure; //---Функция задержки---// void delay(int a) { int i = 0; int f = 0; while(f < a) { while(i<60) {i++;} f++; } } //---Нужная функция для работы с дисплеем, по сути "дергаем ножкой" EN---// void PulseLCD() { LCM_OUT &= ~LCM_PIN_EN; delay(220); LCM_OUT |= LCM_PIN_EN; delay(220); LCM_OUT &= (~LCM_PIN_EN); delay(220); } //---Отсылка байта в дисплей---// void SendByte(char ByteToSend, int IsData) { LCM_OUT &= (~LCM_PIN_MASK); LCM_OUT |= (ByteToSend & 0xF0); if (IsData == 1) LCM_OUT |= LCM_PIN_RS; else LCM_OUT &= ~LCM_PIN_RS; PulseLCD(); LCM_OUT &= (~LCM_PIN_MASK); LCM_OUT |= ((ByteToSend & 0x0F) << 4); if (IsData == 1) LCM_OUT |= LCM_PIN_RS; else LCM_OUT &= ~LCM_PIN_RS; PulseLCD(); } //---Установка позиции курсора---// void Cursor(char Row, char Col) { char address; if (Row == 0) address = 0; else address = 0x40; address |= Col; SendByte(0x80 | address, 0); } //---Очистка дисплея---// void ClearLCDScreen() { SendByte(0x01, 0); SendByte(0x02, 0); } //---Инициализация дисплея---// void InitializeLCD(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); LCM_OUT &= ~(LCM_PIN_MASK); delay(32000); delay(32000); delay(32000); LCM_OUT &= ~LCM_PIN_RS; LCM_OUT &= ~LCM_PIN_EN; LCM_OUT = 0x20; PulseLCD(); SendByte(0x28, 0); SendByte(0x0E, 0); SendByte(0x06, 0); } //---Печать строки---// void PrintStr(char *Text) { char *c; c = Text; while ((c != 0) && (*c != 0)) { SendByte(*c, 1); c++; } }

Пройдемся по основным функциям библиотеки:

InitializeLCD() - инициализация дисплея, необходимо выполнять при старте программы.

InitializeLCD(); //Инициализация дисплея

ClearLCDScree n ( ) - очистка памяти дисплея.

ClearLCDScreen(); //Очистка памяти дисплея

Curso r (№ строки, № столбца) - установка позиции курсора, отсчет начинается с нулевой строки и нулевого столбца.

Cursor(0,2); //Установка курсора, 0-ая строка, 2-ой столбец

PrintStr(текст ) - написание строки на дисплее.

PrintStr("сайт");

SendByte( байт, режим) - если коротко, то эта функция отправляет байт в дисплей. Если параметр «режим» равен «1», то на дисплее появится символ, а если «0» - то байт будет принят дисплеем в режиме настройки. Например очистка дисплея, установка курсора или выбор типа курсора.

SendByte(0b00001100, 0); //Курсор выключен

С библиотекой закончили. Теперь пора запускать дисплей. Для этого в основном файле main.c надо написать следующий код:

#include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "lcd.h" int main(void) { InitializeLCD(); //Инициализация дисплея ClearLCDScreen(); //Очистка дисплея от мусора Cursor(0,2); //Установка курсора PrintStr("Specially for"); //Написание текста Cursor(1,4); PrintStr("сайт"); while(1) { } }

Д умаю по комментариям все понятно. Теперь остается скомпилировать код и прошить плату. Делаем рестарт и наслаждаемся написанным.

Некоторое время лежал без дела вот такой дисплей.


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

Итак, начнём.
Первое что надо сделать - это найти распиновку, то есть какой контакт за что отвечает, второе - найти название контроллера, который управляет дисплеем, для этого скачиваем даташит на данный LCD и открываем его на первой странице.


Контакты считаются слева направо, первый отмечен красной стрелочкой. Напряжение питание равно 5 вольтам, управляющий контроллер S6A0069 или аналогичный, например, ks0066U .

Для чего мы искали название управляющего контроллера? Дело в том, что в даташите на дисплей есть временные задержки(timing diagram), описана система команд, но нет банальной инициализации, а без неё никуда.
Далее, открываем вторую страницу и видим таблицу, в которой написано какой контакт за, что отвечает.


DB7…DB0 – шина данных/адреса.

R/W - определяет что будем делать, считывать(R/W=1) или записывать(R/W=0)

R/S – определяет, что будем слать команду(RS=0) или данные(RS=1)

E – стробирующий вход, изменяя сигнал на этом входе мы разрешаем дисплею считывать/записывать данные.

LED± – управление подсветкой.

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

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



Оказывается, таких инструкций целых две, для 8-битного и 4-битного режима. Что ж это за режимы такие? Данные режимы определяют по скольки проводкам будут передаваться данные: по четырём, либо по восьми. Давайте рассмотрим передачу по 4 проводам , в таком случае дисплей будет работать медленнее, но зато мы сэкономим 4 вывода микроконтроллера, да и реализация восьмибитного режима не намного отличается.

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


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

Хотелось бы обратить внимание, что во время инициализации R/S и R/W всегда равны нулю, то есть мы будем слать команды .

При инициализации можно настроить:

  • N - количество отображаемых строк
  • C - включить или выключить курсор
  • B - сделать курсор мигающим
  • I/D - увеличивать или уменьшать значение счётчика адреса
  • SH - двигать окошко дисплея
Два последние пункта рассмотрим подробнее.
На картинке ниже показано по какому адресу надо писать данные чтобы они отобразились в определённой позиции, например, если мы хотим вывести символ на первой позиции второй строки , то мы должны писать по адресу 0х40.


После этого значение счётчика автоматически изменится, либо увеличится, либо уменьшится, а вместе с ним изменится и положение курсора.

Кстати, память в которую мы пишем, называется DDRAM , все что мы запишем в эту память выведется на дисплей, ещё есть CGROM , в которой хранится таблица знакогенератора.


Эту таблицу нельзя изменить, но из неё можно брать уже готовые символы. Ещё один вид памяти это CGRAM , она то же представляет собой таблицу знакогенератора, но символы в этой таблице мы рисуем сами.


Теперь пару слов о движении экрана, дело в том что обычно на дисплее мы видим не всю DDRAM, а лишь определённую часть, как показано на картинке ниже.


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

С теорией закончили переходим к практике.
Картина общения с LCD дисплеем в 4-битном режиме выглядит следующим образом.


Данные шлются байтами, но так, как у нас 4-битный режим, то для того чтобы отправить байт надо сделать 2 посылки, старшим битом вперёд. На картинке первая посылка обозначена D7(старшая тетрада), вторая D3(младшая тетрада). Перед следующей посылкой мы должны проверить флаг занятости и если он не установлен снова можно слать, если установлен ждём, пока контроллер, управляющий LCD закончит свои дела.

Имея общую картину посылки, давайте разберемся как реализовать операцию отправки.


Для отправки надо по 8-битной шине:
  • R/W установить в 0
  • выдаём код команды/данные в шину
  • задержка 2us
  • опускаем строб Е

Операция чтения реализуется аналогично:

  • убедиться, что управляющий контроллер свободен
  • R/W установить в 1
  • поднимаем строб E(в этот момент LCD выдаст данные в шину)
  • задержка 2us
  • читаем то что выдал LCD
  • опускаем строб Е
Откуда взялась задержка 2us?

Выше таймингов есть таблица в которой написано чему равны задержки изображённые на графике, так вот длительность стробирующего импульса - tw должна быть равна 230nS или 450nS в зависимости от напряжения питания, мы взяли чуть с запасом. Почему мы учли только эту задержку? Потому что значение остальных задержек очень мало.

Для отправки по 4-битной шине:

  • убедиться, что управляющий контроллер свободен
  • установить RS в 0(команда) или 1(данные), в зависимости оттого что будем слать
  • R/W установить в 0
  • поднимаем строб E(устанавливаем в 1)
  • выдаём старшую тетраду в шину
  • задержка 2us
  • опускаем строб Е
  • задержка 1us
  • поднимаем строб E(устанавливаем в 1)
  • выдаём младшую тетраду в шину
  • задержка 2us
  • опускаем строб Е

Для чтения по 4-битной шине:

  • убедиться, что управляющий контроллер свободен
  • порт данных на вход с подтяжкой
  • установить RS в 0(команда) или 1(данные), в зависимости оттого что будем читать
  • R/W установить в 1
  • поднимаем строб E(устанавливаем в 1)
  • задержка 2us
  • читаем старшую тетраду
  • опускаем строб Е
  • задержка 1us
  • поднимаем строб E(устанавливаем в 1)
  • задержка 2us
  • читаем младшую тетраду
  • опускаем строб Е

Поднятие строба и вывод команды/данных в шину, можно поменять местами. Теперь не составит труда инициализировать дисплей. Для упрощения инициализации, мы заменим чтение флага занятости задержкой, а работу с флагом рассмотрим позже.
Надо отметить, что при инициализации в 4-битном режиме используются 4-битные команды, а после инициализации 8-битная система команд, поэтому для инициализации мы реализуем отдельную функцию отправки команд void Write_Init_Command(uint8_t data) .
//Код инициализации для Atmega16 #define F_CPU 8000000UL #define LCD_PORT PORTA #define LCD_DDR DDRA #define LCD_PIN PINA #define DATA_BUS 0XF0 #define RS 0 #define RW 1 #define E 2 #include #include void Write_Init_Command(uint8_t data) { //ножки по которым передаются команды/данные на выход LCD_DDR |= DATA_BUS; //будем слать команду LCD_PORT &= ~(1<Весело мигающий курсор, свидетельствует о том, что инициализация прошла успешно. В

Жидкокристаллический дисплей (LCD) мод. 1602 (даташит) - отличный выбор для ваших проектов.

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

Контакты и схема подключения LCD 1602 к Arduino

Контакты на этом дисплее пронумерованы от 1 до 16. Нанесены они на задней части платы. Как именно они подключаются к Arduino, показано в таблице ниже.

Табл. 1. Подключение контактов LCD 1620 к Arduino

Подключение 1602 к ArduinoЕсли дисплей 1602 питается от Arduino через 5-ти вольтовой USB-кабель и соответствующий пин, для контакта контраста дисплея (3-й коннектор – Contrast) можно использовать номинал 2 кОм. Для Back LED+ контакта можно использовать резистор на 100 Ом. Можно использовать и переменный резистор – потенциометр для настройки контраста вручную.

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

Табл. 2. Предпочтительные цвета проводников

Схема подключения LCD дисплея 1602 к Arduino:


Базовый пример программы для работы LCD 1602 с Arduino

В примере используются 0, 1, 2, 3, 4, и 5 пины Arduino для подключения соответствующих пинов 4, 6, 11, 12, 13 и 14 с дисплея 1602 (смотри табл. 1). После этого в коде для Arduino мы инициализируем lcd() следующим образом:

LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

Этот кусок кода объясняет Arduino, как именно подключен LCD дисплей.

Весь соурс файл проекта метеостанции, в которой используется дисплей LCD 1602 можно скачать по этой ссылке .

LCD 1602A, Arduino и датчик освещенности (фоторезистор)

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


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

Необходимые материалы

  • 1 Arduino UNO;
  • 1 макетная плата (63 рельсы);
  • 1 датчик освещенности (фоторезистор);
  • 1 потенциометр на 50 кОм;
  • 1 LCD дисплей 1602A;
  • 1 резистор на 10кОм;
  • 1 рельса коннекторов (на 16 пинов);
  • 1 USB кабель.

LCD Дисплей 1602A

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

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

Подключение дисплея 1602A к Arduino

Первое что необходим о – запитать дисплей. Подключите два кабеля от +5 вольт и земли к соответствующим рядам плюс-минус на макетной плате.

Подключите: пин на 5 вольт (5V) с Arduino к одной из дорожек макетной платы.

Подключите: пин Земля (GND) Arduino к другой дорожек (макетной платы).

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

Подключите: дорожку GND (минус) на макетной плате к 1 пину на LCD экране (он обозначен как VSS).

Подключите: дорожку 5 вольт (плюс) на макетной плате ко 2 пину на LCD экране (он обозначен как VDD).

Подключите: дорожку 5 вольт (плюс) на макетной плате к 15 пину на LCD экране (он обозначен как A).

Подключите: дорожку GND (минус) на макетной плате к 16 пину на LCD экране (он обозначен как K).

Подключаем нашу Arduino к персональному компьютеру через USB-кабель и вуаля! Экран должен включиться.

Следующий шаг – подключение потенциометра для регулировки контрастности дисплея. В большинстве гайдов, используется потенциометр на 10 кОм, но 50 кОм тоже подойдет. Из-за большего диапазона значений сопротивлений на выходе потенциометра, более точная настройка становится сложнее, но для нас в данном случае это не критично. Установите потенциометр на макетной плате и подключите три его пина.

Подключите: первый пин на потенциометре к минусу на макетке.

Подключите: средний пин потенциометра к 3 пину на дисплее (он обозначен как V0).

Подключите: третий пин на потенциометре к плюсу на макетке.

После подачи питания на плату через USB-кабель, на дисплее первый ряд должен заполниться прямоугольниками. Если вы их не увидели, немного проверните ручку потенциометра слева направо, чтобы отрегулировать контраст. В дальнейшем, когда мы будем отображать числовые значения на экране, вы сможете более точно отрегулировать контрастность. Если ваш дисплей выглядит примерно так, вы все делаете верно:

Продолжим. Теперь нам надо обеспечить обмен данными между Arduino и LCD дисплеем 1602A для отображения символов.

Для этого подключите 4 пин дисплея (RS) к 7 пину Arduino (желтый коннектор). 5 пин дисплея (RW) – к ряду пинов земля на макетке (черный кабель).

6 пин дисплея (E) – к 8 пину Arduino (ШИМ).

11 пин дисплея (D4) – к 9 пину Arduino (ШИМ).

12 пин дисплея (D5) – к 10 пину Arduino (ШИМ).

13 пин дисплея (D6) – к 11 пину Arduino (ШИМ).

14 пин дисплея (D7) – к 12 пину Arduino (ШИМ).

Программа для Arduino IDE – отображение надписи на дисплее 1602A

Представленный ниже кусок кода достаточно скопипастить в Arduino IDE и загрузить на плату:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

lcd.begin(16, 2);

lcd.setCursor(0,1);

lcd.write("LIGHT: ");

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

Своеобразный "hello world!" на LCD 1602A запущен. Я вас поздравляю.

Подключаем фоторезистор и заливаем всю программу в Arduino

Теперь подключим фоторезистор. Подключите три провода к свободным рельсам на макетной плате (условно пронумеруем их 1, 2, 3). Оставьте в рельсах немного места для самого датчика освещенности и резистора.

Рельсу GND с макетной платы подключаем к рельсе 1. A0 (аналоговый вход) с Arduino - к рельсе 2. 5 вольт с макетной платы - к рельсе 3.

Дальше подключаем наш датчик и резистор к подготовленным рельсам. Какие именно ноги идут к земле, а какие - к питанию для нашего датчика освещенности и резистора неважно (в отличие от, например, светодиода, в котором есть катод и анод). Так что тут не перепутаете.

Датчик освещенности подключаем к рельсе 1 и рельсе 2. Резистор – к рельсе 2 и к рельсе 3.

Теперь вернемся к нашей программе и добавим несколько строк в пустующее пока что тело функции loop():

int sensorValue = analogRead(A0);

lcd.setCursor(7,1);

lcd.print(sensorValue);

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

LCD дисплеи от компании Winstar уже на протяжении нескольких лет являются неотъемлемой частью современной электронной продукции, и не только на российском рынке. Они дешевы, очень распространены (не видел магазинов, где их не было бы), их разнообразие предоставляет разработчику выбирать подходящий в зависимости от эксплуатационных условий. Их различие заключается в диапазонах рабочих температур, количеством строк для отображения информации, количеством знакомест в строке, стандартными из которых являются значения 8, 12, 16, 20, 24 и 40 символов на одну строку, так же различаются размерами символа, его разрешением, размерами самого дисплея и т.д. Winstar выпускает не только буквенно-цифровые знакосинтезирующие LCD-модули, но и графические. Те, в свою очередь, тоже имеют различные параметры, что предоставляет пользователю возможность выбирать подходящий исходя из поставленной задачи.

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

Стандартно дисплей WH1602B выглядит так:

16 выводных линий, из которых 11 – линии управления, расположены в ряд с шагом 2,54мм, что позволяет разработчику напрямую подпаять шлейф или поставить разъем, и отвести шлейф к плате управления, в зависимости от конструкции конечного устройства.

Далеко не редким является дисплей с боковым расположением контактов.

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

Существенным недостатком дисплеев WH1602B является ток потребления, поэтому применять данный тип дисплеев в устройствах с автономным питанием совершенно невыгодно.

Дисплеи линейки WH построены на базе специализированного контроллера LCD-модулей HD44780, который как раз и разрабатывался для управления знакосинтезирующими ЖК-панелями.

С небольшим описанием, пожалуй, стоит закончить, и приступить к практической части. Нумерация выводов дисплея, если смотреть на него сверху (т.е. как мы смотрим на него при чтении информации), идет начиная с самого крайнего левого вывода. Это вывод 1.

Подключение 1602:

Итак распиновка 1602 :
1) GND – общий провод
2) Vcc – напряжение питания +5В
3) V0 – контрастность
4) RS – линия выбора регистра
5) RW – линия выбора направления передачи данных (чтение или запись)
6) E – линия синхронизации
7) DB0 – 14) DB7 – линии шины данных
15) A – анод подсветки (подключаем сюда +5В через резистор 100Ом)
16) К – катод подсветки (подключаем к общему проводу)

Дисплей может работать в 2 режимах: в режиме 8-битной передачи данных, когда данные передаются группами по 8 бит (при этом обеспечивается максимальная скорость взаимодействия с дисплеем), и в режиме 4-битной передачи, когда 8-битные данные разбиваются на две группы по четыре разряда и последовательно передаются по четырем старшим линиям данных DB4-DB7.

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

Мы рассмотрим процесс инициализации дисплея WH1602B в 8-битном режиме с использованием управляющей платы, основанной на микроконтроллере Attiny2313.

Итак, какие действия необходимо выполнить для надежного процесса инициализации :
1) Включить питание дисплея
2) Выдержать паузу 20мс
3) Выдать команду 00110000 при RS=0 RW=0
4) Выдержать паузу не менее 40мкс
5) Выдать команду 00110000 при RS=0 RW=0
6) Выдержать паузу не менее 40мкс
7) Выдать команду 00110000 при RS=0 RW=0
8) Выдержать паузу не менее 40мкс
9) Выдать команду 00111000 при RS=0 RW=0
10) Выдержать паузу не менее 40мкс
11) Выдать команду 00001000 при RS=0 RW=0
12) Выдержать паузу не менее 40мкс
13) Выдать команду 00000001 при RS=0 RW=0
14) Выдержать паузу не менее 1,5мс
15) Выдать команду 00000110 при RS=0 RW=0.

Поясню: RS – как отмечалось выше – линия выбора регистра (0 – адресуется регистр команд, в который мы записываем команды отключения дисплея, сдвига строки, установление курсора и т.д.; 1 – адресуется внутренняя память, куда будет записываться байт и отображаться на дисплее).

RW – линия выбора направления передачи данных (0 – запись в дисплей, 1 – чтение данных из дисплея).
После выдачи данных на линию данных DB0-DB7 и установки значений на линиях RS, RW, необходимо эти данные защелкнуть – для этого нужно установить линию E в 1, и, затем, снова сбросить в исходное положение – в 0.

Подключаем PD0 микроконтроллера к линии RS LCD, вывод PD1 микроконтроллера к RW дисплея, ну а PD2 – соответственно к линии Е дисплея, а линии шины данных DB0-DB7 к соответствующим линиям порта B микроконтроллера. Сам дисплей подключаем согласно схеме вверху.

Теперь дело за программной частью:

Include "tn2313def.inc" ; Attiny2313, 1 MHz clock .cseg .org 0 rjmp reset ;******************************************************************** ;Стандартный переход к инициализированной части программы reset: ldi r16, low (RAMEND) ; Инициализация стека МК out SPL, r16 rcall lcd_init ; Инициализация дисплея;Здесь мы инициализировали стек микроконтроллера и перешли к инициализации LCD-модуля;******************************************************************** lcd_init: ldi r16, 0b10000000 ; сбрасываем все подтягивающие резисторы out MCUCR, r16 ldi r16, 0b11111111 ; Настройка порта B out ddrb, r16 ldi r16, 0b00000111 ; Настройка порта D out ddrd, r16 ;Настраиваем линии портов ввода/вывода: сбрасываем подтягивающие резисторы и определяем;PB0-PB7, PD0-PD2 как линии вывода данных;******************************************************************** ;Исходя из вышеуказанной процедуры инициализации выполняем операции: ldi r16, 0b00000000 ; Адресация IR ldi r17, 0b00110000 ; Установка разрядности Data line rcall delay_20000mks ; Пауза перед инициализацией lcd rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ldi r17, 0b00111000 ; Установка параметров lcd rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ldi r17, 0b00001000 ; Выключение дисплея rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ldi r17, 0b00000001 ; Очистка дисплея rcall write_lcd ; Запись данных в lcd rcall delay_1500mks ; Задержка перед выполнением операций с lcd ldi r17, 0b00000110 ; Установка режима ввода данных rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ret ; Выход из подпрограммы;******************************************************************** delay_20000mks: ldi r18, 0b10110010 ; Ввод переменной задержки ldi r19, 0b00000101 ; Настройка предделителя rjmp init_delay delay_1500mks: ldi r18, 0b11111010 ; Ввод переменной задержки ldi r19, 0b00000101 ; Настройка предделителя rjmp init_delay delay_40mks: ldi r18, 0b11011000 ; Ввод переменной задержки ldi r19, 0b00000010 ; Настройка предделителя init_delay: out TCNT0, r18 ; Инициализация TCNT0 out TCCR0B, r19 ; Старт T0 test_TIFR: in r18, TIFR ; Чтение TIFR sbrs r18, 1 ; Переход, если "Переполнение T0" rjmp test_TIFR ; Бесконечная проверка TOV0 ldi r20, 0b00000000 ; Остановка T0 out TCCR0B, r20 ldi r20, 0b00000010 ; Загрузка TOV0>>0 out TIFR, r21 ret ; Выход из подпрограммы;******************************************************************** write_lcd: out portd, r16 ; Установка значения линии RS out portb, r17 ; Вывод байта данных DB0-DB7 nop ; Защита от шумов на линии стробирования sbi portd, 2 ; E>>1 nop ; Защита от шумов на линии стробирования cbi portd, 2 ; E>>0 nop ; Защита от шумов на линии стробирования ret ; Выход из подпрограммы;******************************************************************** user_write_IR: ldi r16, 0b00000000 ; Адресация IR rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ret ; Выход из подпрограммы;******************************************************************** user_write_DR: ldi r16, 0b00000001 ; Адресация DR rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ret ; Выход из подпрограммы;******************************************************************** lcd_clear: ldi r16, 0b00000000 ; Адресация IR ldi r17, 0b00000001 ; Очистка дисплея rcall write_lcd ; Запись данных в lcd rcall delay_1500mks ; Задержка перед выполнением операций с lcd ret ; Выход из подпрограммы;********************************************************************

Как пользоваться данным кодом. Для занесения символа на экран необходимо записать байт, соответствующий коду этого символа, в регистр R17. В регистр 17 заносим 0х1 – если хотим записать символ на экран, или сбрасываем в 0х0, если хотим записать какую-то команду в регистр команд LCD дисплея.

Мной были предусмотрены подпрограммы, которые вызывает пользователь:
user_write_IR – запись команды в регистр команды LCD;
user_write_DR – запись данных для отображения на LCD;
lcd_clear – подпрограмма/команда, вызов которой осуществляет очистку дисплея.

Как работать с вызовом подпрограмм:

Ldi r17, 0x24; Символ с кодом 0x24 rcall user_write_DR; запись символа на отображение ldi r17, 0x2; команда 0х2 rcall user_write_IR; записываем в регистр.

Отмечу, что при использовании подпрограммы lcd_clear предварительная запись в R17 не требуется.
Где писать свой код? Вот здесь:

Reset: ldi r16, low (RAMEND) ; Инициализация стека МК out SPL, r16 rcall lcd_init ; Инициализация дисплея;ВАШ КОД!!! Например: Ldi r17, 0xC; Включаем изображение ldi r17, 0x24; Символ с кодом 0x24 rcall user_write_DR; запись символа на отображение

Добавлю, что в последнее время появились данные модули с платой последовательного преобразователя, позволяющие подключать LCD дисплеи 1602 по 4-х проводной схеме и работающими по I 2 C-интерфейсу. Т.о. немного упрощается подключение и экономятся выводы контроллера. Модуль можно приобрести отдельно и подключить к уже имеющемуся LCD 1602.

Скачать исходники и прошивку вы можете ниже

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

Вот такой дисплей 1602 будем сегодня подключать к Arduino.

Цифры «1602» говорят о том, что дисплей состоит из 2-х строк, по 16 символов. Это довольно распространённый экран, с применением которого народ конструирует часы, тестеры и прочие гаджеты. Дисплей бывает с зелёной и голубой подсветкой.

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

Подключать дисплей 1602 к Arduino будем через 4-битный вариант параллельного интерфейса. Существует вариант и 8-битного интерфейса, но при нём задействуется больше проводов, а выигрыша в этом мы не увидим.

Кроме дисплея и Arduino, нам понадобятся провода и переменный резистор на 10кОм. Резистор подойдёт любой марки, лишь бы был необходимого номинала.

Питание на дисплей подаётся через 1-й (VSS) и 2-й (VDD) выводы. К выводам 15 (А) и 16 (K) - подаётся питание на подсветку дисплея. Поскольку для питания и подсветки используется одно напряжение +5В, запитаем их от пинов Arduino «5V» и «GND» . Главное не перепутать полярность, иначе можно спалить электронику дисплея.

3-й вывод (V0) подключаем к ножке переменного резистора, им будем управлять контрастностью дисплея. Резистор можно не использовать, а вывод «V0» подключить к GND . В таком случае контрастность будет максимальной и не будет возможности её плавной регулировки.

5-й вывод (RW) используется для чтения с дисплея либо для записи в него. Поскольку мы будем только писать в дисплей, соединим этот вывод с землёй (GND) .

Выводы: 4-й (RS) , 6-й (E) , 11-й (D4) , 12-й (D5) , 13-й (D6) , 14-й (D7) подключаем к цифровым пинам Arduino. Не обязательно использовать пины те же что и у меня, можно подключить к любым цифровым, главное затем правильно их выставить в скетче.

Моя подключённая Ардуина, осталось соединить её с компьютером через USB и залить скетч.

В примете будем использовать скетч из стандартного набора.

В Arduino IDE выбираем «Файл» - «Образцы» - «LiquidCrystal» - «HelloWorld» .

Давайте посмотрим на код скетча.

В строке «LiquidCrystal lcd» , в скобках, выставлены цифровые пины, которые задействованы на Arduino. Пины выставляются в такой последовательности: RS, E, DB4, DB5, DB6, DB7 . Если вы задействовали другие цифровые пины, при подключении дисплея, впишите их в нужной последовательности в скобках.

В строке «lcd.print("hello, world!");» выводится приветствие на дисплей, по-умолчанию это надпись «hello, world!» , её можно поменять на любую свою, пишем на латинице.

Загружаем скетч в Arduino и вот результат. Вместо «hello, world!» я вписал свой сайт. Строкой ниже, таймер производит отсчёт времени.


Top