Подключение HD44780 Работа с алфавитно-цифровым ЖКИ инициализация
Работа с символьным ЖКИ на базе контроллера HD44780
Рассмотрим взаимодействие пользователя и устройства на базе микроконтроллера. Очень часто пользователю нужно чем-то вводить информацию, и с чего-то ее считывать. Для этих целей очень хорошо подходит клавиатура и дисплей (заметка про считывание клавиши).Рассмотрим взаимодействие пользователя и устройства на базе микроконтроллера. Очень часто пользователю нужно чем-то вводить информацию, и с чего-то ее считывать. Для этих целей очень хорошо подходит клавиатура и дисплей (заметка про считывание клавиши). В этой заметке рассмотрим поподробнее отображение информации на символьном ЖКИ со знакосинтезирующим контроллером HD44780.
Такие индикаторы часто используются при проектировании цифровых устройств, поэтому с ним необходимо уметь работать.
Рассмотрим типовое внутреннее строение знакосинтезирующего ЖКИ:
Внутренняя структура HD44780
В основе ЖКИ лежит матрица из жидких кристаллов, подавая напряжение на элемент которой мы можем «зажечь» точку на экране. В нашем случае матрица состоит из знакомест (чаще всего 8х5 пикселей), сгруппированых в несколько рядков. Этим всем управляет встроенный контроллер HD44780. У контроллера есть однобайтные ячейки памяти (DDRAM), содержимое которых собственно отображается на экране согласно таблице записанной в CGRAM. Ячеек памяти обычно больше чем знакомест в ЖКИ, поэтому адресацию знакомест нужно смотреть в даташите. То есть нам необходимо только в нужную позицию записать код нужного знака, а все остальное HD44780 сделает сам.
Для выбора позиции существует виртуальный курсор (номер текущей ячейки памяти, АС), которым можно управлять посредством команд, курсор можно сделать видимым. По умолчанию при записи символа в ячейку, курсор сдвигаеться вперед на одну позицию. Коды символов для ЖКИ поддерживающего кириллицу можно увидеть в таблице:
Старшая тетрада кода будет равна ряду выбранного символа, а младшая – строке. Можно создать свою таблицу символов, записав ее в CGRAM. На каждый символ требуется 5 байт, где единицы отвечают за «зажженные» пиксели. Например, цифра «8» кодируется последовательностью 0x6c,0x92,0x92,0x92,0x6c.
Коды команд приведены в таблице.
Таблица символов HD44780
Значения флагов:
Остается открытым вопрос: «как записать в нужную позицию код требуемого символа»? Для этого рассмотрим за что отвечают выводы ЖКИ. Выводы DB0-DB7 отвечают за входящие/исходящие данные. Высокий уровень на выводе RS дает индикатору понять, что сигнал на выводах DB0-DB7 является данными, а низкий – командой. Вывод W/R отвечает за направление данных, пишутся ли данные в память или читаются из нее (обычно чтение из ЖКИ не используется, можем смело на него подать низкий уровень). Импульс на выводе Е (длительностью не менее 500 нс) используется как сигнал для записи/чтения данных с выводов DB0-DB7, RS и W/R.
Вывод V0 используется для задания контраста изображения, вывода А,К – для питания подсветки (если она есть в вашей модели ЖКИ). Оставшиеся 2 вывода – собственно питание ЖКИ. То есть, для управления ЖКИ потребуется 8+1+1=10 выводов. Но можно работать в режиме 4-х битного интерфейса. При этом, сперва будет передавать старшая тетрада команды/данных на выводах DB4-DB7, а после – младшая. Выводы при DB0-DB3 при этом не используются. Итого для управления требуется 6 выводов микроконтроллера.
Теперь рассмотрим живой пример. Напишем программу для вывода текста «avrlab.com» на имеющийся у меня в наличии WH1602А (2 строки по 16 символов).
Для других ЖКИ следует сверить соответствие ячеек DDRAM знакоместам. Схема подключения ЖКИ к контроллеру выглядит так.
Схема подключения к микроконтроллеру AVR
Резистор R3 - 17 Ом ограничивает ток через подсветку, а переменный VR1 задает контраст (если все правильно подключено и запрограммировано, но индикатор молчит, покрутите VR1, чтобы изображения стало видимым). Также не в коем случае не следует путать полярность ЖКИ, питать его выше 5,5В, со своего опыта могу сказать, что горят они моментально. Назначение всех остальных деталей такое же как в макетной платы для ATtiny2313.
Теперь перейдем к написанию программы. Для контроля индикатора напишем программу с несколькими ключевыми функциями работы с ЖКИ: lcd_dat(unsigned char x) – для записи данных х, lcd_com(unsigned char x) – для записи команды х, lcd_init(void) – для начальной инициализации индикатора:
#include <avr/io.h> //библиотека ввода/вывода #define RS 2 //RS=PD2 - сигнал управления ЖКИ #define E 3 //E=PD3 - сигнал управления ЖКИ #define TIME 10 //Константа временной задержки для ЖКИ //Частота тактирование МК - 4Мгц //Программа формирвоания задержки void pause (unsigned int a) { unsigned int i; for (i=a;i>0;i--); } //Программа передачи команд в ЖКИ void lcd_com (unsigned char lcd) { unsigned char temp; temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи команды temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи команды pause (10*TIME); //Пауза для выполнения команды } //Программа записи данных в ЖКИ void lcd_dat (unsigned char lcd) { unsigned char temp; temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи данных temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи данных pause(TIME); //Пауза для вывода данных } //Программа иниализации ЖКИ void lcd_init (void) { lcd_com(0x2c); //4-проводный интерфейс, 5x8 размер символа pause(100*TIME); lcd_com(0x0c); //Показать изображение, курсор не показывать pause(100*TIME); lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00 pause (100*TIME); } //Основная программа int main(void) { DDRD=0xfc; //Инициализация portD PORTD=0x00; pause(1000); //Задержка, чтобы ЖКИ успел включиться lcd_init(); //Инициализация ЖКИ lcd_dat('w'); //Вывод "www.avrlab.com" lcd_dat('w'); lcd_dat('w'); lcd_dat('.'); lcd_dat('a'); lcd_dat('v'); lcd_dat('r'); lcd_dat('l'); lcd_dat('a'); lcd_dat('b'); lcd_dat('.'); lcd_dat('c'); lcd_dat('o'); lcd_dat('m'); lcd_com(0xc0); //Ставим курсор на начало 2-й строки ЖКИ lcd_dat('I'); //Записываем "It's so easy" lcd_dat('t'); lcd_dat('"'); lcd_dat('s'); lcd_dat(' '); lcd_dat('s'); lcd_dat('o'); lcd_dat(' '); lcd_dat('e'); lcd_dat('a'); lcd_dat('s'); lcd_dat('y'); while(1) //бесконечный цикл ; return 1; }
Программа очень проста, разобраться в ней не составит труда любому, кто хоть немного владеет C для AVR. Для латиницы и цифр ASCII коды совпадают с зашитыми в знакогенератор ЖКИ, поэтому позволительно использовать lcd_dat(‘A’). Можно создать свою библиотеку для работы с ЖКИ, выделив функции lcd_dat(unsigned char x), lcd_com(unsigned char x), lcd_init(void) в отдельный модуль LCD.h и подключать его за надобностью.
Эта затея очень экономит время, стоит только один раз написать нужные функции, а потом все время их только использовать. Также можно подметить, что неудобно выводить длинную фразу по одной букве, для этого можно нашу выводимую строку запихнуть в массив из unsigned char и выводить с помощью цикла:
int main(void) { unsigned char data [14]= {'w','w','w','.','a','v','r','l','a','b','.','c','o','m'}; unsigned char i; DDRD=0xfc; //Инициализация portD PORTD=0x00; pause(1000); //Задержка, чтобы ЖКИ успел включиться lcd_init(); //Инициализация ЖКИ for (i=0;i<14;i++) //Вывод записи побуквенно lcd_dat(data[i]);
Только не стоит забывать, что нумерация массивов в С начинается с нуля. Существующую программу можно без существенных изменений использовать совместно с контроллером ATtiny2313, подключив ЖКИ к PORTB, та как PORTD у ATtiny2313 имеет всего 7 выводов, а не 8, как у ATmega8.
Также советую подключать ЖКИ с помощью разъемных соединений. Очень удобно при отладке программы, когда нужно вывести некоторые промежуточные данные. Подсоединил один разъем и всего дела. В продолжение этой заметки в ближайшее время рассмотрю ввод с матричной клавиатуры 4х4 и отображение считанной информации на ЖКИ.
Всем хорошего дня ;)
Скачать исходный код библиотеки HD44780 под AVR Studio
Скачать исходный код библиотеки HD44780 и модели для Proteus
есть маленький недочет в этом примере
есть маленький недочет в этом примере, возможно по этой причине у многих не работает пример!
вобщем пример лаконичен и прост, поэтому в глаза не бросается маленький недочет(тем кто ориентируется в языке "С"), и уж тем более тем кто только только знакомится с AVR и языком "С", возможно они даже недоумевают как так....пишут сделайте так и будет как на картинке....а не тут то было...
вобщем вся проблема с циклами задержки, для того чтоб дисплей поспевал за контроллером, а именно в функции-
//Программа формирвоания задержки
void pause (unsigned int a)
{ unsigned int i;
for (i=a;i>0;i--);
}
вроде на первый взгляд все верно, но компиляторы для микроконтроллеров стремятся оптимизировать код для максимальной компактности получаемого образа флешь памяти программ... и не видя никакого смысла в пустом цикле и соответственно далее по цепочке за ним: все вызовы, объявления констант и всего связанного с этой безсмысленно по его разумению функцией...попросту убирает это из кода во время сборки...
по крайней мере это справедливо для atmel studio 6.1, и в этом можно убедится просмотрем папку проэкта, там есть *.lss файл содержащий асемблерный код данной программы, генерируемы при сборке проекта. никакого намека на реализацию функции void pause...
в итоге при прошивке контроллера на дисплее получается случайный мусор или пустота...при нажатии несколько раз на ресет мусор может исчезать и вновь появлятся...явно на лицо расссинхронизация проца и экрана
а вот если сделать маленькую поправку
void pause (unsigned int a)
{ unsigned int i;
for (i=a;i>0;i--)
asm("nop");
}
...то для компилятора это обретает смысл, это так же подтверждается явным появлением реализации функции в асемблерном коде
0000006c
:
70: 00 00 nop
6c: 9c 01 movw r18, r24
6e: 03 c0 rjmp .+6 ; 0x76
72: 21 50 subi r18, 0x01 ; 1
74: 31 09 sbc r19, r1
76: 21 15 cp r18, r1
78: 31 05 cpc r19, r1
7a: d1 f7 brne .-12 ; 0x70
и скорей всего все заработает....покрайней мере у меня на atmega16 (внутренняя RC синхронизация 1Mhz) и использовании atmel studio 6.1 было именно так... возможно на др частотах придется поигратся с константой #define TIME 10 и/или значениями передаваемыми функции void pause
вот здесь-> pause(значение) ...или pause(значение*TIME) ....
удачи в обучении управлению AVR!
Большое спасибо! Сам замечал
Большое спасибо! Сам замечал пару раз проблемы именно с паузами и циклам (я большие пацзы через циклы или через вложенные циклы делал).
Это потому что пример он дает
Это потому что пример он дает от себя, а в архиве лежит совсем другой проект))
модуляция в proteus
модулировал схему в протус результат 0
так же как и с GPS трекером
визуально отличный код, достаточно простой но в протеус не работает
То есть у тебя притензии
То есть у тебя притензии какие-то?
Или ты просишь помощи? Определись и от этого будет зависеть мой ответ.
Ознакомся пожалуйста с пользовательским соглашением.
вот мои исходники + протеус
все что смог закоментировал. думаю что разобраться будет не сложно!
bonus: даташит на контролер от хитачи
_https_://rapidshare.com/files/2042393461/lcd.rar
Может я что-то не понял а
Может я что-то не понял а может на работе стоит блокиратор рапидшары, но я совсем не ашел кнопки "Скачать"
Там кнопку Get Free запрятали
Там кнопку Get Free запрятали вниз просто.
Перезалил: http://avrlab.com/upload_files/avrlab_com_working_with_HD44780-proteus.zip
добавьте в htaccess для rar
добвьте строчку AddType "application/x-rar-compressed" .rar в .htaccess,
чтобы архивные файлы нормально загружались.
Если не сложно поясните плз...
I/D
S
S/C
R/L
Поясните плз. их смысл более подробно.
Смотри, представь что ЖКИ -
Смотри, представь что ЖКИ - пишущая машинка, бумага в машинке - память ЖКИ, каретка - указатель курсора. Кроме того ЖКИ на экран выводит не все содержимое памяти, а лишь часть. Вроде как некоторое окно, которое мы налаживаем на нашу бумагу с текстом.
Вот I/D задает как мы будем печатать, справа-налево или слева-направо.
S определяет, будем ли мы сдвигать окно экрана вслед за тем, как печатаем или нет.
S/C - просто смещает видимое окно экрана или каретку машинки.
R/L - уточняет куда (влево или вправо) мы будем сдвигать экран или курсов с помощью флага S/C.
Что это?
Что это?
Это по поводу флагов, см.
Это по поводу флагов, см. таблицу в тексте.
настройка контролера LCD
настройка контролера LCD панели. Я так уже понял отвечает за адресацию памяти.
чего-то помоему не хватает!
Содрал вашу прогу и протэусе и на меги8 не стартует. Экран молчит, стал копать по даташитам и вот что нарыл:
не хватает в инициализации первых трех!
0011 - ждем 5 мс
0011 - ждем 100 мкс
0011 - ждем 2 мс
0010 - ждем 41 мкс
0000 - -и-
0010 - -и-
1000
0000
1000
0000
0001
0000
0100
если я не прав поправте!
Не до конца понял между
Не до конца понял между какими командами паузы при инициализации.
Как просмотрел код
Как просмотрел код приаттаченный выше - все понял. Там хитро при инициализации задержки нужно ставить. Буду иметь ввиду. Статью тоже подредактирую.
Не работает!
Попробовал поменять частоты тактирования, задержки при инициализации и выводе символов(команд), пока что безуспешно. По поводу фьюзов, если вы имеете ввиду сконфигурировать выводы порта D c помощью регистров DDRB, PORTD как выходы с низким лог. уровнем, то это я сделал.
От делать нечего скомпилировал простую прогу вывода символов с помощью средств CodeVisionAVR, загнал в PROTEUS - работает!...а с реальным LCD отказывается..
Какая стоит оптимизация
Какая стоит оптимизация OS?
Надо O0 ставить.
Попробуй зашить хекс-файл, который в архиве с проектом и поставить частоту тактирования 1 Мгц от внутреннего RC генератора.
Нет я говорю о том, что
Нет я говорю о том, что попробуй на порт D вывести например мигалку, или просто зажечь сразу весь порт. Я когда купил только микроконтроллер у меня этого не получилось сделать. Порыл форумы, оказалось что там как-то фьюзы запрограммированы что порт D и все его 8 бит не включены. Проверь этот момент, а лучше попробуй перевесить ЖКИ на другой порт например на B. То что программа в протеусе работает а с реальным нет - это и есть разница в параметрах ЖКИ забитого в протеусе и реального.
Не работает!
Собрал и подключил всё как по схеме, только МК использовал ATmega16 и LCD WH1602M, соответственно откомпилировал в WinAVR для него прошивку. Однако, выводить что либо LCD отказался, также собирал в протеусе(на ATmega 8 и LM016L), данные с МК выводятся но на LCD ничего не видно. В чем может быть проблема? (Если это важно, использовал внутренний RC генератор для тактирования на 1 мГц)
1. Для Atmega16 необходимо
1. Для Atmega16 необходимо через фьюзы включить сперва что бы порт D работал.
2. Попробуй изменить частоту тактирования на 4МГц и на 8МГц. Вся проблема ЖКИ в том, что не выдержаны все паузы при инициализации или при подаче команды. А контроллер ЖКИ очень чувствительный к этому.
??
Есть вопрос:
Собрал схемку хронометра на меге 8 с готовым хексом, - показания выводятся на WH0802,
показание- число из трех цифр, которые выводятся на весь экран, одна цифра состоит из 4-х знакомест. Экран типа псевдографический. Каким образом могла писаться прошивка??
Автор категорически отказывается давать исходники и не комментирует работу- наверное из соображения "интеллектуальной собственности".
По-свободе хочу попробовать написать свою прошивку в учебных целях.
Наверное запрограммировал
Наверное запрограммировал свои специальные символы через CGRAM, а потом комбинирует их.
А дисплей точно не графический? То есть похожие варианты на 32х128 пикселов.
Экран точно
Экран точно алфавитно-цифровым ЖКИ 0802, а работает как графический, позже могу скинуть видео.
Столкнулся с такой
Столкнулся с такой ситуацией.
Есть два LCD 16х2:
1 - MTC-S16204XFGHSAY
2 - WH1602A-YGH-CTK
1-ый использую в проекте с GPS.
2-ой решил использовать в проекте с клавиатурой. Но по каким то причинам lcd не работает.
Контраст регулируется и появляются квадратики. И все.
Возможно там другой порядок инициализации.
Помогите разобраться
Вот даташиты
filebox.od.ua/?file=24a31fc50d62bfcd658bdadac84088ab
Дисплеи ничем не отличаются.
Дисплеи ничем не отличаются. Распиновка одинакова. Тайминги немного разнятся. Попробуй увеличить задержки при отсылке команд на ЖКИ или понизь частоту МК.
Все ЖКИ на HD44780 имеют идентичную систему команд. Ты какой интерфейс юзаеш, 4-х битный, или 8-ми битный? Еще попробуй увеличить задержку между включением ЖКИ и его инициализацией, примерно до 0,1с. Полярность питания для ЖКИ не путалась, чтобы сгореть им немного надо? То я сдуру как-то спалил, а потом пытался подключить. Тоже выводились черные квадратики, через раз выводились данные, т.е. работал крайне нестабильно.
Использую программы из статей
Использую программы из статей о GPS.
интерфейс 4-ех битный
попробовал прогу отсюда
chipenable.ru/index.php/programming-c/75-chasy-na-mikrokontrollere.html
заработало
А что изменить в вашей проге?
Обрати внимание на задержки
Обрати внимание на задержки после подачи команд инициализации и конфигурирования, может в том дело. У меня был случай тоже примерно такой, но контроллеры были и тот и тот одинаковые, а програма работала только на одном.
Аналоги HD44780
Столкнулся с проблемой - не могу найти ЖКИ WH1602A по разумной цене. Например
в чипдипе такие стоят chipdip.ru/product/wh1602a-ygh-ct-k.aspx
700 деревянных. Что такое YGH в названии "WH1602A-YGH-CT(K), ЖКИ 16х2, англо-русский"
Какие есть аналоги ЖКИ на базе HD44780? Вот нашёл страничку micronika.ru/order.phtml?vid=64 - там в названии FDCC1602A-FSBFBW-51SR содержится 1602A,
просто обратил внимание. Может и FDCC1602A-FSBFBW-51S сойдёт без особого изменения кода?
Какие проблемы могут возникнуть при использовани
не собственно HD44780 от Хитачи, а его аналогов?
ЗЫ Не плохо бы почитать про использование различных ЖКИ, аналогов хд44780, чем МЭЛТ'овские
ЖКИ плохи
Первое что скажу: надо
Первое что скажу:
надо различать понятия WH1602 и HD44780
WH1602 означает - WH (WinStar) 1602 - 16 символов, 2 строки.
HD44780 - то знакосинтезирующий контроллер ЖКИ изначально производимый Hitachi.
Все однотипные аналоги практически одинаковы, бывает только необходимо посмотреть datasheet и сравнить задержки на выполнение команд инициализации, скорость записи в ЖКИ команды и данных и подкорректировать соответственно код.
"Все однотипные аналоги
"Все однотипные аналоги практически одинаковы"
Какие именно?
спасибо за быстрые ответы
Аналоги HD44780
IT8705 и KS0066, нашел в инете информацию.
Арифметические операции
Как выполнить сложении или вычитании 2х чисел с плавающей точкой, и вывести их на LCD округление до сотых. (.00)
В общем случае нужно найти
В общем случае нужно найти разрядность. А потом вывести каждую цифру целой части, а потом вывести дробную часть.
Давай немного упростим задачу, выведем дробное число, которое заведомо меньше 1000.
Напишем функцию которая будет выводить double на ЖКИ.
Пример использования:
только все это сожрет много памяти.
Все еще по работе программы
Извиняюсь за настырность, но кое-чего все равно не понимаю.
Прошу объяснить, 1) что такое asm("nop") - функция языка Ассемблер в Си? Что она означает?
2) Когда мы записываем в порт D команду (или данные) например в строках 20-21, а потом посылаем 0 на E-разряд порта (строка 23), то в микроконтроллер записывается старшая тетрада, но как она записывается? По результату строки 21 или 23. Я понимаю, что в принципе данные посылаемые на порт D этими строками программы одинаковые, но, проще говоря, записываются в DDRAM данные, которые были выведены в порт D до посыла сигнала E=0 или те, которые пришли в порт D одновременно с сигналом E=0? И почему нельзя послать сигнал строба E=0 просто выражением PORTD.3=0 а не строкой 23?
3)И наконец, когда мы используем функцию обработки данных lsd_dat, то какой цифровлй код имеет каждая буква? Как он соответствует коду символа CGRAM. Ваша цитата:"Для латиницы и цифр ASCII коды совпадают с зашитыми в знакогенератор ЖКИ, поэтому позволительно использовать lcd_dat(‘A’)". Как скажем выглядела бы программа, если бы мы передавали в функцию lcd_dat не чаровские переменные, а двоичные или 16-ые коды букв?
Надеюсь вы поймете все что я здесь написал и ответите. Заранее огромное спасибо.
1) asm("nop"); - вставка
1) asm("nop"); - вставка ассемблерной команды nop, пропуск операции, используется для формирования задержек.
2)Тетрада записывается по итогам строки 23, т.е. при фронте импульса на выводе Е. Можно сделать и PORTD.3=0, но так
вроде нагляднее. Программирование - творческая штука, один и тот же алгоритм можно написать кучей способов.
3)см табличку http://avrlab.com/upload_files/02_codes.JPG верхняя строка - старшая тетрада кода символа, столбец слева - младшая тетрада кода символа. Например можно заюзать lcd_dat('X'); а можно lcd_dat (0x58); результат будет идентичен.
asm("nop"); - No Operation,
asm("nop"); - No Operation, пауза на один такт.
Пытаюсь разобраться в программе (новое)
Не вник в программу. Когда выводится младшая тетрада? Зачем в строках 25 и 42 умножать lcd на 16. Прошу объяснить, как работает программа, мне по комментам ничего не ясно.
Комменты про младшую/старшую
Комменты про младшую/старшую тетраду подправил. Уже должно быть ясно, какая где тетрада.
Запись (lcd*16) равнозначна записи (lcd<<4) или словами: сдвиг влево на 4 разряда.
Например (2<<4)=32dec тоже что и (2*16)=32dec
Данные передаются в 2 этапа, сперва старшая, потом младшая тетрада. Запись тетрады производиться имульсом на выводе Е. Уровень на RS сообщает индикатору, какой тип переданных данных, данные или команда. Далее инициализируем индикатор, ставим курсов в нулевой положения и рисуем на нем.
4)=32dec>4)>Пытаюсь разобраться в программе
Простите мне мое невежество, я не программист и только лишь начинаю заниматься микроконтроллерами. У меня совсем простенький вопрос: что означает этот символ "~" в программе.
"~" - унарный минус,
"~" - унарный минус, отрицание.
Например:
Также используется в конструкции if-then-else.
Это словесно можно описать так: "если НЕ(а равно 0) то сделать что-то". Или как "если а НЕравно 0, сделать что-то".
В данной проге используется для обнуления сигнала RS (вывод PD2) на ЖКИ.
Отдельная библиотека
В будущем рекомендую вывести все связанные с ЖКИ программы и функции в отдельный файл, и назвать его библиотекой для работы с ЖКИ. Просто удобно будет, не надо будет перемешивать код самой программы с программами отвечающими за работу ЖКИ.