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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Сообщение R_ura »

Babulesnik писал(а):
Если удаляю скобку,вылазит куча ошибок
Скобку надо удалить. А что пишет в ошибках?
Реклама
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Вт мар 06, 2012 19:59:00

Сообщение Babulesnik »

Блин,вообще ппц. Залил hex файл отсюда http://avrlab.com/node/80 дисплей повесил на порты как в примере.Даже подключил другой ЖКИ,аналогичный только с синей подсветкой.Все идентично с примером но не работает((((
Реклама
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Вт мар 06, 2012 19:59:00

Сообщение Babulesnik »

Профи,помогите пожалуйста,извелся весь.
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Сообщение R_ura »

Babulesnik писал(а):Профи,помогите пожалуйста,извелся весь.
Какой у тебя компилятор-то??
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Вт мар 06, 2012 19:59:00

Сообщение Babulesnik »

R_ura писал(а):
Babulesnik писал(а):Профи,помогите пожалуйста,извелся весь.
Какой у тебя компилятор-то??
Программирую в AVRStudio 5 .Компилятор AVR/GNU C Compiller
Реклама
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Вт мар 06, 2012 19:59:00

Сообщение Babulesnik »

Есть идеи с чем это может быть связано? Интересуют любые зацепки
Реклама
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Сообщение R_ura »

Babulesnik писал(а):Есть идеи с чем это может быть связано? Интересуют любые зацепки
А схему нельзя посмотреть?

Вот выложил здесь проект протеуса +прошивка. Посмотри как ЖКИ подключен правильно. Можешь там же убедится, что работает нормально. Там таже бибилотека для ЖКИ, что скидывал тебе выше.
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Вт мар 06, 2012 19:59:00

Сообщение Babulesnik »

R_ura писал(а):
Babulesnik писал(а):Есть идеи с чем это может быть связано? Интересуют любые зацепки
А схему нельзя посмотреть?

Вот выложил здесь проект протеуса +прошивка. Посмотри как ЖКИ подключен правильно. Можешь там же убедится, что работает нормально. Там таже бибилотека для ЖКИ, что скидывал тебе выше.
Спасибо,только я не вижу прикрепленных файлов или ссылки.
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Сообщение R_ura »

Babulesnik писал(а):
Спасибо,только я не вижу прикрепленных файлов или ссылки.
Пардон, пропустил..
http://radiokot.ru/forum/viewtopic.php?f=21&t=66939

там последнее сообщение сейчас. Архив.. Если у тебя есть мега32, можешь ее прошить этой прошивкой и вживую проверить свой жки..
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Вт мар 06, 2012 19:59:00

Сообщение Babulesnik »

Спасибо большое буду юзать.У меня только 8 и 88 меги + 3 винстаровских ЖКИ(16х2).
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Сообщение R_ura »

Babulesnik писал(а):Спасибо большое буду юзать.У меня только 8 и 88 меги + 3 винстаровских ЖКИ(16х2).
Работает?
А что юзать-то будешь?
Я только не помню, там для двухстрочного дисплея надо что-то в инициализации менять или нет? В даташите посмотри. Или сделай такой же проект в протеусе и замени этот 4-х строчный индикатор на двухстрочный. Увидишь тогда. Мне кажется что должен нормально работать и с двустрочным. .
uni
Встал на лапы
Аватара пользователя
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург

Сообщение uni »

Вот бедолаги. Наваял я код для супер пупер более менее универсальной работы с этим контроллером. Правда он на С++, но это только обёртка. Методы класса CLCD легко выдираются в отдельные функции, если кому оно надо. Код работы с ЖКИ у меня унифицирован максимально, причём работает одновременно в двух компиляторах: IAR AVR и AVR GCC.

Вот оно счастье, работающее, для тех, кто понимает:
На С++: https://mysvn.ru/schoolbell/pbiidemo/LCD.cpp
На бейсике: https://mysvn.ru/schoolbell/pbiidemo/bascom/

На бейсик я просто портировал с С++, это более ограниченная версия, которую я сделал только для того, чтобы удобно выводить там (bascom) русские символы. Исходник на С++ заточен пока на 4-х проводный интерфейс, хотя там есть код и для полного соединения через 8-битную шину, но я его не тестировал. Что же касается 4-проводного взаимодействия, то вы можете все выводы управления индикатором сажать на абсолютно любые ноги контроллера, т.е. вообще, хоть по одному выводу на каждом порту. Я говорю про: E, RW, RS и D4-D7. RW можно либо использовать, либо нет (отключаемо).

Методы, реализованные в классе, смотрите тут: https://mysvn.ru/schoolbell/pbiidemo/LCD.h
Есть почти всё, даже такое извращение, как использование 8-ми пользовательских символов для отображения буфера из ОЗУ контроллера на экране индикатора (static void Draw( uint8_t Buffer[], uint8_t Row, uint8_t Col );).

Можете выдрать только, что нужно для своего проекта, ибо... ибо там всё достаточно просто.

Инициализация для индикаторов WH1602B-YGK-CTK, WH1602B-YMI-CTK, WH2004A-YYH-CP для двустрочного отображения инфы:
LCD_16x2_Init.gif
Инициализация WH1602B
(130.09 КБ) 42160 скачиваний

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

    WriteLow4bits( 0x03 );
    WriteStrobe( 40 );          // -> 0x03
    WriteStrobe( 40 );          // -> 0x03

    WriteLow4bits( 0x02 );
    WriteStrobe( 40 );          // -> 0x02
    WriteStrobe( 40 );          // -> 0x02

    WriteLow4bits( 0x2C );
    WriteStrobe( 40 );          // -> 0x0C

    WriteData( TYPE_COMMAND, 0x06 ); // 1, I/D, SH

    Clear(); // -> 0x01

    WriteData( TYPE_COMMAND, 0x0C ); // 1, D, C, B

    Home(); // -> 0x02
Работает это заклинание везде. Написано в терминах моего класса. Везде - это в железе, в IAR, в AVR GCC, в Proteus. Собственно, это малая часть чуть большего проекта.
Внимание. Не забываем, что, если не используется RW, то он должен жёстко сидеть на земле, а если используем, то настраиваем на вывод перед инициализацией. В моём примере используется функция WriteLow4bits(), которая это подразумевает. Я очень долго отыскивал у себя баг, когда просто напросто забыл настроить на вывод RS и RW перед инициализацией. Понял я это только после убийства кучи времени и наблюдением за состоянием вывода RS на осциллографе. Меня очень удивил имевшийся там потенциал, поэтому у меня в коде инициализации я сначала настраиваю эти линии. Я это пишу для тех, кто привык к другим вариантам работы с LCD, т.к. у меня WriteLow4bits() изменяет состояние только 4-х линий данных и не более того. Об этом нужно помнить.

Добавлю только, что класс ещё до конца не дописан, т.к. мне осталось работу с курсорами доделать и прочие мелочи жизни, но все основные функции он исполняет. Я видел только две более менее нормальные библиотеки для работы с HD44780. Одна на асме, другая на Си (для AVR). Поскольку я давно уже отошёл от асма и от Си, то они мне не очень были по душе. Ссылки, к сожалению, я забыл где видел. Может быть даже здесь.

Пробуйте. Да, кстати, перевод каретки функция WriteString() понимает, правда переводит пока только на вторую строку. Это нужно для хранения инициализации экрана во флеш в виде одной строки, вот так:

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

FLASHSTR_DECLARE( char, frmDisplay,
"Дисплей         \n"
"                " );
А считывание и отображение я делаю вот так:

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

    CLCD::Clear();
    CLCD::Home();
    CLCD::WriteString( frmDisplay, 0 ,0 );
    
    FormPaint();
    
    // Отображаем пользовательские символы
    CLCD::Goto( 1, 0 );
    for ( uint8_t i = 0; i < 8; i++ ) CLCD::PutChar(i);
Надеюсь, что таблица перекодировки вам тоже понравится ;)

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

/*   +----------------+
     |Таблица символов|
     |Windows (ANSI)  |
     +----------------+      +----------------+
     |0123456789ABCDEF|      |0123456789ABCDEF|
     +----------------+      +----------------+
0x00 |( пропущено )   | 0x80 |( пропущено )   |
0x10 |( пропущено )   | 0x90 |( пропущено )   |
0x20 | !"#$%&'()*+,-./| 0xA0 |( пропущено )   |
0x30 |0123456789:;<=>?| 0xB0 |( пропущено )   |
0x40 |@ABCDEFGHIJKLMNO| 0xC0 |АБВГДЕЖЗИЙКЛМНОП|
0x50 |PQRSTUVWXYZ[\]^_| 0xD0 |РСТУФХЦЧШЩЪЫЬЭЮЯ|
0x60 |`abcdefghijklmno| 0xE0 |абвгдежзийклмноп|
0x70 |pqrstuvwxyz{|}~ | 0xF0 |рстуфхцчшщъыьэюя|
     +----------------+      +----------------+
*/

// Таблица перекодировки из CP1251 (WIN)
#ifdef __ICCAVR__
    __flash uint8_t CP1251_TO_CPHD44780[ 256 ] = {
#elif defined __GNUC__
    PROGMEM uint8_t _CP1251_TO_CPHD44780[ 256 ] = {
#endif
//PROGMEM unsigned char CP1251_TO_CPHD44780[ 256 ] = {
      /* +---------------------------------------------------------------------------------------------------------------+
         |  00  |  01  |  02  |  03  |  04  |  05  |  06  |  07  |  08  |  09  |  0A  |  0B  |  0C  |  0D  |  0E  |  0F  | */
/* CGRAM:  (1)    (2)    (3)    (4)    (5)    (6)    (7)    (8)    (1)    (2)    (3)    (4)    (5)    (6)    (7)    (8)    */
/* 0x00 */ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 , 0x09 , 0x0A , 0x0B , 0x0C , 0x0D , 0x0E , 0x0F , //

/* 0x10 */ 0x10 , 0x11 , 0x12 , 0x13 , 0x14 , 0x15 , 0x16 , 0x17 , 0x18 , 0x19 , 0x1A , 0x1B , 0x1C , 0x1D , 0x1E , 0x1F , //
/* 0x20 */ 0x20 , 0x21 , 0x22 , 0x23 , 0x24 , 0x25 , 0x26 , 0x27 , 0x28 , 0x29 , 0x2A , 0x2B , 0x2C , 0x2D , 0x2E , 0x2F , //
/* 0x30 */ 0x30 , 0x31 , 0x32 , 0x33 , 0x34 , 0x35 , 0x36 , 0x37 , 0x38 , 0x39 , 0x3A , 0x3B , 0x3C , 0x3D , 0x3E , 0x3F , //
/* 0x40 */ 0x40 , 0x41 , 0x42 , 0x43 , 0x44 , 0x45 , 0x46 , 0x47 , 0x48 , 0x49 , 0x4A , 0x4B , 0x4C , 0x4D , 0x4E , 0x4F , //
/* 0x50 */ 0x50 , 0x51 , 0x52 , 0x53 , 0x54 , 0x55 , 0x56 , 0x57 , 0x58 , 0x59 , 0x5A , 0x5B , 0x20 , 0x5D , 0x5E , 0x5F , //
/* 0x60 */ 0x60 , 0x61 , 0x62 , 0x63 , 0x64 , 0x65 , 0x66 , 0x67 , 0x68 , 0x69 , 0x6A , 0x6B , 0x6C , 0x6D , 0x6E , 0x6F , //
/* 0x70 */ 0x70 , 0x71 , 0x72 , 0x73 , 0x74 , 0x75 , 0x76 , 0x77 , 0x78 , 0x79 , 0x7A , 0x5B , 0x20 , 0x5D , 0xE9 , 0x7F , //
       /*|  00  |  01  |  02  |  03  |  04  |  05  |  06  |  07  |  08  |  09  |  0A  |  0B  |  0C  |  0D  |  0E  |  0F  | */
/* 0x80 */ 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , //
/* 0x90 */ 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , //
/* 0xA0 */ 0xCB , 0x20 , 0x49 , 0x69 , 0x04 , 0x20 , 0xFE , 0xEF , 0xA2 , 0xCC , 0x00 , 0xC9 , 0x20 , 0x20 , 0x20 , 0x02 , //
/* 0xB0 */ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xB5 , 0x4E , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , //
/* 0xC0 */ 0x41 , 0xA0 , 0x42 , 0xA1 , 0xE0 , 0x45 , 0xA3 , 0xA4 , 0xA5 , 0xA6 , 0x4B , 0xA7 , 0x4D , 0x48 , 0x4F , 0xA8 , //
/* 0xD0 */ 0x50 , 0x43 , 0x54 , 0xA9 , 0xAA , 0x58 , 0xE1 , 0xAB , 0xAC , 0xE2 , 0xAD , 0xAE , 0x62 , 0xAF , 0xB0 , 0xB1 , //
/* 0xE0 */ 0x61 , 0xB2 , 0xB3 , 0xB4 , 0xE3 , 0x65 , 0xB6 , 0xB7 , 0xB8 , 0xB9 , 0xBA , 0xBB , 0xBC , 0xBD , 0x6F , 0xBE , //
/* 0xF0 */ 0x70 , 0x63 , 0xBF , 0x79 , 0xE4 , 0x78 , 0xE5 , 0xC0 , 0xC1 , 0xE6 , 0xC2 , 0xC3 , 0xC4 , 0xC5 , 0xC6 , 0xC7 , //
      /* |  00  |  01  |  02  |  03  |  04  |  05  |  06  |  07  |  08  |  09  |  0A  |  0B  |  0C  |  0D  |  0E  |  0F  |
         +---------------------------------------------------------------------------------------------------------------+ */
};
#ifdef __GNUC__
    FU08T_PTR CP1251_TO_CPHD44780(_CP1251_TO_CPHD44780);
#endif
Россия навсегда!
Контактная информация:
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

Здравствуйте!
Не уверен что пишу в нужную тему, но более подходящего не нашел, а создавать мусор не хочется.

Подскажите пожалуйста распиловку ЖКИ LCM1602K-FSW-GBW-R, и на каком контролере она устроена.

Пытался найти сам, но нечего путного не вышло.

В заранее спасибо!
STM32F4 Discovery + KEIL + Windows 7
Друг Кота
Аватара пользователя
Сообщения: 6324
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Mr.Denis писал(а):Подскажите пожалуйста распиловку :) ЖКИ LCM1602K-FSW-GBW-R,
По первой же ссылке Гуголя имеем PDF, из которого и контроллер KS0066U, и распиловка

http://www.displayfuture.com/engineerin ... M1602K.pdf
Родился
Аватара пользователя
Сообщения: 17
Зарегистрирован: Сб дек 03, 2011 18:03:34
Откуда: Khark0xFF.UA

Сообщение techlab »

Уважаемые коты!
Есть вот такая библиотечка для работы с HD44780, что-то не могу понять как выводить данные, пока только курсором управлять могу. ну и собственно header Писано в IAR 5.3
Вот такая вариация на тему putchar что-то не работает.

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

void lcd_puts(char *s, char clr)
{
  if(clr) LCDClear();
  LCDxy(0,0);
  printf(s);
}
Есть у кого какие мысли?
Есть. Код оформляем как вложение.
Gudd-Head
Опыт прямо пропорционален количеству аппаратуры выведенной из строя...
Контактная информация:
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Пн янв 30, 2012 17:09:59
Откуда: Тучково

Сообщение T-Xen »

Использую lcd_lib с сайта Cheap-Enable. МК- ATmega32. Прошиваю через PonyProg2000. В Протеусе всё работает, вот в железе не хочет(((
Смотрю осциллографом - никаких импульсов МК не выдает на дисплей. Хотя простой хрестоматийный пример со светодиодом работает...
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

А нельзя сделать так чтоб препроцессор перекодировал символы кириллицы.?
Пишешь например по русски а препроцессор подставляет вместо этого нужные коды из таблицы.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

phanis писал(а):А нельзя сделать так чтоб препроцессор перекодировал символы кириллицы.?
Пишешь например по русски а препроцессор подставляет вместо этого нужные коды из таблицы.
не препроцессор, а при помощи команды в makefile или простого батничка - можно
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
uni
Встал на лапы
Аватара пользователя
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург

Сообщение uni »

Как правило это не имеет смысла делать. Как в этом случае, к примеру, выводить строки текста, полученные по USART? Препроцессор и изменение исходника на этапе компиляции - это статические методы, если захочется чего-то большего, то всё равно будете использовать таблицу перекодировки. Если вам так дорог каждый байт, то можно использовать только верхние 128 символов таблицы, проверяя код символа перед преобразованием: если меньше 128, то посылаете как есть, если больше, то перекодируете. Т.о. можно сохранить 128 байт флеша или 64 команды. Вряд ли ради этого стоит создавать дополнительные усложнения.
Россия навсегда!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

uni писал(а):Как правило это не имеет смысла делать. Как в этом случае, к примеру, выводить строки текста, полученные по USART?
проблема явно высосана из пальца: на 2 строки в 16 знаков выводить что-то принятое по USART - это из разряда задач "от нечего делать". в этом случае можно и внутреннюю перекодировку реализовать, раз делать нечего. а в реальности вывод на дисплей ведется ИЗНУТРИ МК, и статические строки нужнее и востребованнее.
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Ответить

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