Работа с ЖКИ на контроллере 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 КБ) 341 скачивание
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
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 КБ) 270 скачиваний
Изображение
Аватара пользователя
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
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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