В данном уроке мы научимся работать с ЖК индикатором на контроллере HD44780 и его аналогах, например, таких как S6A0069, KS0066 и т.д. Данные ЖК индикаторы – текстовые и умеют отображать текст и псевдографические символы. Размер знакоместа у них составляет 5x8 пикселей, ЖК индикаторы бывают разных размеров и с разными разрешениями, например: 8 символов на 2 строки – 8x2, 16x2, 20x2, 40x2, 16x4, 20x4 и т.д.
В данном уроке мы рассмотрим 4 битное подключения ЖК индикатора к микроконтроллеру AVR, и написание программы в среде BASCOM-AVR.
У таких ЖК индикаторов существуют выводы:
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:
Подстрочный резистор 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:
Фьюз биты для прошивки:
Скачать файлы для урока (проект в Proteus, исходник, прошивка) вы можете ниже
Урок 8. Ввод информации в МК. Подключение кнопки к МК BASCOM-AVR
Прикрепленные файлы:
- lcd2313.rar (31 Кб)
Комментарии (17) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Кручу, перебирая портами с задержкой, шаговый двигатель и хотелось бы выводить угол поворота на экранчик. Так в момент вывода мотор затупливает.
Экран подключен по 4-ёх битной схеме, RW на землю.
Initlcd
Cls
А где надо очистить экран писать пробелы
$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 микросекунд.
Использую бесплатную демо версию.
$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
Но проблема не пропала, при повторной прошивке програматор (PonyProg на последовательный порт) перестал проходить в настройках пункт Probe. А после прошивки микросхемы она зависает в одном состоянии портов. В чем может быть проблема?