Работа с ЖКИ на контроллере HD44780 и его аналогах

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение ARV »

levaclaus писал(а):2 - как вывести вертикальный прогресс бар?

вот мои древние поделки (правда, для WinAVR, но все детально прокомментировано и адаптировать должно быть легко):
1. "библиотечка" TUI - функции вывода вертикальных и горизонтальных "графических" шкал и не только http://arv.radioliga.com/component/opti ... _0_03.rar/
2. "Настоящая" графика на ТЕКСТОВОМ ЖКИ - рисование линий, точек, фигур и т.п. http://arv.radioliga.com/content/view/237/49/

вот пример такой графики:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Serhio »

Протеус выдает следующую ошибку
pic16 ADC PC=0x0002. ADC conversion started before "wait" time has expired following previous conversion or channel change.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение levaclaus »

таки добил вертикальный прогрессбар на 7 столбцов

Код: Выделить всё


flash byte char1[64]={                                         //Спектр
 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111,  //1
 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111,  //2
 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111,  //3
 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111,  //4
 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111,  //5
 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111,  //6
 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111,  //7
 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111   //8
};

unsigned char progresbar[9] = {128, 0, 1, 2, 3, 4, 5, 6, 7};

void drawdigspektr(byte position, byte point)
{

       pa1=point/8;
       pa2=point%8;

lcd_gotoxy(position,0);
if (pa1>3) { symbol1=8;};
if (pa1==3) { symbol1=pa2;};
if (pa1<3) { symbol1=0;};

lcd_putchar(progresbar[symbol1]);

lcd_gotoxy(position,1);

if (pa1>2) { symbol1=8;};
if (pa1==2) { symbol1=pa2;};
if (pa1<2) { symbol1=0;}; 

lcd_putchar(progresbar[symbol1]);

lcd_gotoxy(position,2);

if (pa1==1) { symbol1=pa2;};
if (pa1>1) { symbol1=8;};
if (pa1==0) { symbol1=0;};

lcd_putchar(progresbar[symbol1]);

lcd_gotoxy(position,3);

if (pa1>0) { symbol1=8;};
if (pa1==0) { symbol1=pa2;};

lcd_putchar(progresbar[symbol1]);
}




 void drawspektr(void)
{
drawdigspektr(0,pointa);
drawdigspektr(1,pointa);
drawdigspektr(2,pointb);
drawdigspektr(3,pointb);
drawdigspektr(4,pointc);
drawdigspektr(5,pointc);
drawdigspektr(6,pointd);
drawdigspektr(7,pointd);
drawdigspektr(8,pointe);
drawdigspektr(9,pointe);
drawdigspektr(10,pointf);
drawdigspektr(11,pointf);
drawdigspektr(12,pointg);
drawdigspektr(13,pointg);
}


drawspektr(); 
MisHel64
Опытный кот
Сообщения: 773
Зарегистрирован: Пн сен 01, 2014 20:38:54

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение MisHel64 »

Господа, а подскажите про HD44780 - 1602.
1) Если русских символов нет в знакогенераторе, то уже никак их туда не записать? Знакогенератор одноразовом ПЗУ прошит?
2) А в современных контролерах по прежнему, только 8 символов можно определить?
3) А можно как-то еще в магазине узнать наличие русских символов? Может маркировку дополнительную производители наносят?
Наверно не много не в ту тему, но куда гугль послал...
PS: Про определяемые 8 символов пользователя знаю. Гениальные советы типа "спроси продавца", как бы не интересны.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение WiseLord »

MisHel64 писал(а):Знакогенератор одноразовом ПЗУ прошит?
Думаю, даже проще - ещё на этапе производства масочным методом. Т.е. тупо есть транзистор на кристалле - 0, нету - 1. Разные фотолитографические маски для разных "зашивок" знакогенератора.
MisHel64 писал(а):А в современных контролерах по прежнему, только 8 символов можно определить?
Архитектура контроллера такая. В одном байте можно 128 байт ОЗУ адресовать (память дисплея), + 64 байта ОЗУ (память знакогенератора) + остальное - на всякие управляющие команды.
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение slavokhire5 »

To MisHel64: Допустим, для модели WH1602A/B на наличие кириллицы указывает код CT в конце наименования (например, WH1602A-NGG-CT)
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
MisHel64
Опытный кот
Сообщения: 773
Зарегистрирован: Пн сен 01, 2014 20:38:54

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение MisHel64 »

slavokhire5 Спасибо, уже хлеб. Будем искать (C)
Чисто из любознательности. Почитав форумы у меня сложилось мнение, что в HD44780 шьют как минимум три таблицы с русскими символами. Одна содержит лишь те которых нет в латинице, другая содержит все символы во второй таблице но в собственном порядке, и есть вариант, где порядок символов совпадает с "виндовой" кодировкой.
Я правильно уловил мысли более других ораторов, и какой именно вариант в блочке имеющий указанный вами маркировки.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Mishany »

Как минимум две страницы с символами, причем если буква к примеру А русская, то она берется с английской кодировки и так со всеми буквами совпадающими в графическом написании, по крайней мере так сделано на дисплеях мэлт.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение urry »

все гораздо проще. Перед выдачей анализируется символ - если он из латинской раскладки - выдается как есть.Если это кириллица - код больше 0xC0 - эта величина отнимается и берется код из своего массива. Я хз сколько лет пользуюсь библиотекой Алекса например http://eldigi.ru/articles/chastotomer_n ... d_displeem
Все индикаторы с кириллицей ведут себя одинаково, нет никаких 3 вариантов.
Аватара пользователя
skeef
Открыл глаза
Сообщения: 56
Зарегистрирован: Пт июн 17, 2011 12:49:59

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение skeef »

Много рыл, но так и не нашел ответа на 3 простых вопроса:
1. как инвертировать символ? Т.е. есть символ А - белый фон, черные линии. Как сделать наоборот - черный фон, белая линия?
2. как заставить символ "моргать" способом "исчез-появился" и способом инвертирования. Есть команда для курсора. Есть ли для символа?
3. как правильно (или можно ли) записывать графику своих символов без инициализации, в динамике. Ну чтобы обойти ограничение в 8 символов.
Processor not found! Software emulation ...
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение WiseLord »

1. Только сгенерировать инвертированный символ как пользовательский.

2. Аналогичным способом - через пользовательский символ. Отдельной инверсии не предусмотрено.

3. Никак. Пользовательский символ - это всего лишь своего рода ссылка-указатель на область в CGRAM. Поменяется информация там - поменяется она и везде на экране, где выведен этот символ.
Аватара пользователя
skeef
Открыл глаза
Сообщения: 56
Зарегистрирован: Пт июн 17, 2011 12:49:59

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение skeef »

WiseLord писал(а):3. Никак. Пользовательский символ - это всего лишь своего рода ссылка-указатель на область в CGRAM. Поменяется информация там - поменяется она и везде на экране, где выведен этот символ.

Получается, что единственный вариант обойти ограничение это каждый раз непосредственно перед выводом записывать новый символ в регистры. По идее такой вариант реализован здесь: http://asis-kbr.ru/forum/viewtopic.php?f=13&t=139
Processor not found! Software emulation ...
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение WiseLord »

Да. Предложенный вариант хоть как-то может уменьшить значимость проблемы. Но полностью её не решит. Одновременно на экране не может отображаться больше восьми различных пользовательских символов.
Аватара пользователя
skeef
Открыл глаза
Сообщения: 56
Зарегистрирован: Пт июн 17, 2011 12:49:59

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение skeef »

Остается большой вопрос сколько циклов записи выдержит "флешка" индикатора
Processor not found! Software emulation ...
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Alexeyslav »

Это не флешка. а самая что ни на есть static RAM. Выключил питание - символы пропали. записывать можно до бесконечности.
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение nirq »

Если авторы дисплея (почему вы все его называете "индикатор"? индикатором была бы зелёная лампочка, разноцветная лампочка, набор из надписей "on/off" либо символов "low fuel, check engine"... а тут произвольный текст или даже рисунок) предусмотрели в нём возможность видоизменения курсора - то совершенно никак не связано с обязанностью применять такой дисплей в исключительно "терминальном" режиме.
И даже совершенно наоборот: "терминальный" режим как таковой, с пошаговым курсором и одиночно-посимвольным "печатанием" слева направо - целесообразен... я даже затрудняюсь придумать хоть один реальный пример, когда он был бы целесообразен.

В раме организуется буфер, 8 символов * 2 строки = 16 байт.
Из этого буфера периодически обновляется весь дисплей.
Содержимое же буфера в раме меняется уже когда угодно и как угодно. Хоть сразу три курсора по два символа в разных местах и разными стилями, с разной частотой моргания...



А "проблема" с инвертацией надуманна. Пуговицы перламутровые.
Аватара пользователя
ksardas_90
Родился
Сообщения: 3
Зарегистрирован: Пн окт 20, 2014 09:38:35

Переопределяемые символы в HD44780

Сообщение ksardas_90 »

Здравствуйте. Осваиваю работу с мк STM32 и в частности управление дисплеем WH1602A. Изучив некоторые статьи и документацию к нему смог запустить, выводить текст и настроить бегущую строку, но завели в тупик попытки вывести на экран пользовательский символ. Мне кажется я не совсем понял алгоритм их генерации и вывода на экран.

Как я понял: 1) командой установки адреса CGRAM выбрать какой из 8и символов будем изменять
0 1 ASG ASG ASG ASG ASG ASG (не совсем понятно в каком полубайте адрес писать)
2)Теперь нужно передать в режиме данных 8 байт которые и будут нашим новым символом (т.е. RS=1 DB7=1 DB4-DB0 = строка рисунка где 1 это активный пиксель, DB5 и DB6 - не значащие разряды) ?
и так восемь раз
3)После того как все 8 байт записались необходимо вернуться в режим работы с DDRAM (Это из статьи вычитал, хотя в руководстве такого не нашел)

Вот чего то по нулям, подскажите и поправьте пожалуйста алгоритм, если кто рисовал пользовательские символы на таких дисплеях
Аватара пользователя
koyodza
Собутыльник Кота
Сообщения: 2623
Зарегистрирован: Вс июл 17, 2011 11:51:52
Контактная информация:

Re: Переопределяемые символы в HD44780

Сообщение koyodza »

1. В индикаторе CGRAM имеет 64 ячейки, по 8 на каждый пользовательский символ. Символ с кодом 00 занимает ячейки с адресами 0..7, символ с кодом 01 ячейки с адресами 8..15 и т.д.
Символы с кодами 08..0F дублируют соответствующие символы с кодами 00..07. Обычно я стараюсь не использовать символ с кодом 00, вместо него использую 08, но это не относится напрямую к данному вопросу.
Соответственно чтобы задать свой вид символа с кодом 07 нужно переписать ячейки CGRAM с адресами 56..63.
Обычно я переписываю по одной ячейке за раз, поэтому указатель на CGRAM меняю для каждой ячейки, но это связано с моей собственной довольно сложной организацией вывода на LCD (сделано для совместимости с менеджером задач и чтобы избежать блокирующих ожиданий готовности), но Вы можете попробовать сделать это иначе.
Ваш вопрос "не совсем понятно в каком полубайте адрес писать" не понял, сформулируйте ещё раз.
2. Незначащими являются три бита DB5..DB7, поскольку в одной строке 5 пикселей. Всегда записываю 0 в эти биты, что будет если записать 1 не знаю. Если будет нечего делать - может проверю, но нужно учитывать, что индикаторы от разных производителей могут работать немного по-разному.
3. Да, просто снова делаете Set DDRAM addr, точно так же как в случаях, когда хотите начать вывод символов с произвольного места.
Аватара пользователя
CyberVad
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Re: Переопределяемые символы в HD44780

Сообщение CyberVad »

Я делаю так:
1) Команда "буду загружать свои символы" (0x40+адрес если не с нулевого)
2) Гружу сколько надо
Всё :)))
Подробнее: вопреки логике один байт описывает не один столбец символа, а одну строку. И хоть символ 5х7, а передать надо 8 байтов: 7 байтов значащих (первый описывает верхнюю строку, седьмой нижнюю), а восьмой произвольный. В каждом байте значат только биты 4-0, старшие 3 любые. Для единообразия я их делаю нулевыми.
Вот, например, пара символов:
lcdcmd(0x40); //Начинаем с символа по адресу 0

lcddata(0x00); //Ноль полосок
lcddata(0x00);
lcddata(0x00);
lcddata(0x1f);
lcddata(0x00);
lcddata(0x00);
lcddata(0x00);
lcddata(0x00);

lcddata(0x10); //Одна полоска
lcddata(0x10);
lcddata(0x10);
lcddata(0x0f);
lcddata(0x10);
lcddata(0x10);
lcddata(0x10);
lcddata(0x00);

и так далее

Это я так рисовал символы-полоски от 1 полоски до пяти - что бы из 14ти знакомест получить линейный индикатор на 70 точек (ну столбцов)
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
Ответить

Вернуться в «Периферия»