Главная » Микроконтроллеры
Призовой фонд
на октябрь 2020 г.
1. 1500 руб
Сайт Паяльник
2. Тестер компонентов MG328
Сайт Паяльник
3. 150 руб.
От пользователей


Плата Digispark Kickstarter на основе микроконтроллера ATTINY85

LCD WH1602B компании Winstar

LCD дисплеи от компании Winstar уже на протяжении нескольких лет являются неотъемлемой частью современной электронной продукции, и не только на российском рынке. Они дешевы, очень распространены (не видел магазинов, где их не было бы), их разнообразие предоставляет разработчику выбирать подходящий в зависимости от эксплуатационных условий. Их различие заключается в диапазонах рабочих температур, количеством строк для отображения информации, количеством знакомест в строке, стандартными из которых являются значения 8, 12, 16, 20, 24 и 40 символов на одну строку, так же различаются размерами символа, его разрешением, размерами самого дисплея и т.д. Winstar выпускает не только буквенно-цифровые знакосинтезирующие LCD-модули, но и графические. Те, в свою очередь, тоже имеют различные параметры, что предоставляет пользователю возможность выбирать подходящий исходя из поставленной задачи.

Многие начинающие радиолюбители, только-только начавшие осваивать цифровую технику, микроконтроллеры, рано или поздно столкнутся с проблемой, связанной с подключением и управлением данного дисплея. Немного упростив ситуацию с даташитом на дисплей WH1602B, я старался описать процесс подключения и управления модулем максимально просто для понимания.

Стандартно дисплей WH1602B выглядит так:

LCD дисплей 1602

16 выводных линий, из которых 11 – линии управления, расположены в ряд с шагом 2,54мм, что позволяет разработчику напрямую подпаять шлейф или поставить разъем, и отвести шлейф к плате управления, в зависимости от конструкции конечного устройства.

Далеко не редким является дисплей с боковым расположением контактов.

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

Существенным недостатком дисплеев WH1602B является ток потребления, поэтому применять данный тип дисплеев в устройствах с автономным питанием совершенно невыгодно.

Дисплеи линейки WH построены на базе специализированного контроллера LCD-модулей HD44780, который как раз и разрабатывался для управления знакосинтезирующими ЖК-панелями.

С небольшим описанием, пожалуй, стоит закончить, и приступить к практической части. Нумерация выводов дисплея, если смотреть на него сверху (т.е. как мы смотрим на него при чтении информации), идет начиная с самого крайнего левого вывода. Это вывод 1.

Подключение 1602:

Подключение LCD 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; запись символа на отображение

mc89-3.jpg

Отображение текста на LCD дисплее 1602

Добавлю, что в последнее время появились данные модули с платой последовательного преобразователя, позволяющие подключать LCD дисплеи 1602 по 4-х проводной схеме и работающими по I2C-интерфейсу. Т.о. немного упрощается подключение и экономятся выводы контроллера. Модуль можно приобрести отдельно и подключить к уже имеющемуся LCD 1602.

1602 с I2C модулем

Скачать исходники и прошивку вы можете ниже

Прикрепленные файлы:

Теги:

Ильин Евгений Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (22) | Я собрал (0) | Подписаться

0
Sfdag #
А в какой программе писать этот код ,наверно AVRStudio? Почему когда пишут подобные статьи ,не пишут в чём писать надо код.Хотелось бы что бы писали в чём компилировали прошивку ,что бы новичкам попробовать скомпилировать этот код ,и возможно сделать свою первую прошивку
Ответить
0
Евгений Ил #
Да, все в AVRStudio. В следующий раз буду указывать, спасибо за замечание.
Ответить
0
Evgeniy #
Евгений Ильин, скажите как называется плата последовательного преобразователя для LCD? (модель)
Ответить
0
talibanich #
Названия как такового нет, просто например в eBay или гугл вбейте в поисковую строку 1602 serial
Например
Ответить
0
CaLLIa #
Контроллер дисплея WH1602B аналог ks0066u от SAMSUNG, согласно даташиту от WINSTAR. Хотя... он аналогичен HD44780 HITACHI
Ответить
0
Sergey #
Если линейки WH используют контроллер HD44780, почему-же тогда в описании WH1602L-YGH-CP написан контроллер S6B0066U?
Ответить
0
cezar #
Вы не указали номера выводов для attiny2313. К какому порту каким выводам 2313 подключать дисплей?
Ответить
0
Евгений Ил #
Подключаем PD0 микроконтроллера к линии RS LCD, вывод PD1 микроконтроллера к RW дисплея, ну а PD2 – соответственно к линии Е дисплея, а линии шины данных DB0-DB7 к соответствующим линиям порта B микроконтроллера. Сам дисплей подключаем согласно схеме вверху.
В статье написано...
Ответить
0
Андрей #
15) A – анод подсветки (подключаем сюда +5В через резистор 100Ом)
Не верю. Подключите через 100 Ом - никакой подсветки не увидите. В даташите рекомендуемое сопротивление 4.7 Ом.
Ответить
0
dizzyy Dubetskiy #
А я верю. Делал зарядное, давал 100 ом к +5. Делал металлоискатель, давал 200 ом на +12 в АКБ.
Ответить
0
Владимир #
Записал в микроконтроллер ATtiny2313V вашу программу и попробовал вывести символ с кодом 0x24, добавив строки как у вас в примере:
Ldi r17, 0xC; Включаем изображение
rcall user_write_IR; записываем в регистр (этой строчки у вас нет)
ldi r17, 0x24; Символ с кодом 0x24
rcall user_write_DR; запись символа на отображение

m: rjmp m ; конец программы

Но на дисплее ничего не появилось , кроме черных квадратов в верхней строке и серых в нижней строке.
Я использовал внутренний генератор микроконтроллера на 8МГц и включил деление на 8 при программировании, дисплей WH1602B-YYH-CTK WINSTAR.
Помогите пожалуйста разобраться в чем моя ошибка.
Ответить
0
Владимир #
Такая же проблема. Только экран WH1602B-yyK-ctk winstar.
Ответить
0
.юрий #
Я сделал цифровой КСВ-метр, у меня на экране горит только первый ряд квадратиков на дисплее. Микроконтроллер PIC16F373, как проверить что не работает?
Ответить
0
Алексей #
Первый ряд квадратиков горит когда дисплей не инициализирован, и на него не подана ни одна или неправильная команда, это может быть если вы использовали 100% рабочую библиотеку но забыли например сконфигурировать контроллер, или все намного проще если все тестится прямо на железе простой обрыв контакта (для проверки тестить в протеусе), или многое другое. Поэтому ответить на ваш вопрос по крайней мере в таком плане как он поставлен невозможно, нужно хотя бы кусочек кода увидеть и узнать как вы проверяете работоспособность
Ответить
0
Николай #
Столкнулся с проблемой WH1602B_ купил 2 шт подключил и в двух индикаторах одна и та же проблема
Греется микросхема U3 HTC, выпаял U3, индикатор работает но тускло и С1 С2 подпаяны наоборот со временем почернели, я их тоже удалил. Разобрался оказалось, что подается питание на U3 наоборот, но в самом индикаторе 1 нога (земля) 2 (+) как по стандарту но по разводке (косячок)
Полное название WINSTAR WH1602B-PPL-CWVE# CQC OK 05/15/14-015033
Ответить
0
Николай #
По поводу проблемы WH1602B.
Оказывается надо подавать питание только на 16(-) и 15(+), на 1 и 2 не надо микросхема U3(8ног) делает -5v на контрастность 3 ножка индикатора (если установить подсроечник) то можно регулировать на 3 ножке от +5 до -5v (хорошая контрастность при - 1,7v) на 3 выводе индикатора. С такой продлемой столкнулся в первые. До этого было 4-5 индикаторов без всяких проблем. Берите WH1602 без маленькой микросхемы на индикаторе
Ответить
0
Виталий #
Я не занимаюсь созданием устройств, просто на моем заряднике пропала куча квадратиков и соответственно прочитать выполняемую операцию стало затруднительно, в итоге купил экран который на 100% подходил на место старого но с 18 пинами, лишние 2 давали возможность управления цветами подсветки. Заменив, получил 2 ряда черных квадратов, под углом все видно хорошо, но как от них избавиться не понимаю, может вы подскажите?
Ответить
0
Николай #
Все правильно, но в ДАТАШИТЕ об этом ничего не сказано. Я уже разобрался сделал генератор и подал - 2.5 на ножку контрастности, все работает хорошо, но больше эти индикаторы не покупаю
Ответить
0
Алексей #
Кто сможет, поясните почему на второй картинке сверху в схеме выбран резистор 430 кОм. Я конечно понимаю, что опытным путем и из расчета силы тока 100 мА, но в datasheet почему то указаны значения от 10 - 20 кОм? И вообще совсем для самых тупых, как в схеме работает этот самый подстроечный резистор, он же не цифровой, а аналоговой значит у него изменение напряжения должно быть похожее на линию, но при этом ножка Vo является цифровой с определенным значение тока, т.е. у неё может быть либо 0.3В или 5В при определенной силе тока. Я так понимаю при изменении сопротивления резистора ток на самом контакте Vcc падает, в результате чего яркость снижается, но не понятно как можно её менять в определенных пределах?
Ответить
0
Николай #
Алексей будет работать от 1К - 47К проверено
430к - это чересчур, но тоже будет работать
Ответить
0
Сергей #
Хочу собрать частотомер. В магазине только LCD типа JXD1602A c контролером SPLC780D. Будет ли работать или поискать Winstar?
Ответить
0
Алекс #
Проверено, SPLS780D китайский клон HD44780, работает на ура.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Набор начинающего радиолюбителя USB осциллограф DSO-2090
вверх