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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

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

Сообщение slavokhire5 »

всем привет) который день мучаю дисплей wh0802. в симуляторе работает нормально, при работе с реальным железом на экране каша) засвеченные квадраты, без всякой логики:) причем при выключении-выключении питания комбинация каждый раз разная! кроме квадратов иногда выскакивают какие-то знаки, но редко. иногда работает одна строка, иногда 2. пробовал начинать с разных адресов: 0x00, 0x40, 0x80, 0xC0. задержки при инициализации пробовал от нс десятков мс. разницы особой не заметил) может, такие глюки из-за того, что во время прошивки кристалла к нему подключен дисплей? :)

вот код, мб в нем что не так?

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

#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>

#define RS 6        //RS=PA6 - сигнал управления ЖКИ
#define E  5        //E=PA5  - строб-сигнал


//а0-а3 дата,
 


void lcd_pre_init(void);
void lcd_com (unsigned char lcd);
void lcd_dat (unsigned char lcd);
void lcd_show(void);
void lcd_init (void);
//----------

int main (void)
{
   DDRA = 0xEF;                   // порт А работает как выход
   DDRB = 0x00;                  // порт В работает как вход
   lcd_pre_init();
   lcd_show();
   sei();
}

//----------
//программа перевода дисплея в 4-битный режим
void lcd_pre_init(void)
{
   /*
   троекратная команда установки 8-битного режима для раздупления дисплея. Вместо 0x30 подается
   0x03, т.к. у меня выводам D5-D8 дисплея соответствуют выводы D0-D3 МК
   */
   PORTA = ((0x03)&~(1<<RS))|(1<<E);      
   _delay_us(50);                      
   PORTA = ((0x03)&~(1<<RS))&~(1<<E);
   _delay_ms(20);

   PORTA = ((0x03)&~(1<<RS))|(1<<E);      
   _delay_us(50);                      
   PORTA = ((0x03)&~(1<<RS))&~(1<<E);
   _delay_ms(2);

   PORTA = ((0x03)&~(1<<RS))|(1<<E);      
   _delay_us(50);                      
   PORTA = ((0x03)&~(1<<RS))&~(1<<E);
   _delay_ms(2);

   PORTA = ((0x02)&~(1<<RS))|(1<<E);      // установка 4-битного режима, далее дисплей работает в нем   
   _delay_us(50);                      
   PORTA = ((0x02)&~(1<<RS))&~(1<<E);
   _delay_ms(2);                  
   lcd_init();
}
//----------
// программа обработки команд для ЖКИ
void lcd_com (unsigned char lcd)
{
   unsigned char temp;

   temp = ((lcd >> 4)&~(1<<RS))|(1<<E);   // RS=0 – это команда
   PORTA = temp;                     // Выводим на portА старшую тетраду команды, сигналы RS, E
   _delay_us(50);                      // Небольшая задержка для стабилизации
   PORTA = temp&~(1<<E);               // Сигнал записи команды

   _delay_us(50);                  // задержка между циклами записи

   temp=(((lcd<<4)>>4)&~(1<<RS))|(1<<E);// RS=0 – это команда
   PORTA=temp;                        // Выводим на portА младшую тетраду команды, сигналы RS, E
   _delay_us(50);                     // Небольшая задержка для стабилизации
   PORTA = temp&~(1<<E);               // Сигнал записи команды

   _delay_us(50);                  //Пауза для выполнения команды
}
//----------
// программа записи данных в ЖКИ
void lcd_dat (unsigned char lcd)
{
   unsigned char temp;
   temp=((lcd>>4)|(1<<RS))|(1<<E);      //RS=1 – это данные
   PORTA=temp;                        //Выводим на portА старшую тетраду данных, сигналы RS, E   
   _delay_us(50);                     //Небольшая задержка для стабилизации
   PORTA = temp&~(1<<E);               //Сигнал записи данных
   _delay_us(50);                  // задержка между циклами записи
   temp=(((lcd<<4)>>4)|(1<<RS))|(1<<E);   //RS=1 – это данные
   PORTA=temp;                        //Выводим на portА младшую тетраду данных, сигналы RS, E   
   _delay_us(50);                     //Небольшая задержка для стабилизации
   PORTA = temp&~(1<<E);                //Сигнал записи данных
   _delay_us(50);                  //Пауза для вывода данных
}
//----------
// программа обработки данных для вывода
void lcd_show(void)
{
   

   lcd_com(0x80);   //Ставим курсор на начало 1-й строки ЖКИ
   lcd_dat('0')
   lcd_com(0xC0);   //Ставим курсор на начало 2-й строки ЖКИ
   lcd_dat('1')
}
//----------
// программа инициализации
void lcd_init (void)
{

   lcd_com(0x28);      // 4-проводный интерфейс, 2 строки, 5х8 символ
   _delay_us(200);

   lcd_com(0x01);      // Очистить DDRAM и установить курсор на 0x00
   _delay_us(200);

   lcd_com(0x06);      // инкремент адреса, сдвиг экрана отключен
   _delay_us(200);

   lcd_com(0x0C);      // Показать изображение, курсор не показывать
   _delay_us(200);
}
//----------
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

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

Сообщение slavokhire5 »

Ничего не могу понять. не работает, и все. выводит засвеченные квадраты вразброс. А в симуляторе все хорошо. У кого есть пример рабочей иницализации для дисплея на языке Си, проверенные в железе, дайте пожалуйста. асм плохо знаю :(
ну и код свой приложу. вдруг ошибки еще остались
Вложения
distance.c
(6.54 КБ) 296 скачиваний
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Nixie
Потрогал лапой паяльник
Сообщения: 337
Зарегистрирован: Пн май 04, 2009 17:45:33
Откуда: Киев

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

Сообщение Nixie »

Прикупил для опытов дисплейчик WH160C-GTI-CT. Есть пара вопросов.
Судя по ДШ дисплей типа FSTN ,т.е. светлые символы на темном фоне. На плате есть места под источник отр. напряжения, однако он не распаян. В ДШ указанно, что он optional ,т.е. его может не быть , одако на схеме подключения присован вывод идущий от Vee непонятно куда :) (см.рис.) Дык нужно ему отрицательное напряжение или нет ?
Еще смущает надпись в конце ДШ , в описании подсветки "will newer get Vee output from pin 15" т.е его нельзя использовать как источник отр. напряжения . Вопрос аналогичен п.1 : нужно ли оно вообще ?
Если подключить только питание дисплея и подсветку (выводы А и К через резистор) , то должны быть видны светлые квадраты на темном фоне , т.к. дисплей инверсный ?
Вложения
LCD_POWER_2.jpg
(20.75 КБ) 469 скачиваний
LCD_POWER.JPG
(38.93 КБ) 649 скачиваний
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Nixie писал(а):Есть пара вопросов.

Надо смотреть, что в даташите пишут относительно напряжения контрастности. Обычно всё (по кр. мере, 8×2) работает от 5 В, для работы от 3 (3.3) В необходим источник отр. напряжения.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Nixie
Потрогал лапой паяльник
Сообщения: 337
Зарегистрирован: Пн май 04, 2009 17:45:33
Откуда: Киев

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

Сообщение Nixie »

Запустил дисплейчик :) Отрицательное напряжение оказалось не нужно. Подсветку подключил через резистор 7,5 ом , ток --120мА , напряжение питания--5 В. (При 3,5 В , указанных в ДШ подсветка с резистором не заводится вообще, а без него боязно, т.к 5В. :) ) Питание дисплея--5В. Если покрутить резистор контраста--пояляются строки. Экранчик чуть теплый.
А кто как подсветку подключает---с резистором или без ?

UPD Либо как вариант городить источник на 3,3 В для подсветки и питать ее без резистора , а все остально---от 5В , т.к. "Supply Voltage For Logic"---4,7 V min. " по ДШ.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

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

Сообщение КАШАК »

У кого-нибудь есть библиотека или пример работы с дисплеем wh1602a для AVR Studio? (инициализация, вывод символа и т.п.) А то весь инет перерыл, но ничего не нашел... :(
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

удалено
Последний раз редактировалось Arlleex Чт янв 05, 2012 22:43:23, всего редактировалось 1 раз.
Не умеешь - не берись, но не взявшись не научишься...
Nixie
Потрогал лапой паяльник
Сообщения: 337
Зарегистрирован: Пн май 04, 2009 17:45:33
Откуда: Киев

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

Сообщение Nixie »

Может этот пример поможет ? (на Си)
Код взят с айта avrlab.com , однако в моемнт написания ответа он был недоступен, а прямую ссылку я не помню :)

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

    #include <avr/io.h> //библиотека ввода/вывода
     
    #define RS 2 //RS=PD2 - сигнал управления ЖКИ
    #define E 3 //E=PD3 - сигнал управления ЖКИ
     
    #define TIME 10 //Константа временной задержки для ЖКИ
    //Частота тактирование МК - 4Мгц
     
    //Программа формирвоания задержки
    void pause (unsigned int a)
    { unsigned int i;
     
    for (i=a;i>0;i--);
    }
     
    //Программа передачи команд в ЖКИ
    void lcd_com (unsigned char lcd)
    { unsigned char temp;
     
    temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда
    PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E
    asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
    PORTD=temp&~(1<<E); //Сигнал записи команды
     
    temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда
    PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E
    asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
    PORTD=temp&~(1<<E); //Сигнал записи команды
     
    pause (10*TIME); //Пауза для выполнения команды
    }
     
    //Программа записи данных в ЖКИ
    void lcd_dat (unsigned char lcd)
    { unsigned char temp;
     
    temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные
    PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E
    asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
    PORTD=temp&~(1<<E); //Сигнал записи данных
     
    temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные
    PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E
    asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
    PORTD=temp&~(1<<E); //Сигнал записи данных
     
    pause(TIME); //Пауза для вывода данных
    }
     
    //Программа иниализации ЖКИ
    void lcd_init (void)
    {
    lcd_com(0x2c); //4-проводный интерфейс, 5x8 размер символа
    pause(100*TIME);
    lcd_com(0x0c); //Показать изображение, курсор не показывать
    pause(100*TIME);
    lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00
    pause (100*TIME);
    }
     
    //Основная программа
    int main(void)
    {
    DDRD=0xfc; //Инициализация portD
    PORTD=0x00;
     
    pause(1000); //Задержка, чтобы ЖКИ успел включиться
    lcd_init(); //Инициализация ЖКИ
     
     
    lcd_dat('w'); //Вывод "www.avrlab.com"
    lcd_dat('w');
    lcd_dat('w');
    lcd_dat('.');
    lcd_dat('a');
    lcd_dat('v');
    lcd_dat('r');
    lcd_dat('l');
    lcd_dat('a');
    lcd_dat('b');
    lcd_dat('.');
    lcd_dat('c');
    lcd_dat('o');
    lcd_dat('m');
     
    lcd_com(0xc0); //Ставим курсор на начало 2-й строки ЖКИ
     
    lcd_dat('I'); //Записываем "It's so easy"
    lcd_dat('t');
    lcd_dat('"');
    lcd_dat('s');
    lcd_dat(' ');
    lcd_dat('s');
    lcd_dat('o');
    lcd_dat(' ');
    lcd_dat('e');
    lcd_dat('a');
    lcd_dat('s');
    lcd_dat('y');
     
     
    while(1) //бесконечный цикл
    ;
     
    return 1;
    }
Nixie
Потрогал лапой паяльник
Сообщения: 337
Зарегистрирован: Пн май 04, 2009 17:45:33
Откуда: Киев

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

Сообщение Nixie »

Приведенный мною выше код оказался рабочим :)) Только для моего дисплея (WH1602C-GTI) потребовалось увеличить задержку

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

pause(TIME); //Пауза для вывода данных

на

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

pause(10*TIME); //Пауза для вывода данных

, иначе не выводил данные.
Частота МК---1 МГц , оптимизация -O0 (AVR Studio)
Однако небольшой глюк все же есть: при включении , чтобы на жк вывелись символы нужно перезакрузить МК кнопкой reset . Причину пока не выяснял.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

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

Сообщение КАШАК »

Дисплей запустил. Но теперь возникла проблема. Программирую в Ubuntu, среда разработки Eclipse. И у меня не хочет работать перекодировка русских букв... Сложилось впечатление, что все дело в кодировке, т.к. программа определяет, что буква не английская, но на дисплее отображается какой-то бред... Какая кодировка должна быть выставлена в среде разработки? Пробовал несколько различных вариантов кода для вывода русских букв, на дисплее отображалось одно и тоже... Как с этим бороться?

P.S.
Русские буквы в дисплее есть, когда программировал в CodeVision под виндой, дисплей работал нормально...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

Обычно кодировка ASCII
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

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

Сообщение КАШАК »

Так в ней, вроде, нет русских символов. Eclipse ошибку выдал при вводе русских символов при кодировке ASCII... Кто еще сталкивался с подобной проблемой?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

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

Сообщение КАШАК »

Все, разобрался. Надо было вручную ввести кодировку CP1251 Теперь все работает! :))
Опыт растет прямо пропорционально выведенному из строя оборудованию...
scv
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт ноя 04, 2010 20:47:50

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

Сообщение scv »

Здраствуйте. Решил виртуально (Proteus) подключить LCD LM016L к МК ATmega8. По восьмибитной шине все заработало, а когда переделал программу для подключения по 4-хбитной шине, не работает. Подскажите пожалуйста, в чем ошибка. PB7 - E, PB6 - R/S, PD4 - D4, ..., PD7 - D7.

.include "m8def.inc"
.def lcd = r17

ldi r16,low(ramend)
out spl,r16
ldi r16,high(ramend)
out sph,r16

;Настройка портов

ldi r16, 0b11110000
out DDRD,r16
sbi PORTB,1
ldi r16,0b11000000
out ddrb,r16

;Настройка LCD

rcall delay2ms
ldi lcd,0b00100100
rcall lcdcom
ldi lcd,0b00000110
rcall lcdcom
ldi lcd,0b00001101
rcall lcdcom
ldi lcd,0b00000011
rcall lcdcom
rcall delay2ms
ldi lcd,0b00000001
rcall lcdcom
ldi lcd,0b10000000
rcall lcdcom
rcall delay2ms

;Основной цикл
ldi r25,8
subi r25,-0x30
mov lcd,r25
rcall lcddat

end:rjmp end

;Вывод на дисплей байта команды

lcdcom:
sbi portb,7
cbi portb,6
rcall delay40us
out portd,lcd
cbi portb,7
rcall delay40us
swap lcd
sbi portb,7
cbi portb,6
rcall delay40us
out portd,lcd
cbi portb,7
rcall delay40us
ret

;Вывод на дисплей байта данных

lcddat:
sbi portb,7
sbi portb,6
rcall delay40us
out portd,lcd
cbi portb,7
rcall delay40us
swap lcd
sbi portb,7
sbi portb,6
rcall delay40us
out portd,lcd
cbi portb,7
rcall delay40us
ret
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

От асм-а отвык уже давно, поэтому могу ошибиться. Сделал бы как-то так:

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

.include "m8def.inc"
.def lcd = r17

ldi r16,low(ramend)
out spl,r16
ldi r16,high(ramend)
out sph,r16

;Настройка портов

ldi r16, 0b11110000
out DDRD,r16
sbi PORTB,1
ldi r16,0b11000000
out ddrb,r16

;Настройка LCD

rcall delay40ms
ldi lcd,0b00110000
rcall lcdcom
rcall delay5ms
ldi lcd,0b00110000
rcall lcdcom
rcall delay100us
ldi lcd,0b00110000   ; 3-ы проводится инициализация 8-и битного режима
rcall lcdcom
rcall delay40us
ldi lcd,0b00100000   ; 4-х битный режим
rcall lcdcom
rcall delay40us
ldi lcd,0b00100100   ; 4-х битный режим , 2 строки
rcall lcdcom
rcall delay40us
ldi lcd,0b00001100   ; вкл. дисплея без курсора
rcall lcdcom
rcall delay40us
ldi lcd,0b00000001   ; сброс дисплея
rcall lcdcom
rcall delay2ms
ldi lcd,0b00000100   ; инкремент адреса, без сдвига экрана
rcall lcdcom

;Основной цикл
ldi r25,8
subi r25,-0x30
mov lcd,r25
rcall lcddat

end:rjmp end

;Вывод на дисплей байта команды
lcdcom:
sbi portb,7
cbi portb,6
out portd,lcd
cbi portb,7
swap lcd
sbi portb,7
out portd,lcd
cbi portb,7
ret

;Вывод на дисплей байта данных
lcddat:
sbi portb,7
sbi portb,6
out portd,lcd
cbi portb,7
swap lcd
sbi portb,7
out portd,lcd
cbi portb,7
ret
scv
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт ноя 04, 2010 20:47:50

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

Сообщение scv »

Все равно ничего не выводится (. Сделал даже везде задержки не меньше 2мс, не понимаю, почему не отображается информация на дисплее. Может есть у кого-нибудь код программы, где присутствует иниицализация этого LCD на ассемблере для 4-битной шины?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Как вариант
viewtopic.php?p=598742#p598742
BVS
Потрогал лапой паяльник
Сообщения: 336
Зарегистрирован: Пн май 23, 2011 18:27:41

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

Сообщение BVS »

scv писал(а):Все равно ничего не выводится (. Сделал даже везде задержки не меньше 2мс, не понимаю, почему не отображается информация на дисплее. Может есть у кого-нибудь код программы, где присутствует иниицализация этого LCD на ассемблере для 4-битной шины?


На АСМе ничего прощще и понятнее не встречал:
http://easyelectronics.ru/avr-uchebnyj-kurs-biblioteka-dlya-lcd-na-baze-hd44780.html#more-71
scv
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт ноя 04, 2010 20:47:50

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

Сообщение scv »

Проблема решена, спасибо за помощь.
vladsol
Родился
Сообщения: 8
Зарегистрирован: Пт ноя 11, 2011 23:08:44

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

Сообщение vladsol »

Всем доброго времени суток!

Подскажите, а после инициализации дисплея (Горит одна верхняя строка. Без подключенных линий управления\данных) должен ли быть высокий лог. уровень на всех выводах (D0-D7, RS,RW,E)?
Хотелось бы знать, нормально ли это :-) У меня на всех выводах относительно земли - 5 Вольт :(
Ответить

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