Суббота, 27.04.2024, 05:01
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Реклама Google
Форма входа
Категории раздела
Это нужно знать! [17]
Изучаем AVR [30]
Программаторы [12]
Необходимое ПО [8]
Готовые устройства [73]
Справочная [38]
Инструмент [0]
Технология [8]
Литература [0]
Arduino скетчи [18]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Микроконтроллеры - это просто!
Главная » Статьи » Это нужно знать!

Управление HD44780 дисплеем
В этой статье, я хочу описать главные особенности, как связанные с конструкцией так и с программированием (на языке Си), очень популярных индикаторов, на базе HD44780 контроллера (японской конторы Hitachi) или его аналогов.



Сегодня существует очень большая разновидность таких индикаторов, которые между собой отличаются :

- числом строк – 1,2 или 4
- числом символов в каждой строке – от 8 до 80
- с последовательным или параллельным интерфейсом
- размерами индикатора

Если говорить о технологии изготовления, то самыми популярными на сегодняшний день являются : LC – индикатор (жидкокристаллический), OLED – индикатор (органические соединения) и VF – индикатор (вакуумно-люминесцентный).

Преимущества
- совместимость с ASCII – таблицей символов. Очень удобно при написании кода для этих индикаторов.
- очень простой интерфейс : для параллельного интерфейса – всего 3 управляющих вывода и 4-/8-битная шина данных, для последовательного интерфейса и того меньше.
- низкая стоимость, в основном для ЖК индикаторов.
- легко доступен, имеются практически в каждом радио-магазине.

Недостатки
- пониженные скорости работы: ~(250 .. 270)KHz
- плохая видимость ЖК дисплеев в плохо освещенном помещение. Сей недостаток компенсируется использованием подсветки.

Для примера, в следующем видео, показаны некоторые преимущества VF-дисплеев (Noritake) над ЖК-дисплеями. Не смотря на визуальные недостатки ЖК индикаторов, они остаются самыми востребованными на рынке символьных дисплеев, из за их дешевизны.

Дальше, я буду описывать работу символьного ЖК индикатора с 2 строками по 16 символов в каждой строке (кратко они обозначаются как 2×16 дисплеи), с параллельным интерфейсом ввода/вывода данных. Работа с остальными типами дисплеев, практически ничем не отличается : столько же выводов, та же карта памяти и т.д.

Почему с параллельным интерфейсом? Благодаря их низкой частоте работы (хотя с другой стороны, не видео же на них показывать), или по другому говоря, относительно большому времени вывода информации на дисплей, практически не имеет значения какой интерфейс использовать. В основном, популярность параллельного интерфейса объясняется тем, что не все микроконтроллеры снабжены SPI интерфейсом (как минимум раньше), а программно лепить этот интерфейс – себе дороже. Также всегда можно, при помощи например 74HC166 сдвигового регистра, превратить параллельный интерфейс в последовательный.

Распиновка. Выводы питания дисплея



Vss – общий вывод (земля). В некоторых даташитах можно встретить название GND.

Vdd – вывод подачи напряжения питания (+5V ). Подключаем этот пин к плюсу источника питания.
Vo – вывод управления контрастностью.  На этот вывод подается напряжение от Vss до Vdd (по вкусу), через (10 .. 20)КΩ переменный резистор.

У некоторых производителей Vss идет первым а Vdd вторым, у других наоборот. Будьте осторожны и не перепутайте Vdd с Vss, так как в этом случае дисплеи горят на ура. При первом включении дисплея, на экране может не отображаться ничего. Следует покрутить переменный резистор до появления, как минимум черных квадратиков, после чего (более плавно) подобрать нужную вам контрастность.

Управляющие выводы

RS – Register SelectПри помощи этого вывода мы сообщаем дисплею какой тип данных будет записан/прочитан.RS = 0, работаем с регистром команд (Instruction Register)
RS = 1, работаем с регистром данных (Data Register)
RW – Read/WriteПри помощи этого вывода, мы переключаем дисплей в режим записи или чтения.RW = 0, записываем данные/команды в дисплэй
RW = 1, читаем данные/переменные из дисплэя
E – EnableПри помощи этого вывода, активизируется исполнение операции записи/чтения команд/данных. Или другими словами, на этот вывод подается "стробирующий сигнал”, без которого не может быть выполнена ни одна операция. Исполнение операций дисплеем, начинаются при спадающем фронте


В большинстве случаев читать данные/параметры не приходиться – так что вывод RW можно смело подключать к Vss (земля), то есть дисплей все время будет работать в режиме записи (Write mode).

Шина данных/адресов

DB7 .. DB0 – Data BusСимвольный дисплей может работать как с 8-битной шиной данных/адресов, так и с 4-битной шиной данных/адресов – что позволяет сэкономить драгоценные выводы микроконтроллера. Шина подключается напрямую к микроконтроллеру, без никаких дополнительных преобразований логических уровней, она толерантна как 5В так и к 3.3В – смотри техническую характеристику.DB7- наиболее значащий бит.
DB0- наименее значащий бит.

Если намереваетесь использовать 4-битную шину данных, то в этом случае используются последние (старшие) четыре бита: DB4 .. DB7, а первые четыре подключаются к земле.

Подсветка


Пины 15, 16 – подсветкаЭти выводы могут как присутствовать так и отсутствовать. Если дисплей оснащен подсветкой то, выводы подключены к аноду и катоду подсветки, если нет то, их ни к чему подключать не надо – пущай болтаются

Как узнать есть ли подсветка у дисплея? Во первых – спросить у продавца :) . Во вторых – прозвонить эти два вывода и найти какой из них анод и какой катод.

Подключение дисплея к микроконтроллеру
Как я уже говорил, из за относительно больших интервалов времени затрачиваемых для вывода данных на дисплей, практически не имеет значения разрядность шины данных, все равно придется тупить в цикле ожидания или опрашивать busy flag диспэя, но из желания сэкономить пару "микроконтроллерных ног”, будем использовать 4-разрядный интерфейс, хотя писать код под 8-разрядный чуть проще. Также, из за ненадобности чтения данных/параметров из дисплея, я подключил вывод RW к земле (VSS) – работа с дисплэем только в режиме записи. Но если вам будет необходимо читать данные/параметры из дисплея, вывод RW можно также подключить к микроконтроллеру.


Рис.1 4-битный интерфейс


Рис.2 8-битный интерфейс

Карта памяти дисплея


Рис.3 Видимая часть (по умолчанию) RAM памяти дисплея

Память индикатора делится на три составные части :

DDRAM (Display Data RAM), предназначена для хранения 8-битных символов (в основном ASCII), которые мы хотим отображать на экране. Емкость этой памяти составляет 80 символов, по 40 на каждую строку. Но вы скажете, "эй, в строке всего 16 символов!”. Остальные символы скрыты. Чтобы их отобразить, следует назначить другой участок DDRAM памяти (2×16 символов) как видимый, по умолчанию видимая память начинается с адреса 0×00.

CGROM (Character Generator ROM), здесь хранится расшифровка записанных в DDRAM символов. То есть, когда мы записываем в DDRAM ячейку, скажем, символ 0×41, то на экране появится символ хранящийся в ячейке CGROM памяти с адресом 0×41 – "A". Как и ASCII таблицы для разных стран, символы хранящиеся в CGROM памяти отличаются, так что выбирайте индикатор с нужной вам ASCII таблицей (CGROM памятью).

CGRAM (Character Generator RAM), в общем это маленький участок CGROM-памяти в которой нет никаких символом и которую можно изменять – первые 64 байта CGROM памяти. Так что пользователь может нарисовать парочку своих символов.

Для того чтобы помнить адрес последней ячейки, к которой мы обращались, есть специальный регистр – address counter, по умолчанию он указывает на ячейку 0×00, DDRAM памяти. После каждого обращения к памяти он автоинкрементируется или декрементируется в зависимости от настроек режима ввода.

Система команд
Дисплей распознает всего 11 команд, в которые входят и команды инициализации дисплея.

RSRWТип команды
00Записать команду. Все команды от Clear Displayдо Set DDRAM Address включительно.
01Прочитать параметры. Единственные параметры которые можно прочитать из дисплея это busy flag и address counter.
10Записать данные в DDRAM или CGRAM память.
11Прочитать данные из DDRAM или CGRAM память.




Очистить дисплей.

После отправки этой команды дисплею, он начинает записывать во все ячейки DDRAM памяти символ "Space”, тобиш пустоту,  после чего в address counter записывает 0×00. Поскольку ячеек относительно много, а дисплей относительно медленно работает, то Clear Display самая долго-выполняемая команда ~2..5мс.



Возврат каретки.

Записывает в address counter значение 0×00, без изменения DDRAM памяти.



Режим ввода.

Выбираем каким образом будут отображаться (записываться в DDRAM и CGRAM память) введеные нами символы : слева на право или справа на лево, плюс активировать сдвиг экрана после заполнения видимой части строки (напоминает старую, пишущюю машинку).

I/D = 1 – слева на право (инкремент)
I/D = 0 – справа на лево (декремент)
SH = 1 – активируем сдвиг, в выбранном ранее направлении, по заполнению строки
SH = 0 – дезактивируем сдвиг



Управление дисплеем.

D = 1 – включить дисплей
D = 0 – отключить дисплей
C = 1 – включить курсор (символ подчеркивания)
C = 0 – отключить курсор
B = 1 – включить курсор (черный квадрат Малевича)
B = 0 – отключить курсор



Сдвиг курсора или всего экрана. При помощи этой команды можно получить эффект бегущей строки.

S/C = 1 – сдвигать будем дисплей целиком
S/C = 0 – сдвигать будем курсор
R/L = 1 – сдвиг вправо
R/L = 0 – сдвиг влево



Настройка рабочих параметров дисплэя. При помощи этой команды выбираем разрядность шины данных/команд, число рабочих строк в дисплее и размер шрифта.

DL = 1(Data Lenght) – используем 8-битную шину данных/адресов : DB7 .. DB0.
DL = 0 – используем 4-битную шину данных/адресов : DB7 .. DB4, остальные посадить на землю.
N = 1 – используем обе строки.
N = 0 – работаем только с верхней строкой.
F = 1 – шрифт размером 5×7 пикселей.
F = 0 – шрифт размером 5×10 пикселей. При использовании обеих строк, шрифт автоматически устанавливается на 5×7 пикселей, независимо от F-бита.



Указываем адрес CGRAM-ячейке, в которую будем записывать байт, тобиш рисовать. Один символ занимает 8 или 10 байт подряд (в зависимости от размера шрифта), всего 64 байт памяти.



Указываем адрес DDRAM-ячейки, в которую будет записан символ. Если адрес находится в видимой области DDRAM памяти, то символ тут же будет отображен. Если используем только верхнюю строку, то для нее резервируется DDRAM память от 0×00 до 0x4F. Если используем обе строки, то для каждой резервируется DDRAM память от 0×00 до 0×27 для верхней строки и от 0×40 до 0×67 для нижней, тобиш по 40 байт на брата.



Для того чтобы выполнить эту команду надо установить вывод "RW = 1″, тем самым сообщая дисплею что идет команда чтения. MSB прочитанного байта, представляет собой Busy Flag (BF) – флаг занятости. Если "BF = 1″, значит дисплей еще не закончил выполнение предыдущей инструкции и любая другая инструкция, посланная в этот момент, будет проигнорирована. Остальные 7 бит, представляют собой содержимое address counter‘а.



Запись данных в CGRAM или DDRAM память. Прежде чем начать запись данных, следует указать в какую именно память будет вестись запись. Это выполняется при помощи команды Set DDRAM Address или Set CGRAM Address. Сперва указываем стартовый адрес любой из двух видов память, а дальше шлем вагон символов, при этом address counter автоматически инкрементируется или декрементируется (переходит на следующий адрес), в зависимости от настроек режима ввода.



Чтение данных из CGRAM или DDRAM память. Прежде чем выполнить эту команду, указываем память (начальный адрес) из которой собираемся читать. Address counter автоматически инкрементируется иди декрементируется, в зависимости от настроек режима ввода.

Временная диаграмма


Рис.4 Временная диаграмма команд чтения/записи

Тестируем код

//-------------------------------
// Проект под ImageCraft IDE for AVR
// Контроллер : AtMega16
// Частота: 4.0000 MHz
// Задача: вывод данных полученных через USART на дисплей,
// прокрутка дисплея
// Дополнительно : добавил пример рисования символа,
// но новое видео заливать влом
//-------------------------------
#include <iom16v.h>
#include <macros.h>
#include "hd44780.h"

unsigned char CHESS[DRAW_CHAR_SIZE] = {0x19,0x19,0x06,0x06,0x19,0x19,0x06,0x06};

void usart_init(unsigned int baudrate)
{// USART Initialization
 UCSRC = 0x00;
 UCSRA = 0x00;
 UBRR = baudrate; // set baud rate
 UCSRC = (1<<URSEL)|(3<<UCSZ0); // 8-bit,1 stop bit, no parity
 UCSRB = (1<<RXEN)|(1<<RXCIE);
}

// Функция - обработчик прерывания
#pragma interrupt_handler usart_rx_isr:12
void usart_rx_isr(void)
{
 unsigned char data;
 data = UDR;
 switch(data)
 {// если полученый символ > или < то выполняем функцию прокрутки
  case '>': lcd_scroll(RIGHT); break;
  case '<': lcd_scroll(LEFT); break;
  default: lcd_putc(data); break; // если нет то выводим на дисплей
 }
}

void init_devices(void)
{
 CLI(); // отключаем все прерывания
 PORTC = 0x00;
 DDRC = 0xff; // PORTC to output, for LCD drive
 usart_init(25); // USART interface initialization
 lcd_init(); // LCD initialization
 SEI(); // включаем все прерывания
}

void main(void)
{
 init_devices();
 lcd_drawchar(CHESS,0,1,0); // рисуем символ CHESS в CGRAM ячейку номер 0
// и выводим его на первую строчку дисплея по адресу 0
 lcd_drawchar(CHESS,5,2,4); // рисуем символ CHESS в CGRAM ячейку номер 5
// и выводим его на вторую строчку дисплея по адресу 4
 while(1)
 {
 }
}

Также сеть полна всякими LCD-симуляторами. Вот один из них, принадлежащий товарищу Dincer Aydin.:



Управление HD44780 дисплеем. Описание библиотеки


Спасибо за внимание.
Категория: Это нужно знать! | Добавил: Alex (08.01.2014)
Просмотров: 16199 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024