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

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

Сообщение ARV »

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

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

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

Сообщение WiseLord »

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

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

Сообщение 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
Откуда: Москва

Сообщение aam »

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

Сообщение Alexeyslav »

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

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

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

Сообщение aam »

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

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

Сообщение Alexeyslav »

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

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

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

Сообщение Alexeyslav »

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

Сообщение rus084 »

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

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

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

Сообщение Alexeyslav »

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

Сообщение Catcatcat »

Изображение

тут http://catcatcat.d-lan.dp.ua/skachat/bi ... i-ks0066u/ последняя версия 2,0 библиотеки, для руссифицированых индикаторов там встроена перекодировка, посмотрите как сделано.

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

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

Сообщение rus084 »

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

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

Сообщение Alexeyslav »

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

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

Сообщение rus084 »

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

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

Сообщение ARV »

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

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

Сообщение rus084 »

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

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

Сообщение rus084 »

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

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