Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по LCD и CodeVision
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Рома_С
У меня есть два вопроса

Первый он же главный.
Подскажите пожалуйста, как с помощью CodeVision можно создать, записать в память дисплея и потом прочитать с памяти собственный символ для HD44780 совместимых ЖКИ?

Второй.
Есть ли еще команды для роботы с ЖКИ в CodeVision кроме стандартных в lcd.h, если есть, то как их можно использовать в том же CodeVision (синтаксис команды или функции)?

Заранее благодарен.
Яrik
Цитата(Рома_С @ Feb 16 2007, 22:01) *
У меня есть два вопроса

Первый он же главный.
Подскажите пожалуйста, как с помощью CodeVision можно создать, записать в память дисплея и потом прочитать с памяти собственный символ для HD44780 совместимых ЖКИ?

Второй.
Есть ли еще команды для роботы с ЖКИ в CodeVision кроме стандартных в lcd.h, если есть, то как их можно использовать в том же CodeVision (синтаксис команды или функции)?

Заранее благодарен.

Глянь тему в верху страници "! Исходники программ и библиотек", там вроде есть библиотеки для работы с HD44780 biggrin.gif . Может что-то подойдет!!!!!!!
Artur Nikitin
Цитата(Рома_С @ Feb 16 2007, 23:01) *
...как с помощью CodeVision можно создать, записать в память дисплея и потом прочитать с памяти собственный символ для HD44780 совместимых ЖКИ?

http://www.atmel.ru/Spec/LCD.htm
тут информация для AVR
vooon
Цитата(Рома_С @ Feb 16 2007, 23:01) *
У меня есть два вопроса

Первый он же главный.
Подскажите пожалуйста, как с помощью CodeVision можно создать, записать в память дисплея и потом прочитать с памяти собственный символ для HD44780 совместимых ЖКИ?

вот как писать символ (прям из хелпа)
чтение никогда не делал, поэтому на вторую часть вопроса не отвечу smile.gif
(кстати здесь: http://nix-06.nm.ru/Programma/hd/hd_js.html можете найти мою програмку чтобы удобно рисовать их smile.gif )
Код
/* table for the user defined character
** arrow that points to the top right corner
**/
flash unsigned char    lcd_cg[] = {
    /* .....
    ** .####
    ** ...##
    ** ..#.#
    ** .#..#
    ** #....
    ** .....
    ** .....
    */
     0, 15, 3, 5, 9, 16, 0, 0
}

// function used to define user characters
void define_char(byte flash *pc, byte char_code)
{
  unsigned char i, a;
  a = (char_code << 3) | 0x40;
  for (i = 0; i < 8; i++)
  {
    lcd_write_byte(a++, *pc++);
  }
}

Цитата
Второй.
Есть ли еще команды для роботы с ЖКИ в CodeVision кроме стандартных в lcd.h, если есть, то как их можно использовать в том же CodeVision (синтаксис команды или функции)?

Заранее благодарен.

доп функций нет

очень удобно использовать
#pragma rl+
#pragma rl-

для вывода русского текста
Рома_С
О спасибо всем, очень помогли ваши советы. Что самое интересно что в хелпе на сvavr как и показал vooon есть пример:

/* table for the user defined character
arrow that points to the top right corner */
flash byte char0[8]={
0b0000000,
0b0001111,
0b0000011,
0b0000101,
0b0001001,
0b0010000,
0b0100000,

0b1000000};

/* function used to define user characters */
void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}



но он както так непонятно (тогда был) написан или я чтото недопонимаю но после ваших советов, стало все так красиво получатся, и я смог даже отобразить курсор с его разными формами (их вроде там три).

И что означают вот ети две строчки функции define_char

a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);

если можно поподробней.


А сейчас я поставил себе задачу, вывести на экран бегущую строку тобишь есть строка символов которая имеет допустим 50 символов то ее нужно вывести на дисплей имеющий 20 символов в строке.

Кстати написал я вот такой код то, что первое пришло наум и явно чтото не здравое
Вот

int i;
char s[12]="Hello world";
.......
for(i=0;i<=19;i++)
{
delay_ms(500);
lcd_gotoxy(i,0);
lcd_puts(s);
}
........

и он мне нормально сдвигал строку пока символ d не дошел до края дисплея, а потом с начала нижней строки стали отображаться исчезнувшие символы верхней строки. Почему? Я подумал что строка должна просто себе исчезать по мере продвижения.

Подскажите что я сделал не так, помогите пожалуйста ссылками или советами по поводу бегущей строки символов по строке дисплея. И как все это можна организовать на CodeVisionAVR

Вот еще, дисплей у меня 4х20

Заранее благодарен.
vooon
Цитата(Рома_С @ Mar 1 2007, 00:04) *
И что означают вот ети две строчки функции define_char

a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);

если можно поподробней.


А сейчас я поставил себе задачу, вывести на экран бегущую строку тобишь есть строка символов которая имеет допустим 50 символов то ее нужно вывести на дисплей имеющий 20 символов в строке.

посмотрите http://electronix.ru/forum/index.php?s=&am...st&p=129947 smile.gif

a - это адрес куда будем писать, у 44780 есть две области памяти знакогенератор и данные, отображаемые на экране
адрес первой ячейки знакогенератора 0x40, а данных - 0x80
на каждый _свой_ символ нужно 8 байт (т. е. для символа 0 это 0x40 - 0x47, соответственно для 1ого 0x48 - 0x4F, и т.д.)
это делаем сдвигом номера символа на 3 влево, и побитное или с 0х40.

далее в цикле записываем 8 значений из массива переданного через указатель pc


Ах да! забыл сказать:

у 44780 данные разделены на две строки по 40 байт
у двухстрочных для удобства первая строка это первая smile.gif , а вторая - вторая
Но у четырехстрочных первая строка в озу отображается на 1ой и 3ей(!) строках
а вторая строка в озу - на 2ой и 4ой

надеюсь понятно написал rolleyes.gif
Рома_С
Цитата(vooon @ Mar 1 2007, 00:09) *
a - это адрес куда будем писать, у 44780 есть две области памяти знакогенератор и данные, отображаемые на экране
адрес первой ячейки знакогенератора 0x40, а данных - 0x80
на каждый _свой_ символ нужно 8 байт (т. е. для символа 0 это 0x40 - 0x47, соответственно для 1ого 0x48 - 0x4F, и т.д.)
это делаем сдвигом номера символа на 3 влево, и побитное или с 0х40.

далее в цикле записываем 8 значений из массива переданного через указатель pc


Спасибо конечно за ответ, но если чесно я еще болие запутался. huh.gif Почему мы сдвигаем номер символа именно на 3. А номер символа это что? А где можно про это поподробней прочитать? Уж больно интересно узнать принципы создания символа.

Извините меня пожалуйста за мои, возможно, ламерские вопросы.
Сергей Борщ
Цитата(Рома_С @ Mar 1 2007, 21:25) *
Почему мы сдвигаем номер символа именно на 3.
Потому что сдвиг на три в двоичной системе это умножение на два в третьей, т.е на восемь.
Цитата(Рома_С @ Mar 1 2007, 21:25) *
А номер символа это что?
Это адрес начала образа символа в знакогенераторе.
Цитата(Рома_С @ Mar 1 2007, 21:25) *
А где можно про это поподробней прочитать?
В даташите на контроллер HD44780, погуглите, их (даташитов) много в сети и они отличаются. Попадаются довольно подробные.
vooon
Цитата(Рома_С @ Mar 1 2007, 22:25) *
А где можно про это поподробней прочитать? Уж больно интересно узнать принципы создания символа.


вот гляньте, достаточно полное описание http://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm
Сергей Борщ
Цитата(vooon @ Mar 1 2007, 23:27) *
вот гляньте, достаточно полное описание http://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm
Я тоже хотел кинуть эту ссылку, но бегло просмотрев ее понял, что как раз про программирование знакогенератора там практически ничего нет.
vooon
Цитата(Сергей Борщ @ Mar 2 2007, 14:40) *
... про программирование знакогенератора там практически ничего нет.


а впринципе про программирование знакогенератора
нужно знать совсем чуть-чуть smile.gif

при шрифте 5х8 (самый распространный)
образ состоит из 8и байт, в которых используются с 0ого по 4ый биты; 1 - черная точка, 0 - прозрачная
8ой байт обычно не отображается.

номера символов: с 0 по 7ой (чтобы вывести символ 0 придется писать lcd_putchar() , т.к. 0 "обрубит" строку)

вот полное описание от хитачи http://www.atmel.ru/Spec/HD44780.pdf

PS: если что-то непонятно всеравно можно воспользоваться http://vooon.narod.ru/test/hd/index.html?&...62=16&c63=0
я ей пользуюсь постоянно(когда в проекте есть 44780)
Wano
Люди ohmy.gif те кто будет пробовать использовать стандартные библиотеки для работы с I2C и LCD под CodeVision!!!!!
Во первых I2C полный отстой по времени работы,пишите свои функции на асме(вставки) увидите реальный прирост скорости.
Во вторых функции работы с LCD глючны!! Не используйте их.Мной проверены они на 4433 и на меги8
блин виснет нафиг проц минут через 15-10.Они также очень тормозные.
Возьмите сядьте и напишите свои функции. Просто очень хочется огородить начинающих,когда проц
будет виснуть и не будешь знать из-за чего.
Я переписал нужные мне функции под I2C и LCD гонял их непрерывно - всё работало как часы.
Ну а может просто версия у меня старая CodeVision 1.24 щас свежее есть.
vooon
Цитата(Wano @ Mar 5 2007, 21:27) *
Во вторых функции работы с LCD глючны!! Не используйте их.Мной проверены они на 4433 и на меги8
блин виснет нафиг проц минут через 15-10.Они также очень тормозные.


возможно вам попался плохо вылеченный CV. устройство на М8 нормально работает круглые сутки почти пол года - проблем нет
скомпилен был CV 1.24.8b
возможно конечно что вы пользовались ф-цией srintf() она действительно может виснуть при некоторых настройках.
I2C CV не пользую - зачем, когда есть TWI wink.gif
Petka
Цитата(Wano @ Mar 5 2007, 21:27) *
Люди ohmy.gif те кто будет пробовать использовать стандартные библиотеки для работы с I2C и LCD под CodeVision!!!!!
Во первых I2C полный отстой по времени работы,пишите свои функции на асме(вставки) увидите реальный прирост скорости.
Во вторых функции работы с LCD глючны!! Не используйте их.Мной проверены они на 4433 и на меги8
блин виснет нафиг проц минут через 15-10.Они также очень тормозные.
Возьмите сядьте и напишите свои функции. Просто очень хочется огородить начинающих,когда проц
будет виснуть и не будешь знать из-за чего.
Я переписал нужные мне функции под I2C и LCD гонял их непрерывно - всё работало как часы.
Ну а может просто версия у меня старая CodeVision 1.24 щас свежее есть.


Если у Вас не получилось нормально работать с библиотечными функциями это не значит что они плохие... Они вполне рабочие. Использовал и LCD и I2C (програмную и аппаратные реализации). Всё работало. Кроме того не забывайте внимательно читать help, man, faq, и смотреть examples.

Напомню: в каталоге lib находятся исходики библиотечных функций. Если Вы считаете что там есть ошибки, то покажите пожалуйста их общественности.
Wano
Кароче товарищи жаль что нельзя с вами поспорить.Хотя через всю Россию буду ехать скоро,пиво могу поставить biggrin.gif .
Давайте не будем переходить на личности.Могу скинуть версию 1.24 на мыло,оставьте ссылочку кто может ответить за свои слова.
Для перерисовки используйте функцию clear,буквально код инит-адрес-строка-стереть и покругу,ну задержечка ещё для приличия.
Если он у вас не повиснет - я дурак чистосердечно признаюсь. Если он у вас повиснет,я думаю просто мы помолчим.Могу так же заслать свою функцию,что пашет как часики.100% помню что вешается первой функция стирания экрана. Чем чаще она используется тем быстрей повисон.Второй по глюкам сама функция вывода. Я уже мегагерцовый кварц ставил,сначало думал,что что-то в моей проге.Второе устройство собрал - стабилизатор тока для машинного аккомулятора.Думал помеха пробивается,поставил операционник - виснет. Отцепил вообще всё,что можно от контроллера кроме экрана - виснет.Стёр весь код обработки АЦП - виснет.
Поверьте, когда со злости готов разбить устройство,это уж точно не неумение использовать функции и настройки,это просто безызсходность. Я когда просёк фишку матюкался до небес.
Ну и на счёт I2C кто скажет что они работают быстро,значит такой вы прогер.Я хоть и самоучка но всё можно сделать гараздо быстрее.
Проверено с 24-й памятью на I2C.
Более подробно отвечу,правдо щас у предков,а тут у меня тока одна платка на ARM.
Как до дому доберусь распишу про LCD и I2C. На жестком диске тока код остался.
megachip
Использую 1.24.6, никаких проблем с библиотекой LCD нет.
Wano
Киньте на ksotпсюкlist.ru свою версию,я посравниваю код,что генерится.
Рома_С
Ну, наконец то разобрался я с вот этой функцией.

void define_char(byte flash *pc, byte char_code)
{
unsigned char i, a;
a = (char_code << 3) | 0x40;
for (i = 0; i < 8; i++)
{
lcd_write_byte(a++, *pc++);
}
}

Что есть что и что это там все означает. Правда пришлось попутно разобраться с байтовым сдвигом, что имено и на что сдвигается blink.gif biggrin.gif. Интересует меня такой вопрос, сколько можно собственных символов записать в CG RAM дисплея, 8 или же 16 символов? По идеи должно быть 16, это ячейки с 0х00 по 0х0F или же я ошибаюсь?

Спасибо за советы.
vooon
Цитата
сколько можно собственных символов записать в CG RAM дисплея, 8 или же 16 символов?


8, т.к. обьем CGRAM 64 байта ( 64/8=8 smile.gif )
символы 0x00 - 0x07
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.