Работа с ЖКИ на контроллере HD44780 и его аналогах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
универсальный способ перекодировки - когда передо мной возникла эта проблема, я, не мудрствуя лукаво, состаряпал утилитку. при известном умении писать bat-файлы для компиляции или обладая искусством создания makefile можно сделать абсолютно прозрачную работу: пишем программы в кодировке редактора, а при компиляции все автоматом подставляется/преобразуется, после компиляции возвращается, как было.
я обошелся возможностями Eclipse....
я обошелся возможностями Eclipse....
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
А я пользуюсь iconv-lcd-encodings
Оно инсталлирует в систему нужные кодировки для glibc, и в коде строки можно писать просто по-русски.
Только в CFLAGS в Makefile добавить опцию типа -fexec-charset=ks0066-ru, а так всем преобразованием занимается сам компилятор.
Правда, не уверен, что для windows способ подходит.
Оно инсталлирует в систему нужные кодировки для glibc, и в коде строки можно писать просто по-русски.
Только в CFLAGS в Makefile добавить опцию типа -fexec-charset=ks0066-ru, а так всем преобразованием занимается сам компилятор.
Правда, не уверен, что для windows способ подходит.
- rus084
- Друг Кота
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
у всех кто пользуется данным кодом вывода , экран запускается как-то через раз
экран 20х4
а у меня совсем не инициализируется
если брать инициализацию из даташита , он работает , но через строчку символы выводятся .
иногда у меня экран запускается , но очень много мусора в необновляемых областях
на команду 0x01 он не реагирует
нашел временное решение:
экран 20х4
Спойлер
Код: Выделить всё
void lcd_HD44780_init(void) {
initLogging(&logger, "HD44780 driver");
addConsoleAction("lcdinfo", lcdInfo);
if (engineConfiguration->displayMode == DM_HD44780) {
// initialize hardware lines
mySetPadMode("lcd RS", HD44780_PORT_RS, HD44780_PIN_RS, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd E", HD44780_PORT_E, HD44780_PIN_E, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB4", HD44780_PORT_DB4, HD44780_PIN_DB4, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB6", HD44780_PORT_DB5, HD44780_PIN_DB5, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB7", HD44780_PORT_DB6, HD44780_PIN_DB6, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB8", HD44780_PORT_DB7, HD44780_PIN_DB7, PAL_MODE_OUTPUT_PUSHPULL);
// and zero values
palWritePad(HD44780_PORT_RS, HD44780_PIN_RS, 0);
palWritePad(HD44780_PORT_E, HD44780_PIN_E, 0);
palWritePad(HD44780_PORT_DB4, HD44780_PIN_DB4, 0);
palWritePad(HD44780_PORT_DB5, HD44780_PIN_DB5, 0);
palWritePad(HD44780_PORT_DB6, HD44780_PIN_DB6, 0);
palWritePad(HD44780_PORT_DB7, HD44780_PIN_DB7, 0);
}
chThdSleepMilliseconds(20); // LCD needs some time to wake up
lcd_HD44780_write(LCD_HD44780_RESET); // reset 1x
chThdSleepMilliseconds(1);
lcd_HD44780_write(LCD_HD44780_RESET); // reset 2x
lcd_HD44780_write(LCD_HD44780_RESET); // reset 3x
lcd_HD44780_write(LCD_HD44780_4_BIT_BUS); // 4 bit, 2 line
chThdSleepMicroseconds(40);
lcd_HD44780_write(LCD_HD44780_4_BIT_BUS); // 4 bit, 2 line
lcd_HD44780_write(0x80);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x08); // display and cursor control
chThdSleepMicroseconds(40);
lcd_HD44780_write(LCD_HD44780_DISPLAY_CLEAR);
chThdSleepMilliseconds(2);
lcd_HD44780_write(LCD_HD44780_SHIFT_CURSOR_RIGHT);
chThdSleepMilliseconds(2);
lcd_HD44780_write(LCD_HD44780_DISPLAY_ON);
lcd_HD44780_set_position(0, 0);
}
а у меня совсем не инициализируется
если брать инициализацию из даташита , он работает , но через строчку символы выводятся .
иногда у меня экран запускается , но очень много мусора в необновляемых областях
на команду 0x01 он не реагирует
нашел временное решение:
отключить питание на логику экранчика (не на подсветку), подключить обратно питание (тут выводились всякие кракозябры), сбросить кнопкой дискоборд (тут становилось всё окей)
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Здравствуйте!
Обратил внимание, что у индикатора WH1602 помимо специальных контактов для подсветки сбоку в распиновке основного разъема помечены контакты 15 и 16 как A/Vee и К.
Через них тоже можно питать подсветку? Зачем тогда доп. контакты сбоку?
Обратил внимание, что у индикатора WH1602 помимо специальных контактов для подсветки сбоку в распиновке основного разъема помечены контакты 15 и 16 как A/Vee и К.
Через них тоже можно питать подсветку? Зачем тогда доп. контакты сбоку?
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Вообще контакты сбоку это не основные контакты подключения подсветки. Ориентироваться надо только на 15-16 выводы, а сбоку подключать только когда их нет. Там еще кстати можно глянуть - на подсветку могут резисторы стоять которые как раз и идут к 15-16 выводам, а может там просто места под резисторы а ты выбирай сам какие ставить исходя из требуемой яркости и напряжения. Попробуй прозвонить.
Он не будет реагировать если команда дается в 8-битном режиме(а библиотека откуда узнает что ты индикатор используешь в 4-битном режиме?) Адресация символов/строк зависит от индикатора а не от чипа в него установленного - надо уточнять в даташите на конкретный индикатор где какая строка начинается в памяти.
Вобщем какая-то стремная библиотека, работу которой надо пошагово проверить на соответствие спецификации. Очень похожа на бред абстракциониста, какой-то крайний запущенный вариант уровня абстракций, надо быть ближе к земле.
если брать инициализацию из даташита , он работает , но через строчку символы выводятся .
иногда у меня экран запускается , но очень много мусора в необновляемых областях
на команду 0x01 он не реагирует
Он не будет реагировать если команда дается в 8-битном режиме(а библиотека откуда узнает что ты индикатор используешь в 4-битном режиме?) Адресация символов/строк зависит от индикатора а не от чипа в него установленного - надо уточнять в даташите на конкретный индикатор где какая строка начинается в памяти.
Вобщем какая-то стремная библиотека, работу которой надо пошагово проверить на соответствие спецификации. Очень похожа на бред абстракциониста, какой-то крайний запущенный вариант уровня абстракций, надо быть ближе к земле.
Последний раз редактировалось Alexeyslav Вт апр 15, 2014 16:15:55, всего редактировалось 1 раз.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
У Фордатовского дисплея 0802 есть модификация где светодиод подключен к пинам 1 и 2 через пофигистор 1206. Пришлось вместо него впаивать токоограничивающий резистор 

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Прикол в том ,что эту схему делаю для работы, т. е. детали купят когда уже плата будет сделана. Но у меня вроде был какой-то индикатор, гляну как там разведено, хотя здесь будет другой тип.
Жестко... Может там с другой стороны платы резистор уже есть? Ведь если прямо светодиод, то такие индикаторы по дефолту сгорать будут...
Ну а резистор, ИМХО, лучше на своей плате ставить.
Это типа к питанию индикатора чтоли?Gudd-Head писал(а): есть модификация где светодиод подключен к пинам 1 и 2 через пофигистор 1206
Ну а резистор, ИМХО, лучше на своей плате ставить.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Так неизвестно еще какой индикатор купят... надо рассчитывать на конкретную модель, лучше рассчитывать под 14 выводов а 15 и 16 если что можно дополнительно проводами подключить, как это сделал бы в случае отсутствия оных.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
aam писал(а):Может там с другой стороны платы резистор уже есть?
Нету там ничего, звонится напрямую от А/К светодиода до контактов 1/2 которые таки да, для питания дисплея.
При питании 3.3 В ток был за 50 мА!

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Ну так это нормально, если дисплей на 3.3В, светодиоды подсветки являются параметрическим стабилизатором для питания дисплея... через резистор подаешь питание на него с 5В и получаешь рабочий индикатор. Да, не рассчитано на тот случай если тебе подсветка не нужна а дисплей нужен, тогда уж приходится доработать напильником.
- rus084
- Друг Кота
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Alexeyslav писал(а):Он не будет реагировать если команда дается в 8-битном режиме(а библиотека откуда узнает что ты индикатор используешь в 4-битном режиме?) Адресация символов/строк зависит от индикатора а не от чипа в него установленного - надо уточнять в даташите на конкретный индикатор где какая строка начинается в памяти.
Вобщем какая-то стремная библиотека, работу которой надо пошагово проверить на соответствие спецификации. Очень похожа на бред абстракциониста, какой-то крайний запущенный вариант уровня абстракций, надо быть ближе к земле.
библиотека по идее должна работать только в 4 битном режиме .
оно работает через chibi/os
вроде все правильно , но неработает
пробывал запустить прошивку из этой статьи http://cxem.net/mc/mc263.php
экран тоже не запускается как надо
даташита на него тоже нету
вобще какойто странный экран , но зато 20х4
с чего мне начать?
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
С проверки сигналов на индикаторе, с проверки его напряжения питания, есть 5В а есть 3.3В индикаторы, они могут плохо работать на неродных напряжениях.
- Catcatcat
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Пт янв 13, 2012 21:46:35
- Откуда: Днепропетровск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
тут http://catcatcat.d-lan.dp.ua/skachat/biblioteki/biblioteka-dlya-rabotyi-s-lcd-indikatorami-na-drayvere-hd44780-ili-ks0066u/ последняя версия 2,0 библиотеки, для руссифицированых индикаторов там встроена перекодировка, посмотрите как сделано.
для вывода строк просто пишим Пример,StringLCD("Привет мир ILLISSI!!");
- rus084
- Друг Кота
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
переделал код инициализации так :
но теперь вместо ничего курсор бегает по всему экрану в случайных местах .
еще я изменил немного инициализацию пинов : раньше они брались из #define , теперь из typedef struct . т.е их можно менять без перекомпиляции
Спойлер
Код: Выделить всё
void lcd_HD44780_init(void) {
initLogging(&logger, "HD44780 driver");
addConsoleAction("lcdinfo", lcdInfo);
if (engineConfiguration->displayMode == DM_HD44780) {
// initialize hardware lines
mySetPadMode("lcd RS", getHwPort(boardConfiguration->HD44780_rs), getHwPin(boardConfiguration->HD44780_rs), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd E", getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB4", getHwPort(boardConfiguration->HD44780_db4), getHwPin(boardConfiguration->HD44780_db4), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB6", getHwPort(boardConfiguration->HD44780_db5), getHwPin(boardConfiguration->HD44780_db5), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB7", getHwPort(boardConfiguration->HD44780_db6), getHwPin(boardConfiguration->HD44780_db6), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB8", getHwPort(boardConfiguration->HD44780_db7), getHwPin(boardConfiguration->HD44780_db7), PAL_MODE_OUTPUT_PUSHPULL);
// and zero values
palWritePad(getHwPort(boardConfiguration->HD44780_rs), getHwPin(boardConfiguration->HD44780_rs), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_db4), getHwPin(boardConfiguration->HD44780_db4), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_db5), getHwPin(boardConfiguration->HD44780_db5), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_db6), getHwPin(boardConfiguration->HD44780_db6), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_db7), getHwPin(boardConfiguration->HD44780_db7), 0);
}
chThdSleepMilliseconds(50); // LCD needs some time to wake up
int a;
for ( a = 0; a < 4; a++ )
{
palSetPad(getHwPort(boardConfiguration->HD44780_db4), getHwPin(boardConfiguration->HD44780_db4));
palSetPad(getHwPort(boardConfiguration->HD44780_db5), getHwPin(boardConfiguration->HD44780_db5));
palSetPad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e));
chThdSleepMilliseconds(1);
palClearPad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e));
chThdSleepMilliseconds(6);
}
// LCD = 0b00100000;
palClearPad(getHwPort(boardConfiguration->HD44780_db4), getHwPin(boardConfiguration->HD44780_db4));
chThdSleepMilliseconds(1);
palSetPad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e));
chThdSleepMilliseconds(1);
palClearPad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e));
chThdSleepMilliseconds(6);
palClearPad(getHwPort(boardConfiguration->HD44780_db5), getHwPin(boardConfiguration->HD44780_db5));
chThdSleepMilliseconds(6);
//SendLCDc( 0b00101000 ); // Настройка функций
//SendLCDc( 0b00001100 ); // Включить дисплей
//SendLCDc( 0b00000001 ); // Дисплей очистить
//SendLCDc( 0b00000110 ); // Entry Mode
//SendLCDc( 0b10000000 ); // DDRAM addresss 0000
//SendLCDc( 0b00000010 ); // return home
lcd_HD44780_write(0x28);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x0C);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x01);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x06);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x80);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x02);
chThdSleepMicroseconds(40);
/*
chThdSleepMilliseconds(20); // LCD needs some time to wake up
lcd_HD44780_write(LCD_HD44780_RESET); // reset 1x
chThdSleepMilliseconds(1);
lcd_HD44780_write(LCD_HD44780_RESET); // reset 2x
lcd_HD44780_write(LCD_HD44780_RESET); // reset 3x
lcd_HD44780_write(LCD_HD44780_4_BIT_BUS); // 4 bit, 2 line
chThdSleepMicroseconds(40);
lcd_HD44780_write(LCD_HD44780_4_BIT_BUS); // 4 bit, 2 line
lcd_HD44780_write(0x80);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x08); // display and cursor control
chThdSleepMicroseconds(40);
lcd_HD44780_write(LCD_HD44780_DISPLAY_CLEAR);
chThdSleepMilliseconds(2);
lcd_HD44780_write(LCD_HD44780_SHIFT_CURSOR_RIGHT);
chThdSleepMilliseconds(2);
lcd_HD44780_write(LCD_HD44780_DISPLAY_ON);
lcd_HD44780_set_position(0, 0);
*/
}но теперь вместо ничего курсор бегает по всему экрану в случайных местах .
еще я изменил немного инициализацию пинов : раньше они брались из #define , теперь из typedef struct . т.е их можно менять без перекомпиляции
- rus084
- Друг Кота
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
со старой инициализацией экрана, но с новой инициализацией пинов тоже самое
я не пойму , с инициализацией пинов , действия совершаются теже , но с немного другим алгоритмом и какая разница образуется в железе
я не пойму , с инициализацией пинов , действия совершаются теже , но с немного другим алгоритмом и какая разница образуется в железе
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Я же говорю, убедись что все сигналы на индикатор выдаются правильно. Осциллографом или логическим анализатором. Иначе ты долго можешь искать проблему, когда она спряталась на более низком уровне. Убедись что передаются данные на дисплей именно в 4-битном режиме, а до переключения в 4-битный режим должны выдаваться 8-битные команды. У тебя и там и там используется одна и та же процедура lcd_HD44780_write, а это в корне неверно.
Ох уж этот абстракционизм... верный способ запутаться в трех соснах нагенерив целый фантомный лес.
Ох уж этот абстракционизм... верный способ запутаться в трех соснах нагенерив целый фантомный лес.
- rus084
- Друг Кота
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
абстракционизм - не я придумал .
перепишу библиотеку послностью из статьи
перепишу библиотеку послностью из статьи
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
rus084 писал(а):перепишу библиотеку послностью из статьи
а почему бы не использовать проверенные временем библиотеки? есть очень хорошая, гибкая и неоднократно испытанная...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- rus084
- Друг Кота
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
желательно чтобы все работало через chibi/os , но эта ос позволяет обращаться к железу напрямую .
у меня stm32f4
у меня stm32f4
- rus084
- Друг Кота
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
сделал 4 битный режим , но всеравно не работает .
мне кажется что проблема аппаратная , у кого есть stm32f4discovery и экран hd44780 и хочет проверить это?
мне кажется что проблема аппаратная , у кого есть stm32f4discovery и экран hd44780 и хочет проверить это?
