Работа с ЖКИ на контроллере HD44780 и его аналогах
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Я для батарейного делал от ноги через кондер на два последовательных диода и таким образом генерировал отрицательное напряжение чтоб от 2-х вольт он работал - все было прекрасно и шимом управлялось тож нормально
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
По pdf на atmega88v - выход по порту 40mA max. При R4=680 - ток 7,4mA (max), что более чем с 5-ти кратным запасом. К тому же, возможно номинал R4 придётся увеличивать.clawham писал(а):...хоть там и потребление должно быть мизерное, но через транзистор спокойнее чтоль...
Но на диоде с V0 на VDD не экономьте.
- pony sonata
- Первый раз сказал Мяу!
- Сообщения: 27
- Зарегистрирован: Чт май 24, 2018 09:38:55
- Откуда: Украина
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
я чесн говоря ни разу не видел диода между v0 и vdd на схемах. или он нужен именно в моем случае?
-- Приключения маленькой пони в большом мире электроники --
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Именно в вашем.
Есть вероятность, что при выключении, напряжение на VDD спадёт быстрее, чем на V0 (а по документации, напряжение на V0 не может превышать VDD).
Есть вероятность, что при выключении, напряжение на VDD спадёт быстрее, чем на V0 (а по документации, напряжение на V0 не может превышать VDD).
- pony sonata
- Первый раз сказал Мяу!
- Сообщения: 27
- Зарегистрирован: Чт май 24, 2018 09:38:55
- Откуда: Украина
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
понял. благодарю за ответ. значит поставим диод
-- Приключения маленькой пони в большом мире электроники --
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Друзья, помогите пожалуйста разрулить странный глюк с кодом. Дисплей 1602 HD44780, камень - Atmega8. Странность в том, что он однозначно запускается и работает, только при определенной и единственной конфигурации портов/пинов.
"Дисплейный" раздел кода:
Простейший тест в майне.
Заголовки "lcd.h":
Этот конфиг работает
А этот и прочие - нет
"Дисплейный" раздел кода:
Спойлер
Код: Выделить всё
#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 и его аналогах
Функция send_byte явно не соответствует своему названию, посылая только половину байта.
Но это так.. просто некорректное имя функции. А вот чего я не вижу, так это позиционирования. Куда должен выводиться текст?
Но это так.. просто некорректное имя функции. А вот чего я не вижу, так это позиционирования. Куда должен выводиться текст?
Последний раз редактировалось WiseLord Пн окт 08, 2018 12:58:52, всего редактировалось 1 раз.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Не зря советуют все выражения в #define заключать в скобки.
Рассмотрим, например, это:
Поработаем немного компилятором. Первым делом нужно подставить значения из #define'ов:
Теперь вспомним про приоритеты операций. Сначала выполняется инверсия (~), потом - сдвиг (<<), и, наконец, присваивание с побитовым И (&=). Итого, получается так:
Посчитаем выражение в правой части: (~1) = 0b11111110, ((~1) << 2) = 0b11111000.
Кажется, это не то, чего хотелось от строчки
Вывод: выражения в #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 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
*Trigger*
Вот спасибо вам сердечное! Мало, что все заработало, так вы еще потрудились и объяснить суть проблемы.
Жаль, что только плюсами могу отблагодарить.
Вот спасибо вам сердечное! Мало, что все заработало, так вы еще потрудились и объяснить суть проблемы. Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Граждане-товарищи а не кто не встречал готовую библиотеку дабы выводить большие цифры. В две или три строки. Под андурино гуглиться без проблем, а вот под просто под avr-gcc не чего не могу найти.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
когда-то давно делал самhcm писал(а):под просто под avr-gcc не чего не могу найти
- Вложения
-
- lcd_big.zip
- (55.75 КБ) 341 скачивание
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Народ, кто рисовал свои символы - как заставить символ отрисовываться на полную высоту в 8 точек? Что бы я ни делал, у меня нижняя строка в матрице символа отображается пустой и размер вместо 5x8 точек оказывается 5x7.
Пишу для Atmega8 в WinAVR (компилятор avr-gcc). Для управления LCD используется библиотека от Peter Fleury (в прикрепленном архиве).
Пример моего кода:
В итоге получается вот так:

Как я понимаю, нижняя строка остается зарезервирована под курсор, хотя он отключен. При этом некоторые символы вроде заполнения и строчной "j" отрисовываются на все 8 точек, а значит, проблема не в дисплее. Что я делаю не так?
Пишу для 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 и его аналогах
а вы на реальном ЖКИ смотрите полоски или на виртуальном (например, в протеусе)? у меня в протеусе беда с 8-й линией, а в реальности все пучком
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
На реальном. В протеусе еще не так заметно - в нем все символы сжаты до 5x7, включая заполнение, а в железе эта разница в одну строку в глаза бросается.
Дисплей типа такого, только обозначен как "MJ1602C" (документации по нему не нашел, какая-то подделка другой подделки):

Дисплей типа такого, только обозначен как "MJ1602C" (документации по нему не нашел, какая-то подделка другой подделки):

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Andrew88, попробуйте так.
Есть предположение, что в основном цикле вы постоянно выводите символ в позицию (0,0), а так как курсор отключен, то он и затирает нижнюю строку. А на самом деле символ выводится полностью.
Код: Выделить всё
// Загружаем свои символы в 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), а так как курсор отключен, то он и затирает нижнюю строку. А на самом деле символ выводится полностью.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
serg_svd, не, дело точно не в этом, пробовал по-всякому.
В общем, без малейшего понятия, что это такое было - переписал проект заново, и символы стали рисоваться как положено.

Может, при компиляции что-то шло не так или какой-то аппаратный баг словил, даже не знаю. На забугорном форуме нашлась такая же проблема с игнорированием дисплеем команды "0x0C": https://www.avrfreaks.net/forum/lcd-and-cursor-onoff/, но как всегда: "I will post the results", - и тишина с 2007 года
В общем, без малейшего понятия, что это такое было - переписал проект заново, и символы стали рисоваться как положено.
Может, при компиляции что-то шло не так или какой-то аппаратный баг словил, даже не знаю. На забугорном форуме нашлась такая же проблема с игнорированием дисплеем команды "0x0C": https://www.avrfreaks.net/forum/lcd-and-cursor-onoff/, но как всегда: "I will post the results", - и тишина с 2007 года


- trengtor
- Сверлит текстолит когтями
- Сообщения: 1299
- Зарегистрирован: Вт мар 31, 2015 22:56:07
- Откуда: Мы люди простые, живем в лесу, на пенек молимся
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Что-то, видимо, в библиотеке. Советую разобраться (там вовсе не рокетсайнс) и подправить.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
у Peter Fleury в библиотеке есть один баг, но с описанной проблемой он никак не связан. баг в том, что при вычислении адреса ячейки ОЗУ для дисплеев с числом строк больше 2 он использует не битовое ИЛИ, а обычное суммирование. Для двух строк выходит так, что переполнение при сложении не возникает, а для остальных получается так, что возникает перенос битов при суммировании... если заменить + на | - все начинает работать отлично.trengtor писал(а):Что-то, видимо, в библиотеке.
это просто к слову
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
ARV, я так понимаю, эта строка? (Мне как раз и нужно будет 4-строчным дисплеем рулить)
Код: Выделить всё
lcd_command((1<<LCD_DDRAM)+addressCounter);
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
да, только там этих строк больше - внутри функции lcd_gotoxy
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
