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

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

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

Сообщение ARV »

универсальный способ перекодировки - когда передо мной возникла эта проблема, я, не мудрствуя лукаво, состаряпал утилитку. при известном умении писать bat-файлы для компиляции или обладая искусством создания makefile можно сделать абсолютно прозрачную работу: пишем программы в кодировке редактора, а при компиляции все автоматом подставляется/преобразуется, после компиляции возвращается, как было.

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

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А я пользуюсь iconv-lcd-encodings
Оно инсталлирует в систему нужные кодировки для glibc, и в коде строки можно писать просто по-русски.
Только в CFLAGS в Makefile добавить опцию типа -fexec-charset=ks0066-ru, а так всем преобразованием занимается сам компилятор.

Правда, не уверен, что для windows способ подходит.
Аватара пользователя
rus084
Друг Кота
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская
Контактная информация:

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

Сообщение rus084 »

у всех кто пользуется данным кодом вывода , экран запускается как-то через раз
экран 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 он не реагирует

нашел временное решение:
отключить питание на логику экранчика (не на подсветку), подключить обратно питание (тут выводились всякие кракозябры), сбросить кнопкой дискоборд (тут становилось всё окей)
Меня зовут Димон .
Изображение
Изображение
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

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

Сообщение aam »

Здравствуйте!
Обратил внимание, что у индикатора WH1602 помимо специальных контактов для подсветки сбоку в распиновке основного разъема помечены контакты 15 и 16 как A/Vee и К.
Через них тоже можно питать подсветку? Зачем тогда доп. контакты сбоку?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Вообще контакты сбоку это не основные контакты подключения подсветки. Ориентироваться надо только на 15-16 выводы, а сбоку подключать только когда их нет. Там еще кстати можно глянуть - на подсветку могут резисторы стоять которые как раз и идут к 15-16 выводам, а может там просто места под резисторы а ты выбирай сам какие ставить исходя из требуемой яркости и напряжения. Попробуй прозвонить.

если брать инициализацию из даташита , он работает , но через строчку символы выводятся .
иногда у меня экран запускается , но очень много мусора в необновляемых областях
на команду 0x01 он не реагирует

Он не будет реагировать если команда дается в 8-битном режиме(а библиотека откуда узнает что ты индикатор используешь в 4-битном режиме?) Адресация символов/строк зависит от индикатора а не от чипа в него установленного - надо уточнять в даташите на конкретный индикатор где какая строка начинается в памяти.
Вобщем какая-то стремная библиотека, работу которой надо пошагово проверить на соответствие спецификации. Очень похожа на бред абстракциониста, какой-то крайний запущенный вариант уровня абстракций, надо быть ближе к земле.
Последний раз редактировалось Alexeyslav Вт апр 15, 2014 16:15:55, всего редактировалось 1 раз.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

У Фордатовского дисплея 0802 есть модификация где светодиод подключен к пинам 1 и 2 через пофигистор 1206. Пришлось вместо него впаивать токоограничивающий резистор :facepalm:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

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

Сообщение aam »

Прикол в том ,что эту схему делаю для работы, т. е. детали купят когда уже плата будет сделана. Но у меня вроде был какой-то индикатор, гляну как там разведено, хотя здесь будет другой тип.

Gudd-Head писал(а): есть модификация где светодиод подключен к пинам 1 и 2 через пофигистор 1206
Это типа к питанию индикатора чтоли? :shock: Жестко... Может там с другой стороны платы резистор уже есть? Ведь если прямо светодиод, то такие индикаторы по дефолту сгорать будут...

Ну а резистор, ИМХО, лучше на своей плате ставить.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Так неизвестно еще какой индикатор купят... надо рассчитывать на конкретную модель, лучше рассчитывать под 14 выводов а 15 и 16 если что можно дополнительно проводами подключить, как это сделал бы в случае отсутствия оных.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

aam писал(а):Может там с другой стороны платы резистор уже есть?

Нету там ничего, звонится напрямую от А/К светодиода до контактов 1/2 которые таки да, для питания дисплея.
При питании 3.3 В ток был за 50 мА! :kill:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Ну так это нормально, если дисплей на 3.3В, светодиоды подсветки являются параметрическим стабилизатором для питания дисплея... через резистор подаешь питание на него с 5В и получаешь рабочий индикатор. Да, не рассчитано на тот случай если тебе подсветка не нужна а дисплей нужен, тогда уж приходится доработать напильником.
Аватара пользователя
rus084
Друг Кота
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская
Контактная информация:

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

Сообщение rus084 »

Alexeyslav писал(а):Он не будет реагировать если команда дается в 8-битном режиме(а библиотека откуда узнает что ты индикатор используешь в 4-битном режиме?) Адресация символов/строк зависит от индикатора а не от чипа в него установленного - надо уточнять в даташите на конкретный индикатор где какая строка начинается в памяти.
Вобщем какая-то стремная библиотека, работу которой надо пошагово проверить на соответствие спецификации. Очень похожа на бред абстракциониста, какой-то крайний запущенный вариант уровня абстракций, надо быть ближе к земле.


библиотека по идее должна работать только в 4 битном режиме .
оно работает через chibi/os
вроде все правильно , но неработает

пробывал запустить прошивку из этой статьи http://cxem.net/mc/mc263.php
экран тоже не запускается как надо

даташита на него тоже нету
вобще какойто странный экран , но зато 20х4
с чего мне начать?
Меня зовут Димон .
Изображение
Изображение
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

С проверки сигналов на индикаторе, с проверки его напряжения питания, есть 5В а есть 3.3В индикаторы, они могут плохо работать на неродных напряжениях.
Аватара пользователя
Catcatcat
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт янв 13, 2012 21:46:35
Откуда: Днепропетровск
Контактная информация:

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

Сообщение Catcatcat »

Изображение

тут 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 и его аналогах

Сообщение rus084 »

переделал код инициализации так :
Спойлер

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

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 и его аналогах

Сообщение rus084 »

со старой инициализацией экрана, но с новой инициализацией пинов тоже самое
я не пойму , с инициализацией пинов , действия совершаются теже , но с немного другим алгоритмом и какая разница образуется в железе

Меня зовут Димон .
Изображение
Изображение
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Я же говорю, убедись что все сигналы на индикатор выдаются правильно. Осциллографом или логическим анализатором. Иначе ты долго можешь искать проблему, когда она спряталась на более низком уровне. Убедись что передаются данные на дисплей именно в 4-битном режиме, а до переключения в 4-битный режим должны выдаваться 8-битные команды. У тебя и там и там используется одна и та же процедура lcd_HD44780_write, а это в корне неверно.

Ох уж этот абстракционизм... верный способ запутаться в трех соснах нагенерив целый фантомный лес.
Аватара пользователя
rus084
Друг Кота
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская
Контактная информация:

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

Сообщение rus084 »

абстракционизм - не я придумал .

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

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

Сообщение ARV »

rus084 писал(а):перепишу библиотеку послностью из статьи

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

Мой уютный бложик... заходите!
Аватара пользователя
rus084
Друг Кота
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская
Контактная информация:

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

Сообщение rus084 »

желательно чтобы все работало через chibi/os , но эта ос позволяет обращаться к железу напрямую .

у меня stm32f4
Меня зовут Димон .
Изображение
Изображение
Аватара пользователя
rus084
Друг Кота
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская
Контактная информация:

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

Сообщение rus084 »

сделал 4 битный режим , но всеравно не работает .
мне кажется что проблема аппаратная , у кого есть stm32f4discovery и экран hd44780 и хочет проверить это?
Меня зовут Димон .
Изображение
Изображение
Ответить

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