LCD дисплеи от компании Winstar уже на протяжении нескольких лет являются неотъемлемой частью современной электронной продукции, и не только на российском рынке. Они дешевы, очень распространены (не видел магазинов, где их не было бы), их разнообразие предоставляет разработчику выбирать подходящий в зависимости от эксплуатационных условий. Их различие заключается в диапазонах рабочих температур, количеством строк для отображения информации, количеством знакомест в строке, стандартными из которых являются значения 8, 12, 16, 20, 24 и 40 символов на одну строку, так же различаются размерами символа, его разрешением, размерами самого дисплея и т.д. Winstar выпускает не только буквенно-цифровые знакосинтезирующие LCD-модули, но и графические. Те, в свою очередь, тоже имеют различные параметры, что предоставляет пользователю возможность выбирать подходящий исходя из поставленной задачи.
Многие начинающие радиолюбители, только-только начавшие осваивать цифровую технику, микроконтроллеры, рано или поздно столкнутся с проблемой, связанной с подключением и управлением данного дисплея. Немного упростив ситуацию с даташитом на дисплей WH1602B, я старался описать процесс подключения и управления модулем максимально просто для понимания.
Стандартно дисплей WH1602B выглядит так:
16 выводных линий, из которых 11 – линии управления, расположены в ряд с шагом 2,54мм, что позволяет разработчику напрямую подпаять шлейф или поставить разъем, и отвести шлейф к плате управления, в зависимости от конструкции конечного устройства.
Далеко не редким является дисплей с боковым расположением контактов.
В зависимости от конструктива радиоэлектронного устройства разработчик может использовать любой тип расположения выводов – различия между программными обеспечениями совершенно нет.
Модули могут комплектоваться задней подсветкой экрана, причем тип источника подсветки у разных модулей различен. В некоторых дисплеях используется электролюминесцентная подсветка, обеспечивающая равномерное распределение свечения по всей отображаемой поверхности экрана. Главным недостатком дисплея с таким типом подсветки является, пожалуй, одно: для питания такого дисплея нужен переменный ток высокого напряжения. У светодиодных подсветок недостатков практически нет, модули с применением светодиодной подсветки могут использоваться в приложениях, работающих при широких диапазонах температур. Производитель дает широкий выбор в плане цвета подсветки – поскольку светодиодные матрицы можно установить практически любого цвета.
Существенным недостатком дисплеев WH1602B является ток потребления, поэтому применять данный тип дисплеев в устройствах с автономным питанием совершенно невыгодно.
Дисплеи линейки WH построены на базе специализированного контроллера LCD-модулей HD44780, который как раз и разрабатывался для управления знакосинтезирующими ЖК-панелями.
С небольшим описанием, пожалуй, стоит закончить, и приступить к практической части. Нумерация выводов дисплея, если смотреть на него сверху (т.е. как мы смотрим на него при чтении информации), идет начиная с самого крайнего левого вывода. Это вывод 1.
Подключение 1602:
Итак распиновка 1602:
1) GND – общий провод
2) Vcc – напряжение питания +5В
3) V0 – контрастность
4) RS – линия выбора регистра
5) RW – линия выбора направления передачи данных (чтение или запись)
6) E – линия синхронизации
7) DB0 – 14) DB7 – линии шины данных
15) A – анод подсветки (подключаем сюда +5В через резистор 100Ом)
16) К – катод подсветки (подключаем к общему проводу)
Дисплей может работать в 2 режимах: в режиме 8-битной передачи данных, когда данные передаются группами по 8 бит (при этом обеспечивается максимальная скорость взаимодействия с дисплеем), и в режиме 4-битной передачи, когда 8-битные данные разбиваются на две группы по четыре разряда и последовательно передаются по четырем старшим линиям данных DB4-DB7.
Для начала работы с дисплеем его нужно инициализировать. Процесс инициализации заключается в последовательной передачи контроллеру HD44780 определенных данных. После их обнаружения, он будет готов принимать данные для отображения на экране.
Мы рассмотрим процесс инициализации дисплея WH1602B в 8-битном режиме с использованием управляющей платы, основанной на микроконтроллере Attiny2313.
Итак, какие действия необходимо выполнить для надежного процесса инициализации:
1) Включить питание дисплея
2) Выдержать паузу 20мс
3) Выдать команду 00110000 при RS=0 RW=0
4) Выдержать паузу не менее 40мкс
5) Выдать команду 00110000 при RS=0 RW=0
6) Выдержать паузу не менее 40мкс
7) Выдать команду 00110000 при RS=0 RW=0
8) Выдержать паузу не менее 40мкс
9) Выдать команду 00111000 при RS=0 RW=0
10) Выдержать паузу не менее 40мкс
11) Выдать команду 00001000 при RS=0 RW=0
12) Выдержать паузу не менее 40мкс
13) Выдать команду 00000001 при RS=0 RW=0
14) Выдержать паузу не менее 1,5мс
15) Выдать команду 00000110 при RS=0 RW=0.
Поясню: RS – как отмечалось выше – линия выбора регистра (0 – адресуется регистр команд, в который мы записываем команды отключения дисплея, сдвига строки, установление курсора и т.д.; 1 – адресуется внутренняя память, куда будет записываться байт и отображаться на дисплее).
RW – линия выбора направления передачи данных (0 – запись в дисплей, 1 – чтение данных из дисплея).
После выдачи данных на линию данных DB0-DB7 и установки значений на линиях RS, RW, необходимо эти данные защелкнуть – для этого нужно установить линию E в 1, и, затем, снова сбросить в исходное положение – в 0.
Подключаем PD0 микроконтроллера к линии RS LCD, вывод PD1 микроконтроллера к RW дисплея, ну а PD2 – соответственно к линии Е дисплея, а линии шины данных DB0-DB7 к соответствующим линиям порта B микроконтроллера. Сам дисплей подключаем согласно схеме вверху.
Теперь дело за программной частью:
.include "tn2313def.inc" ; Attiny2313, 1 MHz clock .cseg .org 0 rjmp reset ;******************************************************************** ;Стандартный переход к инициализированной части программы reset: ldi r16, low (RAMEND) ; Инициализация стека МК out SPL, r16 rcall lcd_init ; Инициализация дисплея ;Здесь мы инициализировали стек микроконтроллера и перешли к инициализации LCD-модуля ;******************************************************************** lcd_init: ldi r16, 0b10000000 ; сбрасываем все подтягивающие резисторы out MCUCR, r16 ldi r16, 0b11111111 ; Настройка порта B out ddrb, r16 ldi r16, 0b00000111 ; Настройка порта D out ddrd, r16 ;Настраиваем линии портов ввода/вывода: сбрасываем подтягивающие резисторы и определяем ;PB0-PB7, PD0-PD2 как линии вывода данных ;******************************************************************** ;Исходя из вышеуказанной процедуры инициализации выполняем операции: ldi r16, 0b00000000 ; Адресация IR ldi r17, 0b00110000 ; Установка разрядности Data line rcall delay_20000mks ; Пауза перед инициализацией lcd rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ldi r17, 0b00111000 ; Установка параметров lcd rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ldi r17, 0b00001000 ; Выключение дисплея rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ldi r17, 0b00000001 ; Очистка дисплея rcall write_lcd ; Запись данных в lcd rcall delay_1500mks ; Задержка перед выполнением операций с lcd ldi r17, 0b00000110 ; Установка режима ввода данных rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ret ; Выход из подпрограммы ;******************************************************************** delay_20000mks: ldi r18, 0b10110010 ; Ввод переменной задержки ldi r19, 0b00000101 ; Настройка предделителя rjmp init_delay delay_1500mks: ldi r18, 0b11111010 ; Ввод переменной задержки ldi r19, 0b00000101 ; Настройка предделителя rjmp init_delay delay_40mks: ldi r18, 0b11011000 ; Ввод переменной задержки ldi r19, 0b00000010 ; Настройка предделителя init_delay: out TCNT0, r18 ; Инициализация TCNT0 out TCCR0B, r19 ; Старт T0 test_TIFR: in r18, TIFR ; Чтение TIFR sbrs r18, 1 ; Переход, если "Переполнение T0" rjmp test_TIFR ; Бесконечная проверка TOV0 ldi r20, 0b00000000 ; Остановка T0 out TCCR0B, r20 ldi r20, 0b00000010 ; Загрузка TOV0>>0 out TIFR, r21 ret ; Выход из подпрограммы ;******************************************************************** write_lcd: out portd, r16 ; Установка значения линии RS out portb, r17 ; Вывод байта данных DB0-DB7 nop ; Защита от шумов на линии стробирования sbi portd, 2 ; E>>1 nop ; Защита от шумов на линии стробирования cbi portd, 2 ; E>>0 nop ; Защита от шумов на линии стробирования ret ; Выход из подпрограммы ;******************************************************************** user_write_IR: ldi r16, 0b00000000 ; Адресация IR rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ret ; Выход из подпрограммы ;******************************************************************** user_write_DR: ldi r16, 0b00000001 ; Адресация DR rcall write_lcd ; Запись данных в lcd rcall delay_40mks ; Задержка перед выполнением операций с lcd ret ; Выход из подпрограммы ;******************************************************************** lcd_clear: ldi r16, 0b00000000 ; Адресация IR ldi r17, 0b00000001 ; Очистка дисплея rcall write_lcd ; Запись данных в lcd rcall delay_1500mks ; Задержка перед выполнением операций с lcd ret ; Выход из подпрограммы ;********************************************************************
Как пользоваться данным кодом. Для занесения символа на экран необходимо записать байт, соответствующий коду этого символа, в регистр R17. В регистр 17 заносим 0х1 – если хотим записать символ на экран, или сбрасываем в 0х0, если хотим записать какую-то команду в регистр команд LCD дисплея.
Мной были предусмотрены подпрограммы, которые вызывает пользователь:
user_write_IR – запись команды в регистр команды LCD;
user_write_DR – запись данных для отображения на LCD;
lcd_clear – подпрограмма/команда, вызов которой осуществляет очистку дисплея.
Как работать с вызовом подпрограмм:
ldi r17, 0x24; Символ с кодом 0x24 rcall user_write_DR; запись символа на отображение ldi r17, 0x2; команда 0х2 rcall user_write_IR; записываем в регистр.
Отмечу, что при использовании подпрограммы lcd_clear предварительная запись в R17 не требуется.
Где писать свой код? Вот здесь:
reset: ldi r16, low (RAMEND) ; Инициализация стека МК out SPL, r16 rcall lcd_init ; Инициализация дисплея ;ВАШ КОД!!! Например: Ldi r17, 0xC; Включаем изображение ldi r17, 0x24; Символ с кодом 0x24 rcall user_write_DR; запись символа на отображение
Добавлю, что в последнее время появились данные модули с платой последовательного преобразователя, позволяющие подключать LCD дисплеи 1602 по 4-х проводной схеме и работающими по I2C-интерфейсу. Т.о. немного упрощается подключение и экономятся выводы контроллера. Модуль можно приобрести отдельно и подключить к уже имеющемуся LCD 1602.
Скачать исходники и прошивку вы можете ниже
- 1602.rar (3 Кб)
Комментарии (22) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Например
В статье написано...
Ldi r17, 0xC; Включаем изображение
rcall user_write_IR; записываем в регистр (этой строчки у вас нет)
ldi r17, 0x24; Символ с кодом 0x24
rcall user_write_DR; запись символа на отображение
m: rjmp m ; конец программы
Но на дисплее ничего не появилось , кроме черных квадратов в верхней строке и серых в нижней строке.
Я использовал внутренний генератор микроконтроллера на 8МГц и включил деление на 8 при программировании, дисплей WH1602B-YYH-CTK WINSTAR.
Помогите пожалуйста разобраться в чем моя ошибка.
Греется микросхема U3 HTC, выпаял U3, индикатор работает но тускло и С1 С2 подпаяны наоборот со временем почернели, я их тоже удалил. Разобрался оказалось, что подается питание на U3 наоборот, но в самом индикаторе 1 нога (земля) 2 (+) как по стандарту но по разводке (косячок)
Полное название WINSTAR WH1602B-PPL-CWVE# CQC OK 05/15/14-015033
Оказывается надо подавать питание только на 16(-) и 15(+), на 1 и 2 не надо микросхема U3(8ног) делает -5v на контрастность 3 ножка индикатора (если установить подсроечник) то можно регулировать на 3 ножке от +5 до -5v (хорошая контрастность при - 1,7v) на 3 выводе индикатора. С такой продлемой столкнулся в первые. До этого было 4-5 индикаторов без всяких проблем. Берите WH1602 без маленькой микросхемы на индикаторе
430к - это чересчур, но тоже будет работать