Графический ЖК дисплей на LC7981
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Графический ЖК дисплей на LC7981
Есть ЖК индикатор WG160160B с контроллером LC7981. Но в процессе работы появились трудности... Если в занковом режиме выставить не 20 8-и битных символов, а меньше, то начинаются глюки. Либо искажается изображение, либо 2-3 столбца в середине сдвигаются на строчку в низ. В графическом режиме примерно тоже самое, при переходе на вторую половину экрана, в случае <20 символов при 8-битах данных или при 6-7 битах практически всегда, выводится белиберда.
Встречался кто-нибудь с подобной проблемой? как ее можно решить?
Встречался кто-нибудь с подобной проблемой? как ее можно решить?
- Реклама
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
- Mozart
- Мучитель микросхем
- Сообщения: 413
- Зарегистрирован: Пт мар 10, 2006 12:23:05
- Откуда: Moscow
- Контактная информация:
вообще я работал с ЖК но не с таким. в доку не вникал но вопрос
1. надо устанавливать курсор начало вывода знака? (просто может для каждой строчки надо устанавливать принудительно)
2. потом когда выводите что-то надо указывать границы знака? (я имею ввиду активную область в которой будете рисовать знак или ещё что-то)
3. одна строчка выводится не смещается?
1. надо устанавливать курсор начало вывода знака? (просто может для каждой строчки надо устанавливать принудительно)
2. потом когда выводите что-то надо указывать границы знака? (я имею ввиду активную область в которой будете рисовать знак или ещё что-то)
3. одна строчка выводится не смещается?
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
1. В графическом режиме перед выводом каждого байта на дисплей в программе выстанавливал курсор. В знаковом просто писал данные, в LC7981 идет автоинкремент индекса.Mozart писал(а):вообще я работал с ЖК но не с таким. в доку не вникал но вопрос
1. надо устанавливать курсор начало вывода знака? (просто может для каждой строчки надо устанавливать принудительно)
2. потом когда выводите что-то надо указывать границы знака? (я имею ввиду активную область в которой будете рисовать знак или ещё что-то)
3. одна строчка выводится не смещается?
2. Границы задаются при инициализации.
3. Смещается.
У данного ЖК (или точнее у его контроллера LC7981), есть следующие настройки для графического режима: кол-во значащих бит в байте Hp, кол-во знаков по горизонтали Hn. Т.е. по идее общее кол-во используемых точек в строке: Hn*Hp.
В моем случае, если 80<Hn*Hp<160 , то информация выводится на весь экран, т.е. 160 точек. При этом часть информации выводится со сдвигом по горизонтали, а часть еще и сдвигается на строку по вертикали. Если же 0<Hn*Hp<80, то все то же самое, но только на левой половине экрана.
Мои выводы:
данный ЖК просто не поддерживает всех возможностей своего контроллера и работает только при режиме 80 или 160 точек в строке.
Кстати, в знаковом режиме при настройке использования неполной строки наблюдались те-же искажения.
- Реклама
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
По описанию на микросхему ширина знака может быть: 6-8 точек. У меня нормально ЖК запустился только при 8.Mozart писал(а):попробуйте по одному символу выводить, мможет быть надо принудительно задавать положение курсора.
ширина знака какая? и какая ширина экрана?
а ещё вопрос строка смещается вниз я правильно понял?
В том то и дело что не вся строка смещается вниз, а около 20-30 точек в середине экрана. Этот эффект проявляется с 1-ой строки.
Дисплей 160 на 160 точек.
Пример 1.
Экран в знаковом режиме, 8 точек на знак по горизонтали, 10 по вертикали. Вывожу "8" в любую позицию, все в норме.
Пример 2.
Экран в знаковом режиме, 7 точек на знак по горизонтали, 10 по вертикали. Вывожу "8" в 19 позицию первой строки. На экране появляются ДВЕ восьмерки. Первая на '21' позиции, примерно там где отобразилась бы в случае 8-и битного знака. Вторая на ~14 позиции, и смещена на 1 строку вниз ( см. рисунок). Откуда это взялось то?!
- Вложения
-
- LC7981.jpg
- (3.09 КБ) 893 скачивания
- Mozart
- Мучитель микросхем
- Сообщения: 413
- Зарегистрирован: Пт мар 10, 2006 12:23:05
- Откуда: Moscow
- Контактная информация:
исходник в студию!!!...Откуда это взялось то?!
первое мог накосячить с выводом, второе посмотри errata на проц, может там что-то пишут, третье два символа рядом что ли не выводятся??
попробуй принудительно указать адрес с которого будет выводиться символ.
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Исходник кинул. Упростил до минимума: настройка портов, инициализация ЖК, вывод 1 символа. Проблема не исчезла.Mozart писал(а):исходник в студию!!!...Откуда это взялось то?!
первое мог накосячить с выводом, второе посмотри errata на проц, может там что-то пишут, третье два символа рядом что ли не выводятся??
попробуй принудительно указать адрес с которого будет выводиться символ.
Символы дублируются на экране, со смещением по вертикали.
Ошибся с выводом? Дак дело в том что при 8-и битном режиме все норм, меняю в настройках режима ЖК ширину знака (dNumPoint) и начинаются проблемы.
Errata на LC7981 не встречал.
На сайте производителя ЖК есть только pdf на контроллер, никаких дополнительный сведений.
- Вложения
-
- main.c
- (2.68 КБ) 598 скачиваний
- Mozart
- Мучитель микросхем
- Сообщения: 413
- Зарегистрирован: Пт мар 10, 2006 12:23:05
- Откуда: Moscow
- Контактная информация:
если не секрет какой компилятор пользуете??
это для удобства...
и ещё перепишите функцию ReadBusy
и следовательно если вы её будете вызывать без While!!!
это для удобства...
Код: Выделить всё
#define dWriteRegCom(byte) ({
PORTC = 0x08; \
_NOP(); \
PORTC |= 0x02; \
_NOP(); \
DDRD=0xFF; \
PORTD=byte; \
_NOP(); \
_NOP(); \
_NOP(); \
_NOP(); \
PORTC&=0xFD; \
_NOP(); \
PORTC=0x04; \
DDRD=0x00; \
PORTD=0x00; \
})Код: Выделить всё
void ReadBusy(void)
{
unsigned char busy = 0x00;
while (busy)
{
PORTC=0x09;
_NOP();
SetBit(PORTC,E);
_NOP();
_NOP();
//tt=PIND>>7;
busy = PIND & 0x80;
// if (PIND & (1 << 7))
// {
// busy = 0x00;
// }
PORTC=0x04;
}
}
Последний раз редактировалось Mozart Вт июл 29, 2008 09:44:21, всего редактировалось 1 раз.
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Mozart писал(а):и следовательно если вы её будете вызывать без While!!!Код: Выделить всё
void ReadBusy(void) { unsigned char busy = 0x00; while (busy) { PORTC=0x09; _NOP(); SetBit(PORTC,E); _NOP(); _NOP(); //tt=PIND>>7; busy = PIND & 0x80; // if (PIND & (1 << 7)) // { // busy = 0x00; // } PORTC=0x04; } }
- Mozart
- Мучитель микросхем
- Сообщения: 413
- Зарегистрирован: Пт мар 10, 2006 12:23:05
- Откуда: Moscow
- Контактная информация:
дык... никто бизи туда и не посылает...
я так понял из вашего кода, что он устанавливается на 8 ногу порта Д,
вот в теле вайл и происходит ожидание этого сигнала, если вы внимательно посмотрите.
потом, почему я прицепился к этому?... потому что из-за того что проц не готов принять комманду или данные он её просто игнорирует или искажает...
я так понял из вашего кода, что он устанавливается на 8 ногу порта Д,
Код: Выделить всё
tt=PIND>>7;потом, почему я прицепился к этому?... потому что из-за того что проц не готов принять комманду или данные он её просто игнорирует или искажает...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
- Mozart
- Мучитель микросхем
- Сообщения: 413
- Зарегистрирован: Пт мар 10, 2006 12:23:05
- Откуда: Moscow
- Контактная информация:
ну не совсем причёчывание программы... у мну просто нету ваше железки... вы попробовали с бизи???
попробуйте ещё задержку между выводами знаков поставить...
ибо если у вас выводится один размер нормально (меньший я так понял) а другой нет (больший) то просто контроллер не успевает
попробуйте ещё задержку между выводами знаков поставить...
ибо если у вас выводится один размер нормально (меньший я так понял) а другой нет (больший) то просто контроллер не успевает
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Задержка между знаками? дак в выложенной программе на экран послывается всего 1 знак и норм. выводится только в 8-и битном режиме.Mozart писал(а): вы попробовали с бизи???
попробуйте ещё задержку между выводами знаков поставить...
Функция считывания флага работает и работала раньше. Так что грешить на неуспевание не стоит.
- Mozart
- Мучитель микросхем
- Сообщения: 413
- Зарегистрирован: Пт мар 10, 2006 12:23:05
- Откуда: Moscow
- Контактная информация:
первое не правильно всё таки пишите... во втором примере что-то нарушается, проверьте длительности, посмотрите осциллографом, возьмите другой ЖК, может этот вам глючный попался (что врятли).Пример 1.
Экран в знаковом режиме, 8 точек на знак по горизонтали, 10 по вертикали. Вывожу "8" в любую позицию, все в норме.
Пример 2.
Экран в знаковом режиме, 7 точек на знак по горизонтали, 10 по вертикали. Вывожу "8" в 19 позицию первой строки. На экране появляются ДВЕ восьмерки. Первая на '21' позиции, примерно там где отобразилась бы в случае 8-и битного знака. Вторая на ~14 позиции, и смещена на 1 строку вниз ( см. рисунок). Откуда это взялось то?!
может быть вообще по другому писать надо для второго примера...
з.ы. чудеса бывают, но редко.
з.з.ы. даташит я не смотрел...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!


