Использование cимвольных жидкокристаллических LCD дисплеев. Пример на GCC (WinAVR) для Atmega 8
Основными достоинствами символьных жидкокристаллических индикаторов (дисплеев) являются простота использования, не большая потребляемая мощность, рабочие напряжения 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 | подсветка в торец |
Параметры стандартных моделей символьных ЖКИ-индикаторов:
Тип | Модель | Размер модуля, мм | Размер видимой области, мм | Размер точки, мм | Размер символа, мм | 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 |
Смотри так же:
Добрый день. Вы написали что Ваша библиотека работает с экранами любого разрешения, но ковыряясь в строках данной библиотеки я увидел определение всего одного выхода - Е1. На ЖКИ больше 2х строк (У меня 4х строчный WH4004) имеется вывод E2. Соответсвенно вывод Е1 работает со строками 0 и 1, а Е2 с остальыми двумя 2 и 3. Подскажите пожалуйста как быть с таким большим экраном, что нужно отредактировать в библиотеке?
Да, Вы правы. Библиотека не будет полноценно работать с дисплеями 40x4 (в таких дисплеях используется два чипа). Библиотека создавалась для дисплеев с одним чипом (максимум 80 символов). Т.е. для максимальных размеров 20x4, 40x2. Для такого дисплея придется значительно модифицировать библиотеку. Я подумаю, что можно сделать. Но не обещаю это сделать быстро, поскольку не имею под рукой дисплея такого размера.
Буду очень признателен, как в прочем и многие, если Вы сможете сделать если не универсальную библиотеку, так хотябы дополнительную для работы с большими экранами.
Добрый день. При эмуляции в Proteus 7.8 Вашего примера с lcd_lib ,созданный символ батареи отображается в первой ячейке первой строки и при изменении позиции для записи остаётся в той же позиции. Остальные символы выводятся верно в указанные позиции. Проблема эмулятора, библиотеки или примера? Можно подробней о записи в CGRAM по адресам и вывод этих символов .
Здравствуйте, подскажите - как исправить то, что ваша библиотека работает только если шина управления и данных на разных портах? поколупался - вроде должно работать и на одном, но нет - на одном порту не работает
В ближайшие дни проверю, разберусь, сообщу.
Проверил. Все работает. Перенес с 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 не исправили?
Здравствуйте.Огромное спасибо за модуль для ЖКИ и детальное разъяснение.Но несмотря на обилие информации не смог запустить.Пробовал на разных портах и правил соответственно хедер.Также,пробовал другие либы,но ефект один - высвечивается верхняя строка в впрямоугольниках и все(((. Подключал как показано в этой статье и заливал прошивку что в папке с исходниками - безполезно(( Что я мог упустить? Может,проблема в фьюзах? Правда в код ЖКИ добавлял код мигания лампочки -лампочка мигает,ЖКИ светиться верхняя строка в прямоугольниках и хоть плачь. Большая просьба,помочь решить данную проблему.
Вероятнее всего, Фюзы отвечающие за тактирование МК выставлены не правильно. Частота должна быть 1Mhz. Если с частотой все в порядке проверьте правильность подключения ЖК.
подскажите, что нужно добавить(исправить) для работы на частоте 16Мгц. посмотрел листинги, там вроде стоят delay-и. или есть еще некоторые нюансы?
Возвращаюсь к вопросу Игоря: На ЖКИ больше 2х строк (У меня 4х строчный WH4004) имеется вывод E2. Соответсвенно вывод Е1 работает со строками 0 и 1, а Е2 с остальыми двумя 2 и 3. Подскажите пожалуйста как быть с таким большим экраном, что нужно отредактировать в библиотеке? у меня та же проблема, но у меня 4х строчный DV40400. Заранее спасибо
Библиотека пока не умеет работать с 4 строчными ЖКИ. Увы, библиотеку для этого нужно серьёзно дорабатывать. К сожалению, у меня пока не было задачи для 4-х строчных ЖКИ, соответственно, и самого 4-х строчного ЖКИ. А поскольку перешел на графические дисплее, вряд ли появится. Но я могу попробовать это сделать с помощью средств эмуляции.
Недавні записи
- Text to speech. Українська мова
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
Tags
docker sensors rtc led timer wifi remap sms css websocket mongodb bme280 rfid bluetooth esp8266 nodemcu bkp piezo bmp280 i2c mpu-6050 encoder examples avr brushless ngnix nvic displays bldc java-script pmsm barometer pwm lcd ethernet stm32 raspberry-pi capture usart gpio exti atmega meteo solar smd dma adc eeprom eb-500 flask python ssd1306 uart options flash mpx4115a html gps st-link 3d-printer servo dc-dc foc git books battery hih-4000 watchdog dht11 web tim programmator ssd1331 mpu-9250 usb rs-232 motor max1674 soldering
Архіви