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

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

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

Сообщение WiseLord »

В общем, инициализация должна быть приблизительно такой:
Спойлер

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

void strob(void)
{
   E1;
   _delay_us (2);
   E0;
   _delay_us(2);
}

void Initialization (void) // Определяем функцию инициализации //
{
   DDRLC = poryd; // подключенные к жки устанавливаем в 1- выходы, два  не использующихся оставляем как входы
   PORTLC = 0x00; // устанавливаем на выходах 0, где по условию RS and RW также должны быть = 0.
   _delay_ms (20); //  Wait time > 15 ms

   RS0; // command mode
   PORTLC = (0x30 & 0xF0);
   strob();

   _delay_ms (5); // Wait time > 4.1 ms
   PORTLC = (0x30 & 0xF0);
   strob();

   _delay_us (120); // Wait time > 100 us
   PORTLC = (0x30 & 0xF0);
   strob();

   PORTLC = (0x20 & 0xF0); // set 4-bit mode
   strob();
   
   command_lcd (0x20); // 0010 0000 rw=0, rs=0
   command_lcd (0xc0); // 1100 0000 rw=0, rs=0
   command_lcd (0x10); // 0001 0000 rw=0, rs=0 Display clear
   command_lcd (0x60); // 0110 0000 rw=0, rs=0 Entry mode set
}

void  command_lcd (unsigned char cmd)
{
   _delay_us(50);

   RS0; // command mode
   PORTLC = (cmd & 0xF0); // Передаем старший полубайт *1111 0000
   strob();
   PORTLC = ((cmd & 0x0F) << 4); // Передаем младший полубайт * 0000 1111
   strob();

}

void  data_lcd (unsigned char data)
{
   _delay_us(50);

   RS1; // data mode
   PORTLC = (data & 0xF0); // Передаем старший полубайт *1111 0000
   strob();
   PORTLC = ((data & 0x0F) << 4); // Передаем младший полубайт * 0000 1111
   strob();

}
Реклама
ТОХЫЧ
Родился
Сообщения: 10
Зарегистрирован: Сб ноя 22, 2014 22:41:49

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

Сообщение ТОХЫЧ »

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

void command_lcd1(unsigned char cmd)// Передача только старший полубайт
{
	PORTLC = (cmd & 0xF0); // Передаем старший полубайт *1111 0000
	RS0;   // Для передачи комманды
	E1;     // Подтверждение передачи данных
	_delay_us (2); // Небольшая задержки для обработки команды    контроллером ЖКИ
	E0; // Окончание импульса строба
}

void Initialization (void) // Определяем функцию инициализации //
{
	DDRLC = poryd; // подключенные к жки устанавливаем в 1- выходы, два  не использующихся оставляем как входы 
	PORTLC = 0x00; // устанавливаем на выходах 0, где по условию RS and RW также должны быть = 0.
	_delay_ms (20); //  Wait time > 15 ms

	command_lcd1 (0x30); // 0011  rw=0, rs=0
	_delay_ms (5); // Wait time > 4.1 ms
	command_lcd1 (0x30); // 0011  rw=0, rs=0
	_delay_us (120); // Wait time > 100 us
	command_lcd1 (0x30); // 0011  rw=0, rs=0
	_delay_us (2);
	command_lcd1 (0x20); // 0010  rw=0, rs=0 4бит интерфейс
	command_lcd (0x2C); // 0010 1100 rw=0, rs=0 Function set
	command_lcd (0x0С); // 0000 1000 rw=0, rs=0  Displey on
	command_lcd (0x01); // 0000 0001 rw=0, rs=0 Display clear
	command_lcd (0x06); // 0000 0110 rw=0, rs=0 Entry mode set

	
	
}
Вот поправил с учетом замечаний.
Добавил фунуцию command_lcd1 для передачи только старшего полубайта
Последний раз редактировалось ТОХЫЧ Пн мар 30, 2015 13:38:40, всего редактировалось 2 раза.
Реклама
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

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

Команда же очистки дисплея очень медленная, т.к. по факту просто поочередно очищает каждое знакоместо дисплея... Поэтому после нее задержка должна быть большая 1.5 мс.
Для строба можно сделать задержку в 500 нс.
И вообще задержки после каждой команды, т.к. вы не читаете флаг занятости.

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

	rcall 	DELAY_13107			; Первая задержка в районе 
		rcall 	DELAY_13107			; более 20 мс (после включения питания)
				
		;-----------------------------------------------------	
																			
		ldi		R18,	0b00110000	; Команда установки 8 линий для инициализации (передаем ее три раза, поэтому и цикл) 

		ldi		R19, 3				; Задаем количество циклов (три команды)
		
		rcall	DB_LINE				; Вызываем подпрограмму, которая отправит команду (тетраду)

NEXT:	rcall	STROBE				; А это стробирующий импульс по Е шине (используется везеде)

		rcall 	DELAY_13107			; Вторая задержка 

		dec		R19

		brne	NEXT

		;-----------------------------------------------------

		ldi		R18,	0b00100000	; Команда установки 4 линии для инициализации (четвертый раз уже для 4 битного режима)!!
		
		rcall	DB_LINE				; Вызываем подпрограмму, которая отправит команду (тетраду)

		rcall	STROBE

		rcall 	DELAY_13107			; задержка больше 5 мс

		;---------------------------------------------------------------------------------------------
			
		ldi		R18,	0b00101000	; Команда установки 4 линии и две строки (наконец-то прошла и вторая тетрада) 
		rcall	CMD_WR				; Вызываем подпрограмму отправки команды
	
		ldi		R18,	0b00000001	; Очистка дисплея
		rcall	CMD_WR				; Вызываем подпрограмму отправки команды

.if R_W == 0		; Если мы не ВЫБРАЛИ при инициализации использование порта RW, то компилируем эту задержку

		rcall 	DELAY_13107			; Медленная команда, для нее длинная задержка

.endif
		
		ldi		R18,	0b00000110	; Установка режима вывода данных (сдвиг курсора вправо)
		rcall	CMD_WR				; Вызываем подпрограмму отправки команды
		
		ldi		R18,	0b00001100	; Включаем дисплей (курсор погашен)
		rcall	CMD_WR				; Вызываем подпрограмму отправки команды
Станислав
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

ТОХЫЧ писал(а):Вот поправил с учетом замечаний
Заработало хотя бы?

Плюс всё равно не вижу задержки в начале command_lcd, плюс зачем-то присутствует команда на выключение дисплея (0x08), а не на включение (0x0C).

P.S. Исправил опечатку 0x80 -> 0x08, 0xC0 -> 0x0C
Последний раз редактировалось WiseLord Пн мар 30, 2015 16:04:18, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
ТОХЫЧ
Родился
Сообщения: 10
Зарегистрирован: Сб ноя 22, 2014 22:41:49

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

Сообщение ТОХЫЧ »

Заработало хотя бы?
Пока на работе возможности проверить нет.

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

Плюс зачем-то присутствует команда на выключение дисплея (0x80), а не на включение (0xC0).
Команда на выключение это 00001000 по калькулятору это (0x08) почему Вы пишете 10000000 (0x80)
На включение это 00001100 (0x0C) a у Вас 1100000 (0xC0)
Можете пояснить сей факт? Что то не понимаю.
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
ТОХЫЧ
Родился
Сообщения: 10
Зарегистрирован: Сб ноя 22, 2014 22:41:49

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

Сообщение ТОХЫЧ »

Не работает :cry:
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Действительно, возьмите готовую библиотеку. ))) АРВ правильно говорит.
Проверьте на готовой исправность своего дисплея, а потом можно и свою мудрить. :)
Станислав
ТОХЫЧ
Родился
Сообщения: 10
Зарегистрирован: Сб ноя 22, 2014 22:41:49

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

Сообщение ТОХЫЧ »

а потом можно и свою мудрить.

Так поэтому и мудрю что уже кучу готовых перепробовал.
возьмите готовую библиотеку.
Так я ж только за.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

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

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

Сообщение WiseLord »

А может, человеку не нужна библиотека на ассемблере, а нужна на C? :)

Можете мою отсюда глянуть. Поддерживаются 4-бит и 8-бит режимы (нужные файлы ks0066.h и ks0066.c), а также работа через I²C-переходник на базе PCF8574 (нужны файлы i2c.h и i2c.c)

Библиотека написана под avr-gcc. Нужный режим выбирается одним из макросов KS0066_WIRE_8BIT, KS0066_WIRE_4BIT или KS0066_WIRE_PCF8574 в ks0066.h. Пины дисплея можно подключать к абсолютно любым ножкам МК, конфигурация ножек понятным образом описывается в файле pins.h.

Если используется не ардуино, а простой МК, то описывать конфигурацию просто в виде

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

#define KS0066_D7	B
#define KS0066_D7_LINE	(1<<7)
#define KS0066_D7	C
#define KS0066_D7_LINE	(1<<0)
rufooth
Родился
Сообщения: 2
Зарегистрирован: Пн апр 20, 2015 12:40:16

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

Сообщение rufooth »

Не хотел создавать новую тему, решил написать сюда. Может быть кому то поможет.

Довольно долго бился над проблемой помех в дисплее: "ЖКИ символьный WH1602D-YYK-CTK (Winstar)".
Когда дисплей ловил помеху на экране вместо нормальной информации отображалось множества случайных символов.
Много гуглил. Допаивание конденсаторов, резисторов, экранирование дало некий эффект, но полностью проблему не решило.
В результате решил данную проблему переинициализацией, но! Если делать при каждом цикле инициализацию (как обычно при включении) будет моргать вторая строка.
После ряда тестов получилось сделать функцию частичной переинициализации которая убирает сбой, но не вызывает моргания дисплея при нормальной работе.
Код переинициализации:

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

void reInitLCD(void) // функция переинциализации дисплея
{
   SendLCDc(0b00101000); // Настройка функций
   SendLCDc(0b00001100); // Включить дисплей
   __delay_ms(2);
   SendLCDc(0b00000110); // Установка режима
    __delay_ms(2);
   SendLCDc(0b10000000); // DDRAM addresss 0000
   SendLCDc(0b00000010); // return home
    __delay_ms(2);
}//
В принципе можно еще убрать часть, у себя я пока так оставил.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Это из цикла "поделюсь опытом" или вопрос будет? :dont_know:
Станислав
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Странно. Не припомню чтобы кто-нибудь жаловался что дисплей ловил помеху на экране вместо нормальной информации отображалось множества случайных символов. :dont_know: Может, у вас провода километровые?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

Кто нибудь попробовал управлять LCD дисплеем через регистры 595 ?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

А что в этом такого? :dont_know:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

Ничего особенного. Просто может есть уже наработки, библиотеки.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

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

Сообщение Albert_V »

А самому написать программу сложно? За 15-ть минут с тремя перекурами можно написать программу.
Если что то не получается - спрашивайте. Не забудьте выложить схему, исходник и объяснить в чём проблема.
Если вам нужно только "готовое" - тогда обращайтесь в ветку "Предлагаю работу".
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Не могу сказать, что мне хватило 15 минут, чтобы написать свою библиотечку... :dont_know: И вроде, не считаю себя сильно тупым. ))) Но, однако, как это увлекательно! Оно того стоит. 8)
Станислав
Ответить

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