LCD

      Жидкокристаллический дисплей (ЖК-дисплей), или по-английски Liquid Crystal Display (LCD) построен на технологии жидких кристаллов. Из всех доступных LCD дисплеев на рынке, наиболее популярным является LCD 1602, который может отображать ASCII символы в 2 строки по 16 знаков в каждой. Управляет работой дисплея специальный контроллер HD44780, который находится на плате индикатора.

Назначение выводов:

GND - минус питания (общий вывод).

VCC - питание для ЖК-дисплея, +5В.

V0 (LCD Contrast) - вывод для регулировки контрастности ЖК-дисплея.

RS (Register Select) - вывод, который позволяет сообщать ЖК-дисплею, отправляются команды или данные. Например, когда на выводе RS установлено значение LOW, мы отправляем команды на ЖК-дисплей (например, установить курсор в определенном месте, очистить дисплей, сдвинуть дисплей вправо и т. д.). Когда вывод RS установлено значение HIGH, мы отправляем данные/символы на ЖК-дисплей.

R/W (Read/Write) - для контроля того, что необходимо сделать - считать данные или передать их на ЖК-дисплей. Если R/W=1 считываем, если R/W=0 - записывать.

EN (Enable) - для включения дисплея. Это означает, что когда на этом выводе установлено значение LOW ЖК-дисплей не реагирует на то, что происходит с R/W, RS и линиями шины данных. Когда же на этом выводе HIGH ЖК-дисплей обрабатывает входящие данные.

D0-D7 (Data Bus) - это выводы, по которым передаются 8-битные данные на дисплей.

AK (Anode & Cathode) используются для управления подсветкой LCD дисплея.

      Для передачи данных у дисплея есть 8 выводов (D0-D7). Но, ЖК-дисплеи на HD44780 разработаны таким образом, что позволяют общаться с ЖК-дисплеем, используя только 4 вывода данных (4-разрядный режим) вместо 8 (8-разрядный режим).

8-битный режим быстрее, чем 4-битный. Это связано с тем, что в 8-битном режиме мы передаем данные за один раз, а в 4-битном режиме мы должны разделить байт на 2 части, сдвинуть один из них на 4 бита вправо и выполнить 2 операции записи. Поэтому, 4-битный режим часто используется для экономии выводов микроконтроллера, а 8-битный режим лучше всего использовать, когда требуется высокая скорость и при этом есть как минимум 10 свободных выводов ввода/вывода микроконтроллера.


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


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

Команды, которые понимает дисплей, для удобства сведены в следующую таблицу:

      Подключить LCD к Ардуино можно и не используя библиотеку. Можно использовать как 4-битное подключение, так и 8-ми битное.

8-ми битное подключение

Для более простого понимания, соберем схему 8-ми битного подключения.

      Работа с LCD-дисплеем начинается с инициализации дисплея, которая состоит из ряда команд, позволяющих настроить дисплей для правильной работы. Для 8-ми битного подключения, блок инициализации может выглядеть так:


Ну и рассмотрим программу. Для удобства я сразу разделил её на три часть, первая часть - инициализация.
void setup() {
  pinMode(3, OUTPUT);    //Вывод RS(Register selection), если передаем команду, то подаем 0 на этот вывод, а если символ то 1   
  pinMode(4, OUTPUT);    //Вывод R/W(Read/Write), если надо записать информацию, то 0, а если считываем то 1
  pinMode(5, OUTPUT);    //Вывод E(Enable), в начале передачи или приема подаем 1, в конце 0 
  pinMode(6, OUTPUT);    //Вывод DB0(Data bit 0) - младший бит
  pinMode(7, OUTPUT);    //Вывод DB1(Data bit 1) - младший бит
  pinMode(8, OUTPUT);    //Вывод DB2(Data bit 2) - младший бит
  pinMode(9, OUTPUT);    //Вывод DB3(Data bit 3)  - младший бит
  pinMode(10, OUTPUT);    //Вывод DB4(Data bit 4) - cтарший бит
  pinMode(11, OUTPUT);    //Вывод DB0(Data bit 5) - cтарший бит
  pinMode(12, OUTPUT);    //Вывод DB0(Data bit 6) - cтарший бит
  pinMode(13, OUTPUT);    //Вывод DB0(Data bit 7) - cтарший бит
  
                                              // БЛОК ИНИЦИАЛИЗАЦИИ ДИСПЛЕЯ
  //Выбоор числа линий, ширины шины и размера символа
  digitalWrite(3, 0);
  digitalWrite(4, 0);
  digitalWrite(5, 1);

  digitalWrite(6, 0);
  digitalWrite(7, 0);
  digitalWrite(8, 0);   // ращзмер символа: 0 - 5x8, 1 - 5x10
  digitalWrite(9, 1);   // число строк: 0 - одна строка, 1 - две строки

  digitalWrite(10, 1);	// ширина шины: 1 - 8-бит, 0 - 4 бит
  digitalWrite(11, 1);
  digitalWrite(12, 0);
  digitalWrite(13, 0);
 
  digitalWrite(5, 0);
  delay(1000);    		//Пауза перед следующей командой
  
  // Настройка режима отображения
  digitalWrite(3, 0);
  digitalWrite(4, 0);
  
  digitalWrite(5, 1);
  
  digitalWrite(6, 0);	// если 1, то сдвигать курсор в виде мигающего черного квадрата, иначе 0       
  digitalWrite(7, 1);	// если 1, то включить курсор в виде прочерка, иначе 0
  digitalWrite(8, 1);	// если 1, то включить дисплей, иначе 0
  digitalWrite(9, 1);
  digitalWrite(10, 0);
  digitalWrite(11, 0);
  digitalWrite(12, 0);
  digitalWrite(13, 0);
  
  digitalWrite(5, 0);
  delay(50);    		//Пауза перед следующей командой
    
  //Очистка дисплея
  digitalWrite(3, 0);
  digitalWrite(4, 0);
  
  digitalWrite(5, 1);

  digitalWrite(6, 1);
  digitalWrite(7, 0);
  digitalWrite(8, 0);
  digitalWrite(9, 0);
  digitalWrite(10, 0);
  digitalWrite(11, 0);
  digitalWrite(12, 0);
  digitalWrite(13, 0);
  
  digitalWrite(5, 0);
  delay(50);    
}
Блок инициализации полностью размещается внутри функции void setup()

Далее идет собственно сама программа:

void loop() {
  
                                               //Конец блока отчистки дисплея
  
sp(); 
sp(); 
H();  
e();
l();
l();
o();
sp(); 
W();
o();
r();
l();
d();
ep();
sp(); 
sp(); 
   												
                                            
for (int i=0; i <24; i++) {    //Цикл для того чтобы перейти на следующую строчку
sp(); 
}

sp(); 
sp(); 
sp(); 
sp(); 
L();
C();
D();
hy();
one();
six();  
zero();                                              
two();  
sp(); 
sp(); 
sp(); 
sp();   
  
  delay(10000);    //Пауза, чтобы дисплей обновлялся каждые 10 секунд иначе он будет постоянно обновляться.
}

Видно, что программа состоит из последовательности вызываемых подпрограмм, каждая из которых отправляет в дисплей определенный символ. И, наконец, самая большая часть - набор подпрограмм.
void sp() {          	//Начало блока символа пробел (0000 0010)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 0);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E  
  delay(50);           	//Пауза перед следующим символом
}                      	//Конец блока символа пробел


void H() {             	//Начало блока символа H (0100 1000)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 0);  	//D2  
  digitalWrite(9, 1);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E  
  delay(50);    		//Пауза перед следующим символом
}  					    //Конец блока символа H

void e() {              //Начало блока символа e (0110 0101)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 1);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа e
  
void l() {             	//Начало блока символа l (0110 1100)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 1);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);           	//Пауза перед следующим символом
}                      	//Конец блока символа l

void o() {             	//Начало блока символа o (0110 1111) 
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 1);  	//D0  
  digitalWrite(7, 1);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 1);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);           	//Пауза перед следующим символом
}                      	//Конец блока символа o

void W() {             	//Начало блока символа W (0101 0111)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 1);  	//D0  
  digitalWrite(7, 1);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа W

void r() {             	//Начало блока символа r (0111 0010)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 1);  	//D1  
  digitalWrite(8, 0);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа r

void d() {             	//Начало блока символа d (0110 0100)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа d

void ep() {             //Начало блока символа ! (0010 0001)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 1);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 0);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа !

void L() {             	//Начало блока символа L (1100 0100)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 1);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа L

void C() {             	//Начало блока символа C (0100 0011)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 1);  	//D0  
  digitalWrite(7, 1);  	//D1  
  digitalWrite(8, 0);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);           	//Пауза перед следующим символом
}                      	//Конец блока символа C

void D() {             	//Начало блока символа D (0100 0100)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);           	//Пауза перед следующим символом
}                      	//Конец блока символа D

void hy() {             //Начало блока символа дефис (0010 1101)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 1);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 1);  	//D3  
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа дефис

void one() {            //Начало блока символа 1 (0011 0001)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 1);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 0);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа 1

void two() {            //Начало блока символа 2 (0011 0010)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 1);  	//D1  
  digitalWrite(8, 0);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      	//Конец блока символа 2

void six() {            //Начало блока символа 6 (0011 0110)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 1);  	//D1  
  digitalWrite(8, 1);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);           	//Пауза перед следующим символом
}                      	//Конец блока символа 6

void zero() {           //Начало блока символа 0 (0011 0000)
  digitalWrite(3, 1);  	//RS
  digitalWrite(4, 0);  	//RW  
  digitalWrite(5, 1);  	//E  
  digitalWrite(6, 0);  	//D0  
  digitalWrite(7, 0);  	//D1  
  digitalWrite(8, 0);  	//D2  
  digitalWrite(9, 0);  	//D3  
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//l  
  delay(50);            //Пауза перед следующим символом
}                      //Конец блока символа 0



Каждая из подпрограмм для вывода определенного символа, также как каждая команда из блока инициализации, выполнятеся очень просто: На выводы RS, RW и DO-D7 выставляется код символа или команды, и с помощью импульса, который формируется на выводе 5 (сигнал E) записывается в память дисплея.

Результатом работы программы будет появлящаяся на дисплее надпись:


4-х битное подключение

Теперь рассмотрим 4-х битное подключение:

      Для 4-х битного подключения, блок инициализации может выглядеть так:



Также разобьем программу на три часть. Блок инициализации дисплея:
void setup() {
  
  pinMode(3, OUTPUT);     //Вывод RS(Register selection), если передаем команду, то подаем 0 на этот вывод, а если символ то 1   
  pinMode(4, OUTPUT);     //Вывод R/W(Read/Write), если надо записать информацию, то 0, а если считываем то 1
  pinMode(5, OUTPUT);     //Вывод E(Enable), в начале передачи или приема подаем 1, в конце 0 
  pinMode(10, OUTPUT);    //Вывод DB4(Data bit 4) - Старший бит
  pinMode(11, OUTPUT);    //Вывод DB5(Data bit 5) - Старший бит
  pinMode(12, OUTPUT);    //Вывод DB6(Data bit 6) - Старший бит
  pinMode(13, OUTPUT);    //Вывод DB7(Data bit 7) - Старший бит
 
    					// БЛОК ИНИЦИАЛИЗАЦИИ ДИСПЛЕЯ
  // Выбор числа линий, шины, размера символа
  digitalWrite(3, 0);  	//RS  0 - указывает дисплею на то, что отправляем команду.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных, записываем 0010
  digitalWrite(10, 0); 	//D4  0 - так как подключаем по 4 битам
  digitalWrite(11, 1); 	//D5  
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);   //E   0 - запрещает запись данных в дисплей.
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных, записываем 0010
  digitalWrite(10, 0); 	//D4  0 - так как подключаем по 4 битам
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);   //E   0 - запрещает запись данных в дисплей.
  delay(1); 
 
  digitalWrite(5, 1);  	//E    1 - разрешает запись в дисплей данных, записываем 1100
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 0); 	//D6   N = 0, размер символа 5x8 точек
  digitalWrite(13, 1); 	//D7   F = 1, так как у нас две строки
  digitalWrite(5, 0);  	//E  
  delay(5);    		   	//Пауза, после записи команды.
 
    
  // Настройка режима отображения
  digitalWrite(3, 0);  	//RS  0 - указывает дисплею на то, что отправляем команду.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных, записываем 0000 
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей.
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных, записываем 1100 
  digitalWrite(10, 0); 	//D4  B - 0 - мигающий квадратный курсор выключен
  digitalWrite(11, 0); 	//D5  С = 0 - курсор выключен
  digitalWrite(12, 1); 	//D6  D = 1 - дисплей включен.
  digitalWrite(13, 1); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей.
  delay(50);    	   	//Пауза, после записи команды.
  
  
  // очистка дисплея
  digitalWrite(3, 0);  	//RS  0 - указывает дисплею на то, что отправляем команду.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.

  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4  записываем 0000
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 1); 	//D4  записываем 0001
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    		   //Пауза, чтобы была анимация
  // конец очистки дисплея  
  
  
}


Сама программа точно такая же как и при 8-ми битном подключении:

void loop() {

sp(); 
sp(); 
H();
e();
l();
l();
o();
sp(); 
W();  
o();  
r();
l();  
d();
ep();
sp(); 
sp(); 
  
  for (int i=0; i <24; i++) {    //Цикл для того чтобы перейти на следующую строчку
  sp(); 
  }
  
sp(); 
sp(); 
sp(); 
sp();
L();
C();
D();  
hy();
one();  
six();  
zero();   
two();  
sp(); 
sp(); 
sp(); 
sp();     
  
  delay(10000);    //Пауза, чтобы дисплей обновлялся каждые 10 секунд иначе он будет постоянно обновляться.
  
}



И, наконец, блок подпрограмм:


  void sp() {			// символ пробел (0000 0010)
  digitalWrite(3, 1);  	//RS  1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.

  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4  записываем 0000
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4  записываем 0001
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    		//Пауза
  }						// конец символа пробел  
  						  
void H() {             	//Начало блока символа H (0100 1000)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 1); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}  					   	//Конец блока символа H



void e() {             	//Начало блока символа e (0110 0101)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа e
                      

void l() {             	//Начало блока символа l (0110 1100)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 1); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа l


void o() {             	//Начало блока символа o (0110 1111)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 1); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа o

void W() {             	//Начало блока символа W (0101 0111)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа W


void r() {             	//Начало блока символа r (0111 0010)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа r


void d() {             	//Начало блока символа d (0110 0100)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 1); 	//D6 
  digitalWrite(13, 0); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа d


void ep() {             	//Начало блока символа ! (0010 0001)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 0); 	//D4 
  digitalWrite(11, 1); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7 
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
  digitalWrite(10, 1); 	//D4 
  digitalWrite(11, 0); 	//D5 
  digitalWrite(12, 0); 	//D6 
  digitalWrite(13, 0); 	//D7
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа d


void L() {             	//Начало блока символа L (1100 0100)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B010000;  	// Выводим значение 010000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B110000;  	// Выводим значение 110000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа L

void C() {             	//Начало блока символа C (0100 0011)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B010000;  	// Выводим значение 010000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B001100;  	// Выводим значение 001100 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа C

void D() {             	//Начало блока символа D (0100 0100)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B010000;  	// Выводим значение 0100000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B010000;  	// Выводим значение 0100000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа D

void hy() {             	//Начало блока символа - (0010 1101)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B001000;  	// Выводим значение 001000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B110100;  	// Выводим значение 110100 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа -

void zero() {             	//Начало блока символа 0 (0011 0000)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B001100;  	// Выводим значение 001100 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B000000;  	// Выводим значение 000000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа 1

void one() {             	//Начало блока символа 1 (0011 0001)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B001100;  	// Выводим значение 001100 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B000100;  	// Выводим значение 000100 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа 1

void two() {             	//Начало блока символа 2 (0011 0010)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B001100;  	// Выводим значение 001100 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B001000;  	// Выводим значение 001000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа 2

void six() {             	//Начало блока символа 6 (0011 0110)
  digitalWrite(3, 1);  	//RS	 1 - указывает дисплею на то, что отправляем символ.
  digitalWrite(4, 0);  	//RW  0 - указывает на то, что будет записывать в дисплей.  
  
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B001100;  	// Выводим значение 001100 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(1); 
 
  digitalWrite(5, 1);  	//E   1 - разрешает запись в дисплей данных
   PORTB = B011000;  	// Выводим значение 011000 в порт B
  digitalWrite(5, 0);  	//E   0 - запрещает запись данных в дисплей
  delay(50);    	   	//Пауза
}						//Конец блока символа 6



Подпрограммы аналогичны подпрограммам при 8-ми битном подключении, разница в том, что каждый байт, независимо от того, символ это или команда, передается частями - сначала старшие четыре бита (старшая тетрада), затем младшие четыре бита (младшая тетрада).

Результат работы программы полностью идентичен результату при 8-ми выводном подключении:





Copyright © R9AL 2021 Все права защищены

Рейтинг@Mail.ru Яндекс цитирования