Главная » Программирование » PIC - микроконтроллеры » PIC и ЖКИ на HD44780
PIC и ЖКИ на HD44780

PIC и ЖКИ на HD44780

PIC и ЖКИ на HD44780, часть 1

В прошлых статьях я выводил информацию на восемь светодиодов. Это ни фига не информативно и не интересно — надоедает буквально за первые пять минут. Значит пришла пора разобраться с такой классикой жанра как ЖКИ (LCD).

Под катом часть первая. Вводная.

Контроллер HD44780 — документация

ЖКИ
ЖКИ — Жидкокристаллический индикатор, иногда говорят жидкокристаллический дисплей, дисплейчик. На английском LCD — liquid crystal display.

Индикатор, с которым я буду устраивать эксперименты был куплен на ebay. На дисплее была надпись QC1602A v2.0. По этому названию нашлась документация (datasheet):

LCD-QC1602A-datasheet
LCD-QC1602A-datasheet
LCD-QC1602A-datasheet.pdf
124.1 KiB
286 Downloads
Детали

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

HD44780-LCD-Starter-Guide
HD44780-LCD-Starter-Guide
HD44780-LCD-Starter-Guide.pdf
890.1 KiB
283 Downloads
Детали
HD44780-Based LCD Modules
177.7 KiB
398 Downloads
Детали
AN4032
AN4032
AN4032.pdf
219.0 KiB
252 Downloads
Детали

Русскоязычная документация на контроллер на всеми уважаемом портале http://www.gaw.ru/data/lcd/lcd.pdf

Кодировки

Кодировка (один из варинтов) контроллеров HD44780:

Кодировка HD44780

Кодировка HD44780

Заметьте — кириллицы нет! Если планируется использовать русский текст желательно приобрести дисплей с кириллическими символами. Вот так выглядит его кодировка:

Кодировка (кириллица) HD44780

Кодировка (кириллица) HD44780

Немного о кириллице в HD44780
Обращаю отдельное внимание, что в кириллической части отсутствуют те символы, которые могут быть взяты из латинских. Так, например, нет букв А, а, В, М, К и т.д. Это привело к тому, что при выводе русского текста на дисплей, нет возможности использовать какую-либо кодировку. В то же время, коды латинских  символов совпадают со стандартной кодировкой windows CP1252.

hd44780 — создаем свои символы

В контроллере HD44780 имеется возможность «рисования»своих символов. Этих символов может быть восемь, располагаются в начале таблицы занимая первые восемь знакомест. Следующие восемь знакомест дублируют первые восемь. Зачем это было сделано мне не известно, если кто-то знает — напишите в коментах. Знакоместа своих символов показаны на рисунке:

HD44780 - знакоместа своих символов

HD44780 — знакоместа своих символов

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

CGRAM - свои символы в HD44780

CGRAM — свои символы в HD44780

Используя эту возможность контроллера HD44780 можно выводить текст на русском языке даже в том случае, если дисплей не русифицирован. Разумеется, одновременно можно отображать не более восьми различных символов. И все же, крайне рекомендую, в проектах с кириллицей использовать дисплеи с соответствующей кодировкой, а свободно создаваемые символы использовать по назначению — для вывода специальных значков вроде мнемоники батарейки, антенны, значка температуры и т.п. Например progress bar:

Питание дисплея

У ЖК дисплеев этого типа необходимо два питания — основное (+5В) и дополнительное, V0 которым устанавливается контрастность дисплея. Причем V0 на самом деле считается не от GND, а от плюса основного питания. Для ЖК дисплея QC1602A v2.0 номинальное напряжение V0 примерно -3,8В относительно положительного контакта питания.

Это означает, что при питании дисплея напряжением 5В, на V0 необходимо подать 1,2В относительно GND (общий провод, земля). При питании дисплея напряжением 3,8В, на V0 необходимо подать 0В относительно GND (соединить с общим проводом).

Питание ЖКИ

Питание ЖКИ

В случае изменения напряжения питания необходимо менять и напряжение V0. На рисунке показан граничный случай — напряжение питания уменьшено настолько, что V0 равно 0В.

Vо меняется вместе с питанием

Vо меняется вместе с питанием

Если уменьшить напряжение питания еще, то V0 потребуется делать отрицательным.

В реальности два источника питания использовать необязательно, для формирования V0 достаточно использовать делитель на подстроечном резисторе:

Формирование Vo резистором

Формирование Vo резистором

Забегая вперед скажу, что я на отладочной плате подключил V0 к ЦАП. Это позволит регулировать контраст программно 🙂

Подключение дисплея на HD44780 к PIC18F45K20

Есть четыре основных комбинации подключения дисплея на HD44780  к микроконтроллеру. Первое с чем нужно определиться — это разрядность шины данных, которая может быть как 8 бит, так и 4 бит. Второе с чем нужно определиться — будет ли использоваться режим чтения из дисплея.

Интерфейс дисплея на HD44780

Интерфейс дисплея на HD44780

  1. RS (Register Select). Если RS = 0, пишем/читаем команды. Если RS = 1, пишем/читаем данные.
  2. R/W (Read/Write). Если R/W = 0, производится запись команд/данных. Если R/W = 1, производится чтение команд/данных. Если операции чтения не нужны, R/W необходимо подключить к GND (обычно так и делают).
  3. E (Enable). Стробирующий вход — при перепаде логического уровня с 1 до 0 производится операция чтения или записи выставленных данных.
  4. D0D7. 8-битная шина данных. Если D3…D0 отключить от МК и подключить к GND получим 4-битную шину. 4-битный вариант позволяет сэкономить четыре порта I/O МК, но немного усложняет алгоритм работы с дисплеем. D7 может выполнять роль флага готовности, BF. Чтение BF возможно при RS = 0, R/W = 1. BF = 1 означает, что выполняется предыдущая инструкция; BF = 0 означает готовность принять новую инструкцию/данные.

На моей схеме дисплей подключен по максимальной схеме — 8-бит шина и возможность записи/чтения. Урезать шину и возможность чтения можно будет позже программно. Изменения относительно базовой схемы отладочной платы DV164131 показаны на рисунке ниже и выделены цветом:

Подключение дисплея к PIC18F45K20

Подключение дисплея к PIC18F45K20

Как показала практика, контроллер сильно влияет на напряжение полученное PWM V0, из-за большого внутреннего сопротивления источника V0, которое определяется резистором 10 кОм. Я уменьшил этот резистор до 1 кОм, а конденсатор увеличил до 1 мкФ.

Изменение в RC-цепи для ШИМ

Изменение в RC-цепи для ШИМ

Учитывая микропрограмму написанную в предыдущем материале, изменение контрастности изменяется кнопкой.

Инициализация дисплея на HD44780

Инициализация заключается в посылке нескольких инструкций (команд) в определенной последовательности и с определенными промежутками времени. Промежутки времени должны быть не менее, чем указано в документации. Первая инструкция должно посылаться не ранее чем через 15 мс после подачи питания (4,5 В) и не менее 40 мс при питании 2,7 В. Код инициализации дисплея с контроллером HD44780 показан ниже:

//##############################################################################
//      Инициализация дисплея
//------------------------------------------------------------------------------
void DSPL_INIT(void)
{
DSPL_STRB_OUT;
DSPL_RW_OUT;
DSPL_RS_OUT;
DSPL_INSTR;
DSPL_WRITE;
DBx_OUT;
DSPL_STRB_0;
Delay10KTCYx(80);       // Ждем после подачи питания не менее 15..40 мс после подачи питания (50 мс)

DSPL_WI(0b00111000);    // Выбор 8-бит режима
Delay1KTCYx(100);        // Ждем 4,1 мс (7 мс)

DSPL_WI(0b00110000);    // Выбор 8-бит режима
Delay100TCYx(20);       // Ждем 100 мкс (150 мкс)

DSPL_WI(0b00110000);    // Выбор 8-бит режима

                        /* С этого момента доступен флаг BF */
DSPL_WI(0b00111000);
          // ||||+-- FT0 - FT=10:Кириллица (только для дисплеев с несколькими кодировками)
          // |||+--- FT1
          // ||+---- F - 1:5x10dots; 0:5x8dots;
          // |+----- N - 1:2 строки; 0:1 строка
          // +------ DL - 8 или 4 бит данные

DSPL_WI(0b00001100);
          //   ||+-- B - 1:курсор мерцает
          //   |+--- C - Показать курсор
          //   +---- D - Включает/отключает дисплей

DSPL_WI(0b00000001);    // Очистка дисплея

DSPL_WI(0b00000110);    // Сдвиг курсора или экрана при записи символа
          //    |+-- S - 0:Запретить сдвиг дисплея, двигать курсор
          //    +--- I/D - 1:Increment; 0:Decrement (дисплея или курсора)

DSPL_WI(0b00000010);    // Счетчик DDRAM в 0 (1.52 ms)
Delay1KTCYx(30);        // Ждем 1,52 мс (1.8 мс)

DSPL_WI(0b00001100);
          //   ||+-- B - 1:курсор мерцает
          //   |+--- C - Показать курсор
          //   +---- D - Включает/отключает дисплей

DSPL_WI(0b00010000); // Управление сдвигом дисплея/курсора

DSPL_WI(0b01000000); // Переключиться на CGRAM и задать адрес -

DSPL_WI(0b10000000); // Переключиться на DDRAM и задать адрес

/*            "1---------10-------N"   */
DSPL_PUTS_CUR("1 2 3 4 5 6 7 8 ",1,1);
DSPL_PUTS_CUR("-=PRO-DIOD.RU=- ",2,1);
}

DSPL_WI( ) — функция записи инструкции:

//##############################################################################
//      Запись инструкции в дисплей
//------------------------------------------------------------------------------
void DSPL_WI(unsigned char Data)
{
DSPL_INSTR;
DSPL_WRITE;
DBx_OUT;

/* Передача байта */
DSPL_DB7 = (unsigned int)((Data & 0b10000000)>>7);
DSPL_DB6 = (unsigned int)((Data & 0b01000000)>>6);
DSPL_DB5 = (unsigned int)((Data & 0b00100000)>>5);
DSPL_DB4 = (unsigned int)((Data & 0b00010000)>>4);
DSPL_DB3 = (unsigned int)((Data & 0b00001000)>>3);
DSPL_DB2 = (unsigned int)((Data & 0b00000100)>>2);
DSPL_DB1 = (unsigned int)((Data & 0b00000010)>>1);
DSPL_DB0 = (unsigned int)((Data & 0b00000001)>>0);

DSPL_STRB_OK;
Delay10TCYx(50);        // Ждем 37 мкс (40 мкс)
}

Функция записи данных (DSPL_WD(  )) отличается только этой строчкой: DSPL_INSTR заменить на DSPL_DATA.

Ну и чтобы не мучить тонкостями, прилагаю готовый проект. При выполнении происходит инициализация дисплея и выводятся строчки «1 2 3 4 5 6 7 8 » и «PRO-DIOD.RU».

LCD 16x2 Инициализация
LCD 16x2 Инициализация
project_display_s1.zip
197.2 KiB
148 Downloads
Детали

Поскольку код для работы с дисплее немаленький по объему, я вынес работу с ЖКИ в отдельный файл:

Структура проекта для LCD HD44780

Структура проекта для LCD HD44780

Вот что должно получится в итоге (питания 5 В):

HD44780 и свои символы

Как я уже упоминал выше, в дисплеи на HD44780 можно записать до восьми произвольных символов. Для этого необходимо послать команду 0x40 (0b0100 0000) и данные с описанием символов. Если записываем все восемь символов, достаточно указать команду с нулевым начальным адресом (0x40 = 0b01000000 — адрес первого символа) и записать 64 байта, описывающих 8 символов, при этом каждый байт — одна строка в символе. Если нужно записать конкретный символ, нужно указать команду (например, 0b0101 0000 — адрес третьего символа) с адресом символа и записать 8 байт. Не буду приводить портянки кода — лучше сразу выложу проект.

ЖКИ, свои символы, кодовая таблица
239.3 KiB
119 Downloads
Детали

В этом проекте при старте отображаются нестандартные символы, которые определены в массиве «SymbolLCD» файла display_lcd.h:

Свои символы в ЖКИ (LCD)

Свои символы в ЖКИ (LCD)

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

Отвлечемся и разберем дисплей

Вы наверное заметили, что у меня дисплей не с голубыми символами на темно-синем фоне, а желтые символы на хрен знает каком фоне 🙂 Объясняется это просто — пока экспериментировал, у дисплея сдохла подсветка. Дисплей разобрал, оказалось, что там не матрица светодиодов (в других была матрица), а только один сбоку — ярко-синий светодиод прямоугольного сечения. Пришлось его заменить на то, что было под рукой. Все на картинках ниже:

Вопросы, критика, поправки — в комментариях.

Продолжение — часть 2.

UPD 1. Исправил ссылку на проект со своими символами. При нахождении таких ошибок — присылайте свои замечания!

Метки:: , , , ,

Ваш отзыв