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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

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

Сообщение clawham »

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

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

Сообщение Albert_V »

clawham писал(а):...хоть там и потребление должно быть мизерное, но через транзистор спокойнее чтоль...
По pdf на atmega88v - выход по порту 40mA max. При R4=680 - ток 7,4mA (max), что более чем с 5-ти кратным запасом. К тому же, возможно номинал R4 придётся увеличивать.
Но на диоде с V0 на VDD не экономьте.
Реклама
Аватара пользователя
pony sonata
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт май 24, 2018 09:38:55
Откуда: Украина

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

Сообщение pony sonata »

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

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

Сообщение Albert_V »

Именно в вашем.
Есть вероятность, что при выключении, напряжение на VDD спадёт быстрее, чем на V0 (а по документации, напряжение на V0 не может превышать VDD).
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
pony sonata
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт май 24, 2018 09:38:55
Откуда: Украина

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

Сообщение pony sonata »

понял. благодарю за ответ. значит поставим диод
-- Приключения маленькой пони в большом мире электроники --
Реклама
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

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

Сообщение MOHCTEP »

Друзья, помогите пожалуйста разрулить странный глюк с кодом. Дисплей 1602 HD44780, камень - Atmega8. Странность в том, что он однозначно запускается и работает, только при определенной и единственной конфигурации портов/пинов.
"Дисплейный" раздел кода:
Спойлер

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

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"


void strobe_lcd(void){
	LCD_E_PORT|=LCD_E;
	_delay_us(20);
	LCD_E_PORT&=~LCD_E;
	_delay_us(20);
	//LCD_E_PORT|=LCD_E;
}

void send_byte(char byte){
	byte&0x80?(LCD_DT7_PORT |= LCD_DT7):(LCD_DT7_PORT &= ~LCD_DT7);
	byte&0x40?(LCD_DT6_PORT |= LCD_DT6):(LCD_DT6_PORT &= ~LCD_DT6);
	byte&0x20?(LCD_DT5_PORT |= LCD_DT5):(LCD_DT5_PORT &= ~LCD_DT5);
	byte&0x10?(LCD_DT4_PORT |= LCD_DT4):(LCD_DT4_PORT &= ~LCD_DT4);
	strobe_lcd();
}

//Командуем 
void lcd_cmd(char a){
	LCD_RS_PORT&=~LCD_RS;
	send_byte(a);
	send_byte(a<<4);
	
}

//Данные 
void lcd_data(char a){
	LCD_RS_PORT|=LCD_RS;
	send_byte(a);
	send_byte(a<<4);
}

/*Подметаемся*/
void lcd_clear(void){
	lcd_cmd(0x01);
	_delay_ms(2);
}

/**INSTALL LCD**/
void init_lcd_ports(void){
	LCD_RS_DDR|=LCD_RS;
	LCD_E_DDR|=LCD_E;
	LCD_DT7_DDR|=LCD_DT7;
	LCD_DT6_DDR|=LCD_DT6;
	LCD_DT5_DDR|=LCD_DT5;
	LCD_DT4_DDR|=LCD_DT4;
	LCD_RS_PORT&=~LCD_RS;
	LCD_E_PORT&=~LCD_E;
	LCD_DT7_PORT&=~LCD_DT7;
	LCD_DT6_PORT&=~LCD_DT6;
	LCD_DT5_PORT&=~LCD_DT5;
	LCD_DT4_PORT&=~LCD_DT4;
}
//
void lcd_init(void){
	init_lcd_ports();
	_delay_ms(200);
	LCD_RS_PORT&=~LCD_RS;
	send_byte(0x30);
	_delay_ms(6);
	send_byte(0x30);
	_delay_us(200);
	send_byte(0x30);
	_delay_ms(1);
	send_byte(0x20); //4 бит
	lcd_cmd(0x28); //4 бит
	_delay_ms(1);
	lcd_cmd(0x08);//отображение и курсоры выключены.
	_delay_ms(1);
	lcd_clear();
	lcd_cmd(0x06);//режим увеличения счетчика
	_delay_ms(1);
	lcd_cmd(0x0C);//отображение включено, курсоры выключены.
	_delay_ms(10);
}
Простейший тест в майне.

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

int main(void){
	lcd_init();
	_delay_ms(200);
	lcd_data(48);//"0"
	while(1){	}
}
Заголовки "lcd.h":
Этот конфиг работает
Спойлер

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

#define LCD_RS_DDR DDRB
#define LCD_RS_PORT PORTB
#define LCD_RS 1<<2
#define LCD_E_DDR DDRB
#define LCD_E_PORT PORTB
#define LCD_E 1<<1
#define LCD_DT7_DDR DDRD
#define LCD_DT7_PORT PORTD
#define LCD_DT7 1<<7
#define LCD_DT6_DDR DDRD
#define LCD_DT6_PORT PORTD
#define LCD_DT6 1<<6
#define LCD_DT5_DDR DDRD
#define LCD_DT5_PORT PORTD
#define LCD_DT5 1<<5
#define LCD_DT4_DDR DDRD
#define LCD_DT4_PORT PORTD
#define LCD_DT4 1<<4
А этот и прочие - нет
Спойлер

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

#define LCD_RS_DDR DDRD
#define LCD_RS_PORT PORTD
#define LCD_RS 1<<5
#define LCD_E_DDR DDRD
#define LCD_E_PORT PORTD
#define LCD_E 1<<6
#define LCD_DT7_DDR DDRB
#define LCD_DT7_PORT PORTB
#define LCD_DT7 1<<2
#define LCD_DT6_DDR DDRB
#define LCD_DT6_PORT PORTB
#define LCD_DT6 1<<1
#define LCD_DT5_DDR DDRB
#define LCD_DT5_PORT PORTB
#define LCD_DT5 1<<0
#define LCD_DT4_DDR DDRD
#define LCD_DT4_PORT PORTD
#define LCD_DT4 1<<7
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Функция send_byte явно не соответствует своему названию, посылая только половину байта.

Но это так.. просто некорректное имя функции. А вот чего я не вижу, так это позиционирования. Куда должен выводиться текст?
Последний раз редактировалось WiseLord Пн окт 08, 2018 12:58:52, всего редактировалось 1 раз.
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

Не зря советуют все выражения в #define заключать в скобки.
Рассмотрим, например, это:

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

#define LCD_RS_DDR DDRB
#define LCD_RS_PORT PORTB
#define LCD_RS 1<<2
LCD_RS_PORT&=~LCD_RS;
Поработаем немного компилятором. Первым делом нужно подставить значения из #define'ов:

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

PORTB&=~1<<2;
Теперь вспомним про приоритеты операций. Сначала выполняется инверсия (~), потом - сдвиг (<<), и, наконец, присваивание с побитовым И (&=). Итого, получается так:

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

PORTB &= ((~1) << 2);
Посчитаем выражение в правой части: (~1) = 0b11111110, ((~1) << 2) = 0b11111000.

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

PORTB &= 0b11111000;
Кажется, это не то, чего хотелось от строчки

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

LCD_RS_PORT&=~LCD_RS;
Вывод: выражения в #define нужно заключать в скобки!

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

#define LCD_RS (1<<2)
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

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

Сообщение MOHCTEP »

*Trigger* :beer: Вот спасибо вам сердечное! Мало, что все заработало, так вы еще потрудились и объяснить суть проблемы. :)) Жаль, что только плюсами могу отблагодарить.
hcm
Родился
Сообщения: 9
Зарегистрирован: Ср мар 09, 2011 01:17:16

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

Сообщение hcm »

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

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

Сообщение ARV »

hcm писал(а):под просто под avr-gcc не чего не могу найти
когда-то давно делал сам
Вложения
lcd_big.zip
(55.75 КБ) 342 скачивания
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Andrew88
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 15, 2017 18:52:10

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

Сообщение Andrew88 »

Народ, кто рисовал свои символы - как заставить символ отрисовываться на полную высоту в 8 точек? Что бы я ни делал, у меня нижняя строка в матрице символа отображается пустой и размер вместо 5x8 точек оказывается 5x7.
Пишу для Atmega8 в WinAVR (компилятор avr-gcc). Для управления LCD используется библиотека от Peter Fleury (в прикрепленном архиве).
Пример моего кода:
Спойлер

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

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdio.h>
#include "lcd.h"

unsigned char lines[8] = 
{
0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, // Двойная черта высотой по 2 точки сверху и снизу.
};

int main(void)  
{  
	DDRB = 128;
	DDRC = 255;
	DDRD = 255;

	unsigned char i;

	lcd_init(LCD_DISP_ON); // Дисплей включен, курсор выключен.

	// Загружаем свои символы в CGRAM
	lcd_command(0x40);  // Переходим в CGRAM
	for(i=0; i<8; i++)
	{
		lcd_data(lines[i]);
	}
	lcd_command(0x80); // Возвращаемся в DDRAM
	
	while(1)
	{
		// Переходим на начальную позицию и вызываем записанный символ.
		lcd_gotoxy(0, 0);
		lcd_putc(0);
	}
	return 0;
}
В итоге получается вот так:
Изображение

Как я понимаю, нижняя строка остается зарезервирована под курсор, хотя он отключен. При этом некоторые символы вроде заполнения и строчной "j" отрисовываются на все 8 точек, а значит, проблема не в дисплее. Что я делаю не так?
Вложения
lcdlibrary.zip
(31.8 КБ) 271 скачивание
Изображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Andrew88
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 15, 2017 18:52:10

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

Сообщение Andrew88 »

На реальном. В протеусе еще не так заметно - в нем все символы сжаты до 5x7, включая заполнение, а в железе эта разница в одну строку в глаза бросается.
Дисплей типа такого, только обозначен как "MJ1602C" (документации по нему не нашел, какая-то подделка другой подделки):
Изображение
Изображение
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

Andrew88, попробуйте так.

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

// Загружаем свои символы в CGRAM
   lcd_command(0x40);  // Переходим в CGRAM
   for(i=0; i<8; i++)
   {
      lcd_data(lines[i]);
   }

   // Переходим на начальную позицию и вызываем записанный символ.
   lcd_gotoxy(0, 0);
   lcd_putc(0);
   
   while(1)
   {
   }
Есть предположение, что в основном цикле вы постоянно выводите символ в позицию (0,0), а так как курсор отключен, то он и затирает нижнюю строку. А на самом деле символ выводится полностью.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
Andrew88
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 15, 2017 18:52:10

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

Сообщение Andrew88 »

serg_svd, не, дело точно не в этом, пробовал по-всякому.
В общем, без малейшего понятия, что это такое было - переписал проект заново, и символы стали рисоваться как положено.
Изображение

Может, при компиляции что-то шло не так или какой-то аппаратный баг словил, даже не знаю. На забугорном форуме нашлась такая же проблема с игнорированием дисплеем команды "0x0C": https://www.avrfreaks.net/forum/lcd-and-cursor-onoff/, но как всегда: "I will post the results", - и тишина с 2007 года :facepalm:
Изображение
Аватара пользователя
trengtor
Сверлит текстолит когтями
Сообщения: 1299
Зарегистрирован: Вт мар 31, 2015 22:56:07
Откуда: Мы люди простые, живем в лесу, на пенек молимся
Контактная информация:

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

Сообщение trengtor »

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

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

Сообщение ARV »

trengtor писал(а):Что-то, видимо, в библиотеке.
у Peter Fleury в библиотеке есть один баг, но с описанной проблемой он никак не связан. баг в том, что при вычислении адреса ячейки ОЗУ для дисплеев с числом строк больше 2 он использует не битовое ИЛИ, а обычное суммирование. Для двух строк выходит так, что переполнение при сложении не возникает, а для остальных получается так, что возникает перенос битов при суммировании... если заменить + на | - все начинает работать отлично.
это просто к слову
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Andrew88
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 15, 2017 18:52:10

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

Сообщение Andrew88 »

ARV, я так понимаю, эта строка? (Мне как раз и нужно будет 4-строчным дисплеем рулить)

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

    lcd_command((1<<LCD_DDRAM)+addressCounter);
Изображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

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