Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ЖКИ BC2004B
Форум разработчиков электроники ELECTRONIX.ru > Поставщики компонентов для электроники > Компоненты > Средства индикации
AVR
Есть символьный дисплей BC2004B 20х4.
У этого дисплея четыре строки, но внутрення организация у него как у двухстрочного (3-я строка продолжение первой, 4-я - продолжение второй).
Поэтому для работы с ним я включаю режим работы на две строки. Но в результате, на ЖКИ первая строка пишется в первый ряд ЖКИ как и положено, однако вторая пишется в третий ряд, а 3-я и 4-я вовсе не появляются на экране. В чем может быть ошибка? Как можно задействовать все четыре строки?
BVU
Цитата(AVR @ Jan 24 2006, 02:26) *
Есть символьный дисплей BC2004B 20х4.
У этого дисплея четыре строки, но внутрення организация у него как у двухстрочного (3-я строка продолжение первой, 4-я - продолжение второй).
Поэтому для работы с ним я включаю режим работы на две строки. Но в результате, на ЖКИ первая строка пишется в первый ряд ЖКИ как и положено, однако вторая пишется в третий ряд, а 3-я и 4-я вовсе не появляются на экране. В чем может быть ошибка? Как можно задействовать все четыре строки?

Возможно Вы 'недоинициализировали' LCD. Когдато я делал для WH1604A, что немногим отличается от BC2004B (количество позиций в строке). Вот код инициализации:

void LCD_init(void)
{
PORTB = STROB_DOWN;
PORTB = RS_COMAND;
PORTD = WRITE_LCD;
DelayMs(100);
PORTB = (DATA_IO_LCD | 0x03); // To establish word length of the interface
LCD_strobe();
DelayUs(40);
LCD_strobe();
DelayUs(40);
LCD_strobe();
DelayUs(40);
LCD_write_comand(0x28); // 4 bit mode, 2/16 duty, 5x8 font
LCD_write_comand(0x08); // display off
LCD_write_comand(0x0C); // display on, blink curson off
LCD_write_comand(0x06); // entry mode
}

так же необходимо четко выдерживать все временные соотношения рекомендуемые к инициализации контроллера - DelayMs(), DelayUs(40):

#define ClkFreq 16000000
#define _1us (unsigned long)((ClkFreq / 1000000) / 1.25)
#define _1ms (unsigned long)(ClkFreq / 1000)
void DelayMs(unsigned int d)
{
while(d--)__delay_cycles(_1ms);
}

void DelayUs(unsigned int d)
{
while(d--)__delay_cycles(_1us);
}

длительность строба LCD_strobe() так же должна быть не меньше минимально допустимой.
Рекомендую посмотреть документацию на MT-20S4A, что является практически аналогом для BC2004B. Там достаточно подробное описание модуля (http://www.melt.aha.ru/work/display/150).
AVR
Спасибо за помощь. Сделал код инициализации такой же как у Вас и расставил задержки при изменении управляющих сигналов не менее минимальных (минимум 500 нс, я поставил 5 мкс), но индикатор по прежнему отображал только 1-ю и 3-ю строки. Потом я пошел и заменил в магазине ЖКИ модуль на такой же. Подключил - а ситуация обратная: на нём уже работает 2-я и 4-я строка, это при том что программа, зашитая в управляющий контроллер всё та же самая. Как Вы думаете, это всё же бракованные индикаторы или это у меня руки не совсем прямые?
У меня возникли подозрения на тему того что я мог сделать не так:
1) Если я задал задержки при управляющих сигналах больше чем рекоммендуется, то может это сказаться на работоспособности? Хотя при фиксированной задержке в 5 мкс всё нормально пишется/читается...
2) Если у меня порядок начальных установок после инициализации не совсем такой как в документации MT-20S4A, то могло ли из-за этого не заработать?
BVU
Брак ЖКИ думаю, что маловероятен.
Цитата(AVR @ Feb 2 2006, 14:03) *
1) Если я задал задержки при управляющих сигналах больше чем рекоммендуется, то может это сказаться на работоспособности? Хотя при фиксированной задержке в 5 мкс всё нормально пишется/читается...

Для инициализации и выполнения команд контроллера приведены задержки которые должны быть не менее указанных в документации на индикатор. Но если Вы их будете необоснованно 'затягивать' это лишь увеличит время доступа к ЖКИ.
Цитата(AVR @ Feb 2 2006, 14:03) *
2) Если у меня порядок начальных установок после инициализации не совсем такой как в документации MT-20S4A, то могло ли из-за этого не заработать?

Однозначно! С этим надо разобраться в первую очередь...

Посмотрев инициализацию на контроллеры Bolymin, предлагаю такой вариант инициализации задержек (так же учтите, что данная настройка для 4-х битного режима ЖКИ):
#define STROB_UP (PORTB | (1 << PB4))
#define STROB_DOWN (PORTB & (~(1 << PB4)))
#define RS_DATA (PORTB | (1 << PB5))
#define RS_COMAND (PORTB & (~(1 << PB5)))
#define READ_LCD (PORTD | (1 << PD0))
#define WRITE_LCD (PORTD & (~(1 << PD0)))
#define DATA_IO_LCD (PORTB & 0xf0)

void LCD_init(void)
{
PORTB = STROB_DOWN;
PORTB = RS_COMAND;
PORTD = WRITE_LCD;
DelayMs(20);
PORTB = (DATA_IO_LCD | 0x03); // To establish word length of the interface
LCD_strobe();
DelayMs(5);
LCD_strobe();
DelayUs(120);
LCD_strobe();
LCD_write_comand(0x28); // 4 bit mode, 2/16 duty, 5x8 font
LCD_write_comand(0x08); // display off
LCD_write_comand(0x0C); // display on, blink curson off
LCD_write_comand(0x06); // entry mode
}

Задаю попутно вопросы:
1. При регулировании контрастности у индикатора 'позиции' всех строк подсвечиваются?
2. Каким компилятором 'C' пользуетесь?
3. Какой режим щины данных ЖКИ используете (8-ми битный/4-х битный)?
AVR
Цитата(BVU @ Feb 2 2006, 14:44) *
Брак ЖКИ думаю, что маловероятен.
...
Задаю попутно вопросы:
1. При регулировании контрастности у индикатора 'позиции' всех строк подсвечиваются?
2. Каким компилятором 'C' пользуетесь?
3. Какой режим щины данных ЖКИ используете (8-ми битный/4-х битный)?

1) Самое странное, что при регулировке контрастности сначала "перенасыщается" одна пара строк через одну, затем только вторая пара доходит до полной засветки.
Является ли это признаком брака, что если регулируем контрастность яркость меняется у всех строк неодновременно? Причем даже если полностью засвечивается одна пара строк и на ней уже не разглядеть еткст, то на второй он не появляется вовсе и так до полной засветки.
2) IAR C/C++ Compiler for AVR 4.11A/W32 [Evaluation] (4.11.1.3)
3) 8-ми битный.
BVU
Цитата(AVR @ Feb 2 2006, 21:34) *
1) Самое странное, что при регулировке контрастности сначала "перенасыщается" одна пара строк через одну, затем только вторая пара доходит до полной засветки.
Является ли это признаком брака, что если регулируем контрастность яркость меняется у всех строк неодновременно? Причем даже если полностью засвечивается одна пара строк и на ней уже не разглядеть еткст, то на второй он не появляется вовсе и так до полной засветки.

Не выполнена инициализация дисплея... sad.gif .
Должно быть так, как того рекомендует Bolymin:
void LCD_init(void)
{
PORTB = STROB_DOWN;
PORTB = RS_COMAND;
PORTD = WRITE_LCD;
DelayMs(20);
PORTB = (DATA_IO_LCD | 0x03); // To establish word length of the interface
LCD_strobe();
DelayMs(5);
LCD_strobe();
DelayUs(120);
LCD_write_comand(0x38); // 8 bit mode, 2/20 duty, 5x8 font
LCD_write_comand(0x08); // display off
LCD_write_comand(0x0C); // display on, blink curson off
LCD_write_comand(0x06); // entry mode
}
Цитата(AVR @ Feb 2 2006, 21:34) *
2) IAR C/C++ Compiler for AVR 4.11A/W32 [Evaluation] (4.11.1.3)

Адаптируйте параметры своей тактовой састоты для функций задержки:
#define ClkFreq ..... <- частота кварцевого резонатора или частота внешнего или внутреннего генератора (смотря, что используется).
Цитата(AVR @ Feb 2 2006, 21:34) *
3) 8-ми битный.

Параметр установки поправлен для Вашего 8-ми битного режима: 0x38 (DL=1):
LCD_write_comand(0x38); // 8 bit mode, 2/20 duty, 5x8 font
AVR
BVU, огромнейшее Вам спасибо!
Вы были изначально правы, предположив что я недоинициализировал ЖКИ. Именно в этом и была проблема.
BVU
Цитата(AVR @ Feb 7 2006, 00:08) *
BVU, огромнейшее Вам спасибо!
Вы были изначально правы, предположив что я недоинициализировал ЖКИ. Именно в этом и была проблема.

You are welcome!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.