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 Кб)