Использование cимвольных жидкокристаллических LCD дисплеев. Пример на GCC (WinAVR) для Atmega 8


28.04.2011

Основными достоинствами символьных жидкокристаллических индикаторов (дисплеев) являются простота использования, не большая потребляемая мощность, рабочие напряжения 3..5 В, долговечность (до 15 лет непрерывной работы). На данный момент очень популярны ЖКИ компания Winstar. Не то чтобы популярны, соотношение цена/качество у них наиболее приемлемое. Winstar производить широкую линейку ЖКИ в том числе и графические индикаторы, но сегодня мы говорим о символьных.  (см. также Графический дисплей WG12864A)

Схема подключения жидкокристаллических дисплеев

В качестве примера возьмем наиболее часто используемый WH1602. Назначение контактов LCD:

У ЖКИ есть 8-ми и 4-х проводной режим обмена данными с микроконтроллером.  Мы будим работать с 4-x. Ноги надо экономить :)

Внимание! Внимательно изучайте назначение выводов дисплея! У индикаторов с разным расположением контактов могут отличаться назначение выводов. Так, например, у WH1602D-YGH-CTK на первый вывод подается напряжение питания, в то время как другим индикаторам на первый вывод следует подавать общий провод (землю).

В нашем случае выводы дисплея DB0, DB1, DB2, DB3 задействованы НЕ будут.

Схема подключения к микроконтроллеру следующая:

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

GCC Библиотека для LCD

Данная библиотека была найдена на просторах интернета. Мне пришлось ее доработать, так как библиотека требовала в качестве шины данных использование четырех исключительно старших разрядов порта. При этом не позволяла использовать оставшиеся линии порта. Теперь для данных можно использовать любые 4 подряд идущие линии порта (0,1,2,3), (1,2,3,4), (2,3,4,5), (3,4,5,6) или (4,5,6,7), а другие ноги этого же порта можно нормально задействовать. Библиотека может быть использована для символьных дисплеев с любым разрешением.

Используемая библиотека требует использовать для линий данных (DB4..DB7) идущих подряд 4-х линий одного порта. Для линий управления RS, E (R/W не используется) могут быть задействованы линии другого порта. Поскольку R/W не задействуем, легко догадаться, что читать из дисплея библиотека не умеет. В файле lcd_lib.hобратите внимание на описание используемых портов:


#define LCD_RS 1  //define MCU pin connected to LCD RS
//#define LCD_RW 0 //define MCU pin connected to LCD R/W<
#define LCD_E 2 //define MCU pin connected to LCD E
#define LCD_D4 4 //define MCU pin connected to LCD D3
#define LCD_D5 5 //define MCU pin connected to LCD D4
#define LCD_D6 6 //define MCU pin connected to LCD D5
#define LCD_D7 7 //define MCU pin connected to LCD D6
#define LDP PORTD //define MCU port connected to LCD data pins
#define LCP PORTB //define MCU port connected to LCD control pins
#define LDDR DDRD //define MCU direction register for port connected to LCD data pins
#define LCDR DDRB //define MCU direction register for port connected to LCD control pins

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

Краткое описание функций:

void LCDsendChar - Печатает один символ в текущую позицию void LCDinit - Инициализация LCD void LCDclr - Очистка LCD void LCDhome - переводит курсор в начало void LCDstring - Печатает строку указанной длинны в текущую позицию void LCDGotoXY - Перемещает курсор в указанную позицию void CopyStringtoLCD - Копирует строку из флэш-памяти в указанную позицию дисплея void LCDdefinechar - Записывает изображение символа в память дисплея void LCDshiftRight - перемещает изображение на указанное число символов вправо void LCDshiftLeft - перемещает изображение на указанное число символов влево void LCDcursorOn - Включает курсор подчеркивание void LCDcursorOnBlink - Включает мигающий курсор void LCDcursorOFF - Выключает курсор void LCDblank - отключает изображение, но не очищает void LCDvisible - включает изображение void LCDcursorLeft - перемещает курсор на указанное число символов влево void LCDcursorRight - перемещает курсор на указанное число символов вправо

 Контрастность, программное изменение контрастности

Контрастность дисплея управляется подачей напряжения на специальный контакт (см. документацию по дисплею). При этом уровень контрастности зависит от разницы величины напряжения между напряжением питания и напряжением, поданным на контакт контрастности. Для нормальной контрастности разница должна составлять примерно 4 Вольта. Т.е. на контакт контрастности нужно подать при питании 5В примерно 5-4=1 вольт, и примерно 3.3-4=-0.7В (!отрицательное напряжение) при питании 3.3В. Дисплеи, которые имеют встроенный преобразователь напряжения (для контрастности) могут работать при питании 3.3 и 5 В. Обычно это указано в документации. Электроника дисплеев, рассчитанных на питание 5В, отлично работает и при 3.3В., единственный вопрос - где взять отрицательное напряжение для управления контрастностью? Для этого я применяю не сложную схему инвертора напряжения:

На вход схемы подаем ШИМ сигнал с микроконтроллера. Управляя скважностью сигнала, можно программно регулировать контрастность. Для ATMega8 это делается примерно так:


TCCR1A = (1<<WGM10) | (1<<WGM11) | (1<<COM1A1);
 TCCR1B = (1<<CS11);

OCR1A = 7; // Уровень контрастности

DDRB |= (1<<OC1A);

Характеристики и обозначение дисплеев

Дисплеи Winstar имеют буквенно-цифровое обозначение, в котором содержаться его характеристики. Система обозначений приведена в следующей таблице:
W H 1602 B - Y G B - CP **
1 2 3 4 5 6 7 8 9
Пояснение Значение Описание
1 Производитель W продукт Winstar
2 Тип модуля H символьный
G графический
X TAB
3 Число символов, строк или точек 08,16,20,24,40... количество символов в строке (для символьных ЖКИ)
120,122,128... количество точек в строке (для графических ЖКИ)
01,02,03,04... количество строк (для символьных ЖКИ)
08,16,32...240... количество точек в столбце (для графических ЖКИ)
4 Модель индикатора A - Z Серийный номер модели
5 Тип и цвет подсветки N без подсветки
A светодиодная янтарная
B электролюминисцентная синяя
D электролюминисцентная зелёная
F CCFL белая
G светодиодная зелёная
P светодиодная синяя
R светодиодная красная
T светодиодная белая
W электролюминисцентная белая
Y светодиодная желто-зеленая
6 Тип и цвет ЖКИ B TN позитивный, серый
F FSTN позитивный
G STN позитивный, серый
M STN негативный, синий
N TN негативный
T FSTN негативный
Y STN позитивный, желто-зелёный
7 Тип поляризации, диапазон температур, угол зрения A на отражение, 0 - +50°C, 6:00
B на просвет и отражение, 0 - +50°C, 6:00
C на просвет, 0 - +50°C, 6:00
D на отражение, 0 - +50°C, 12:00
E на просвет и отражение, 0 - +50°C, 12:00
F на просвет, 0 - +50°C, 12:00
G на отражение, -20 - +70°C, 6:00
H на просвет и отражение, -20 - +70°C, 6:00
I на просвет, 0 - +50°C, 6:00
J на отражение, -20 - +70°C, 12:00
K на просвет и отражение, -20 - +70°C, 12:00
L на просвет, -20 - +70°C, 12:00
8 Знакогенератор JS / JP английский/японский
EE / EU / EP / ES / EC английский/европейский
CP английский/русский
9 Специальный код V встроенный источник отрицательного напряжения
T встроенный источник отрицательного напряжения и температурная компенсация
TS Touch Screen
E подсветка в торец
Пример: WH1602A-YGB-CP - алфавитно-цифровой модуль серии A с желто-зелёной светодиодной подсветкой, STN позитивный серый, на стандартный диапазон температур, с англо/русским знакогенератором.

Параметры стандартных моделей символьных ЖКИ-индикаторов:

Тип Модель Размер модуля, мм Размер видимой области, мм Размер точки, мм Размер символа, мм Process Color Backlight
TN STN Gray STN Yellow STN Blue None LED EL
WH0802 A 58.0 x 32.0 38.0 x 16.0 0.56 x 0.66 2.96 x 5.56
WH1202 A 55.7 x 32.0 46.0 x 14.5 0.45 x 0.60 2.65 x 5.50
WH1601 A 80.0 x 36.0 66.0 x 16.0 0.55 x 0.75 3.07x 6.56
B 85.0 x 28.0 66.0 x 16.0 0.55 x 0.75 3.07x 6.56
WH1602 A 84.0 x 44.0 66.0 x 17.0 0.55 x 0.65 2.95 x 5.55
B 80.0 x 36.0 66.0 x 16.0 0.55 x 0.65 2.96 x 5.56
C 85.0 x 36.0 66.0 x 16.0 0.56 x 0.66 2.96 x 5.56
D 85.0 x 30.0 66.0 x 16.0 0.56 x 0.66 2.96 x 5.56
J 80.0 x 36.0 66.0 x 16.0 0.56 x 0.65 2.96 x 5.56
L 122.0 x 44.0 99.0 x 24.0 0.92 x 1.10 4.84 x 9.66
M 85.0 x 32.6 66.0 x 17.0 0.56 x 0.65 2.96 x 5.56
WH1604 A 87.0 x 60.0 62.0 x 26.0 0.55 x 0.55 2.95 x 4.75
B 70.6 x 60.0 60.0 x 32.6 0.55 x 0.55 2.95 x 4.75
WH2002 A 116.0 x 37.0 85.0 x 18.6 0.60 x 0.65 3.20 x 5.55
L 180.0 x 40.0 149.0 x 23.0 1.12 x 1.12 6.00 x 9.66
M 146.0 x 43.0 123.0 x 23.0 0.92 x 1.10 4.84 x 9.22
WH2004 A 98.0 x 60.0 77.0 x 25.2 0.55 x 0.55 2.95 x 4.75
L 146.0 x 62.5 123.5 x 43.0 0.92 x 1.10 4.84 x 9.22
WH2402 A 118.0 x 36.0 94.5 x 16.0 0.60 x 0.65 3.20 x 5.55
WH4002 A 182.0 x 33.5 154.4 x 16.5 0.60 x 0.65 3.20 x 5.55
WH4004 A 190.0 x 54.0 147.0 x 29.5 0.50 x 0.55 2.78 x 4.89
Успехов!

Смотри так же:

Графический дисплей WG12864A

7-и сегментный ЖК-индикатор. Пример использования.

Схеми і прошивки
Коментарі:
Игорь говорить:
21.08.2011 21:00
Добрый день. Вы написали что Ваша библиотека работает с экранами любого разрешения, но ковыряясь в строках данной библиотеки я увидел определение всего одного выхода - Е1. На ЖКИ больше 2х строк (У меня 4х строчный WH4004) имеется вывод E2. Соответсвенно вывод Е1 работает со строками 0 и 1, а Е2 с остальыми двумя 2 и 3. 
Подскажите пожалуйста как быть с таким большим экраном, что нужно отредактировать в библиотеке?

admin говорить:
22.08.2011 09:20
Да, Вы правы. Библиотека не будет полноценно работать с дисплеями 40x4 (в таких дисплеях используется два чипа). Библиотека создавалась для дисплеев с одним чипом (максимум 80 символов). Т.е. для максимальных размеров 20x4,  40x2. Для такого дисплея придется значительно модифицировать библиотеку. Я подумаю, что можно сделать. Но не обещаю это сделать быстро, поскольку не имею под рукой дисплея такого размера.

Игорь говорить:
22.08.2011 16:30
Буду очень признателен, как в прочем и многие, если Вы сможете сделать если не универсальную библиотеку, так хотябы дополнительную для работы с большими экранами.

Иван говорить:
08.02.2012 11:45
Добрый день. При эмуляции в Proteus 7.8  Вашего примера с lcd_lib ,созданный символ батареи отображается в первой ячейке первой строки и при  изменении позиции для записи  остаётся  в той же позиции. Остальные символы выводятся верно в указанные позиции. Проблема эмулятора, библиотеки или примера?
Можно подробней о записи в CGRAM  по адресам  и вывод этих символов .

Вячеслав говорить:
25.02.2012 07:09
Здравствуйте, подскажите - как исправить то, что ваша библиотека работает только если шина управления и данных на разных портах? поколупался - вроде должно работать и на одном, но нет - на одном порту не работает

admin говорить:
27.02.2012 09:52
В ближайшие дни проверю, разберусь, сообщу.

admin говорить:
29.02.2012 17:05
Проверил. Все работает. Перенес с PB1 PB2 на PD1 PD2, поправил название порта в lcd_lib.h:

#define LDP PORTD	//define MCU port connected to LCD data pins
#define LCP PORTD	//define MCU port connected to LCD control pins
#define LDDR DDRD	//define MCU direction register for port connected to LCD data pins
#define LCDR DDRD	//define MCU direction register for port connected to LCD control pins

Возможно  PORT или DDR  не исправили?

Дмитрий говорить:
05.03.2012 21:25
Здравствуйте.Огромное спасибо за модуль для ЖКИ и детальное разъяснение.Но несмотря на обилие информации не смог запустить.Пробовал на разных портах и правил соответственно хедер.Также,пробовал другие либы,но ефект один - высвечивается верхняя строка в впрямоугольниках и все(((.  Подключал как показано в этой статье и заливал прошивку что в папке с исходниками - безполезно((  Что я мог упустить? Может,проблема в фьюзах? Правда в код ЖКИ добавлял код мигания лампочки -лампочка мигает,ЖКИ светиться верхняя строка в прямоугольниках и хоть плачь. Большая просьба,помочь решить данную проблему.

admin говорить:
07.03.2012 17:01
Вероятнее всего, Фюзы отвечающие за тактирование МК выставлены не правильно. Частота должна быть 1Mhz. Если с частотой все в порядке проверьте правильность подключения ЖК.

бАрада говорить:
19.03.2012 02:24
подскажите, что нужно добавить(исправить) для работы на частоте 16Мгц.
посмотрел листинги, там вроде стоят delay-и. или есть еще некоторые нюансы?

tzzk говорить:
24.04.2012 18:10
Возвращаюсь к вопросу Игоря: На ЖКИ больше 2х строк (У меня 4х строчный WH4004) имеется вывод E2. Соответсвенно вывод Е1 работает со строками 0 и 1, а Е2 с остальыми двумя 2 и 3.
Подскажите пожалуйста как быть с таким большим экраном, что нужно отредактировать в библиотеке?

у меня та же проблема, но у меня 4х строчный DV40400. Заранее спасибо

admin говорить:
26.04.2012 08:11
Библиотека пока не умеет работать с 4 строчными ЖКИ. Увы, библиотеку для этого нужно серьёзно дорабатывать. К сожалению, у меня пока не было задачи для 4-х строчных ЖКИ, соответственно, и самого 4-х строчного ЖКИ. А поскольку перешел на графические дисплее, вряд ли появится. Но я могу попробовать это сделать с помощью средств эмуляции.

Додати коментар
Code
* - обов'язкові поля

Архіви