Главная » Микроконтроллеры
Призовой фонд
на май 2017 г.
1. Тестер компонентов MG328
Паяльник
2. Осциллограф DSO138
Паяльник
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Урок 7. Работа с ЖК индикатором на контроллере HD44780 и его аналогах

В данном уроке мы научимся работать с ЖК индикатором на контроллере HD44780 и его аналогах, например, таких как S6A0069, KS0066 и т.д. Данные ЖК индикаторы – текстовые и умеют отображать текст и псевдографические символы. Размер знакоместа у них составляет 5x8 пикселей, ЖК индикаторы бывают разных размеров и с разными разрешениями, например: 8 символов на 2 строки – 8x2, 16x2, 20x2, 40x2, 16x4, 20x4 и т.д.

В данном уроке мы рассмотрим 4 битное подключения ЖК индикатора к микроконтроллеру AVR, и написание программы в среде BASCOM-AVR.

HD44780

У таких ЖК индикаторов существуют выводы:
VSS – Gnd (Минус питания)
VDD – Vcc (Плюс питания 5v)
VO – Установка контрастности ЖК матрицы
RS – Линия управления RS
RW (Read/Write) – Линия управления RW
E (Enable) – Линия управления E
D0 – Линия данных D0 (Не используется в 4 битном режиме)
D1 – Линия данных D1 (Не используется в 4 битном режиме)
D2 – Линия данных D2 (Не используется в 4 битном режиме)
D3 – Линия данных D3 (Не используется в 4 битном режиме)
D4 – Линия данных D4
D5 – Линия данных D5
D6 – Линия данных D6
D7 – Линия данных D7
A – Анод светодиода подсветки дисплея
K – Катод светодиода подсветки дисплея

Внимание! У разных ЖК индикаторов своё расположение выводов, точное расположение выводов вы можете узнать в технической документации (Даташите) на ваш ЖК индикатор.

Вывод ЖК индикатора VO управляет контрастностью ЖК матрицы в зависимости от подаваемого на этот вывод напряжения питания. Вывод RW если не надо считывать с дисплея информацию подключается к минусу питания.

Пример 4 битного подключения ЖК индикатора к микроконтроллеру Attiny2313:

Схема 4 битного подключения ЖК к Attiny2313

Подстрочный резистор RV1 регулирует яркость ЖК индикатора.
В BASCOM-AVR перед работой ЖК индикатора необходимо указать, какие выводы дисплея подключены, к каким портам микроконтроллера, для этого есть команда Config Lcdpin, пример применения данной команды: Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2 а также указать разрешение ЖК индикатора командой Config Lcd, пример: Config Lcd = 16 * 2 и проинициализировать ЖК индикатор командой Initlcd, после этого ЖК индикатор будет готов к работе.

Вот список команд для работы с ЖК индикатором в BASCOM-AVR:
Config Lcdpin – Установка конфигурации выводов ЖК индикатора и микроконтроллера
Config Lcd – Установка разрешения ЖК индикатора
Initlcd – Инициализация ЖК индикатора
Lcd – Вывод текста на ЖК индикатор, пример: Lcd ”Hello”
Cls – Очистка ЖК индикатора
Locate y, x – Установить курсор в позицию x, y
Lowerline – Переместить курсор на нижнею строку
Upperline – Переместить курсор на верхнею строку
Shiftlcd Right – Сдвинуть изображение ЖК индикатора вправо на одно знакоместо
Shiftlcd Left – Сдвинуть изображение ЖК индикатора влево на одно знакоместо
Cursor Off – Отключить курсор
Cursor On – Включить курсор
Cursor On Blink – Включить мерцающий курсор
Cursor On Noblink – Отключить мерцающий курсор

Внимание! При использовании ЖК индикатора c разрешением 8x2 в BASCOM-AVR конфигурируйте его как 16x2, так как в BASCOM-AVR нет конфигурации на ЖК индикатор с разрешение 8x2.

Пример программы в BASCOM-AVR для вышеизложенной схемы:

$regfile = "attiny2313.dat"
$crystal = 8000000

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2

Initlcd

Cls

Locate 1 , 1
Lcd "Hello,"
Lowerline
Lcd "world!"

End

Вот как всё это работает с ЖК индикатором 8x2:

ЖК индикатор 8x2

Фьюз биты для прошивки:

Фьюз биты

Скачать файлы для урока (проект в Proteus, исходник, прошивка) вы можете ниже

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

Теги:

Яковлев Александр Вячеславович Опубликована: 2012 г. 0 0
Я собрал 0 1
x

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

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

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

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

0
algaalku #
Спасибо, спаял и прошил ATtiny2313 заработало.
Ответить
0
Solaris #
Я сменил в BASCOM тип индикатора на 8*2, но он сказал, что это неизвестный тип индикатора. Тогда я оставил 16*2, но теперь символы не отображаются, а просто стоят черные квадраты. В чем проблема?
Ответить
0
Виталий Викторович #
Какой тип контроллера используется в вашем индикаторе?
Ответить
0
Ev3658 #
По любому контрастность "Vee" заминусовал до отказу. Попробуй Vee на GND через 5,1 кОм сделать.
Ответить
0
Eugene #
Почему у меня на экране светятся все верхние символы независимо прошил я его или нет? Стираю чип все равно светятся. Не могу понять в чем дело.
Ответить
0
Евгений #
Подскажите почему при выводе на экран программа ощутимо замирает?
Кручу, перебирая портами с задержкой, шаговый двигатель и хотелось бы выводить угол поворота на экранчик. Так в момент вывода мотор затупливает.
Экран подключен по 4-ёх битной схеме, RW на землю.
Ответить
0
Фёдор #
Советую двиглом крутить по прерыванию от таймера
Ответить
0
alexandr #
Попробуй убрать:
Initlcd
Cls
А где надо очистить экран писать пробелы
Ответить
0
Евгений #
Спасибо, Александр. Попробую не использовать Cls. А Initlcd у меня и так нет
Ответить
0
Евгений #
Замена CLS пробелами проблемы не решает
Ответить
0
alexandr #
Может код (а так гадать...) покажете? Кто-нибудь да подскажет
Ответить
0
Евгений #
Александр, вот код:

$regfile = "m8adef.dat"
$crystal = 8000000

Dim S As Byte
Dim Stp As Long
Dim An As word

Config Portb = Output

Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.5 , Rs = Portb.4
Config Lcd = 16 * 2
Cursor Off Noblinkd

do

for stp= 0 to 4079
Incr S

If S = 9 Then
S = 1
End If

Select Case S
Case 1 : Portb = &B00000001
Case 2 : Portb = &B00000011
Case 3 : Portb = &B00000010
Case 4 : Portb = &B00000110
Case 5 : Portb = &B00000100
Case 6 : Portb = &B00001100
Case 7 : Portb = &B00001000
Case 8 : Portb = &B00001001
End Select
Waitus 1000

An = Stp * 100 : An = An / 1132
Cls : Locate 1 , 1 : Lcd ang ; "angle"
next

loop
end

При таком коде мотор крутится очень медленно. Если убрать вывод на ЖК. То крутится с нормальной скоростью.
Если выводить на экран редко, к примеру, каждые 10 градусов, то мотор замедляет скорость в момент вывода на экран и дальше крутится нормально.
Из чего делаю вывод, что все дело в выводе.
"Нормальной" я называю скорость вращения мотора без отвлечения на индикацию с паузами между шагами 1000 микросекунд.
Ответить
0
ssdmt #
Возможно, чтобы обеспечить постоянство скорости вращения движка, нужно команды на его поворот так же выдавать ПОСТОЯННО. Для этого придуманы таймер или прерывания. Тогда будет "тормозить" вывод на экран, НО! скорость вывода на экран не критичена как правило
Ответить
0
Евгений #
Интересно, почему-то я об этом не подумал. Надо попробовать. Спасибо
Ответить
0
Андрей #
В чем может быть ошибка, встроенный в BASCOM симулятор отказывается работать с LCD, когда запускаю симуляцию виснет на строчке INITLCD, а если я ее убираю то и вовсе на строчках конфигурации.
Использую бесплатную демо версию.
Ответить
0
Андрей #
И еще, не мог бы кто то помочь разобраться в ошибке кода. Я пытался написать счетчик для семисегментных индикаторов. Пробовал просто зажигать на них символы - работает, а залил самопальную програму - ноль.

$regfile = "m8535.dat"
$crystal = 7372800
$hwstack = 32
$swstack = 8
$framesize = 24

Config Portd = Output 'настройка порта на виход для керування сегментами
Config Portb.0 = Output 'выходной порт управления левым анодом
Config Portb.1 = Output 'выходной порт управления правым анодом
Config Portb.4 = Input 'тактовый вход счетчика
Config Int0 = Falling 'конфигурация прерывания
Dim Period As Byte 'задание времени свечения индикаторов
Dim First As Byte 'перемення для задания значения правого индикатора
Dim Second As Byte 'переменная для задания значения левого индикатора
Dim Numbers(20) As Byte 'задание значений для отображения знаков
On Int0 Count 'название подпрограммы

Period = 20
First = 1
Second = 1
Numbers(1) = 136 'значение выходного порта для отображения "0"
Numbers(2) = 235 'значение выходного порта для отображения "1"
Numbers(3) = 76 'значение выходного порта для отображения "2"
Numbers(4) = 73 'значение выходного порта для отображения "3"
Numbers(5) = 43 'значение выходного порта для отображения "4"
Numbers(6) = 25 'значение выходного порта для отображения "5"
Numbers(7) = 24 'значение выходного порта для отображения "6"
Numbers(8) = 203 'значение выходного порта для отображения "7"
Numbers(9) = 8 'значение выходного порта для отображения "8"
Numbers(10) = 9 'значение выходного порта для отображения "9"
Numbers(11) = 128 'значение выходного порта для отображения "0."
Numbers(12) = 227 'значение выходного порта для отображения "1."
Numbers(13) = 68 'значение выходного порта для отображения "2."
Numbers(14) = 65 'значение выходного порта для отображения "3."
Numbers(15) = 35 'значение выходного порта для отображения "4."
Numbers(16) = 17 'значение выходного порта для отображения "5."
Numbers(17) = 16 'значение выходного порта для отображения "6."
Numbers(18) = 195 'значение выходного порта для отображения "7."
Numbers(19) = 0 'значение выходного порта для отображения "8."
Numbers(20) = 1 'значение выходного порта для отображения "9."
'начало цикла
Do


Portd = Numbers(first) 'задание отображения знака на правом индикаторе
Portb.1 = 0 'сигнал на подачу напряжения на анод
Waitms Period 'длительность свечения индикатора
Portd = Numbers(second) 'задание отображения знака на левом индикаторе
Portb.0 = 0 'сигнал на подачу напряжения на анод
Waitms Period

Loop

Count: 'начало прерывания
Incr First 'изменение переменной правого индикатора
If First = 11 Then 'условия изменения переменной левого индикатора
First = 1
Incr Second
End If
Return

End
Ответить
0
Андрей #
Извините, разобрался. Неправильно к портам подключился, прописал одни, а подключился к другим.
Но проблема не пропала, при повторной прошивке програматор (PonyProg на последовательный порт) перестал проходить в настройках пункт Probe. А после прошивки микросхемы она зависает в одном состоянии портов. В чем может быть проблема?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Печатная плата для усилителя "LM3886 + AD825" Discovery V8
вверх