реклама на сайте
подробности

 
 
> Помогите разобраться с символьным ЖКИ, HD44780
Pavel V.
сообщение Feb 20 2007, 10:49
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Уже второй день пытаюсь оживить символьный ЖКИ под IAR. До этого момента использовал CodeVision и встроенную в него библиотеку, которая всегда работала как часы.

С IAR пришлось разбираться второпях, до этого с ним дела не имел.

Нашел кучу исходников библиотек для работы с HD44780, но толком ни одна так и не заработала. Пришлось разбираться самому, в результате чего была создана некая компиляция из кусков разных библиотек.

Она даже заработала и стала выводить на дисплей данные. Но радость моя была недолгая - программа работает крайне нестабильно. То все нормально, то выводится куча левых символов без какой-либо закономерности.

С железом это никак не может быть связано - с CodeVision все работало хорошо.

Много игрался с задержками, думал из-за них, но они как будто не влияют на этот глюк.

К сообщению прицепляю код, помогите, пожалуйста, разобраться! Или, быть может, у кого-то есть готовая библиотека для работы с этими ЖКИ?

Контроллер - ATmega48, частота 1 МГц.

Сообщение отредактировал Pavel V. - Feb 20 2007, 10:52
Прикрепленные файлы
Прикрепленный файл  main.txt ( 303 байт ) Кол-во скачиваний: 105
Прикрепленный файл  lcd.txt ( 4.59 килобайт ) Кол-во скачиваний: 162
 


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Feb 20 2007, 11:35
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Pavel V. @ Feb 20 2007, 09:49) *
К сообщению прицепляю код, помогите, пожалуйста, разобраться! Или, быть может, у кого-то есть готовая библиотека для работы с этими ЖКИ?
На первый взгляд больших "плюх" не видно, кроме задержек в инициализации - обратите на них пристальное внимание. Но есть недочеты:
Код
void LcdWriteNibble (unsigned char a)
{
E=0;   // эта команда не нужна - после выполнения любой команды у вас E возвращается в 0.
delay_us(2);  // не нужно
LCDPORT&=0x0f;
LCDPORT|=(a&0xf0);
delay_us(2); // не нужно
E=1;
delay_us(2); // не нужно
E=0;
delay_us(2); // не нужно.
}              

void WaitBusy (void)
{
delay_us(300);   // достаточно 40 мкс.
}  

void LcdWriteCommand (unsigned char a)
{
E=0;    // эта команда не нужна - см. LcdWriteNibble(), в LcdWriteData то же самое.
RS=0;    
LcdWriteNibble(a);
LcdWriteNibble(a<<4);
WaitBusy();
}

void LcdInit (unsigned char a)
{
   LCDDDR = 0xFF; //3F
   LCDPORT = 0x00;  
   E=0;             // это не нужно - вы его сбросили предыдущей командой.
   RS=0;           // аналогично
  delay_ms(20);  // здесь надо примерно 200 мс
  LcdWriteNibble(0x30);
  delay_ms(7);    // здесь надо 50 мс минимум
  LcdWriteNibble(0x30);
  delay_us(200); // здесь надо 50 мс минимум
  LcdWriteNibble(0x30);  
  WaitBusy();     // здесь уже можно 200 мкс
  LcdWriteNibble(0x20); // это лишнее - см. следующую команду
  WaitBusy();                  
  if (a==1) LcdWriteCommand(0x20);
  else LcdWriteCommand(0x28);
  LcdWriteCommand(0x08);
  LcdWriteCommand(0x01);
  delay_ms(30); // предыдущая команда исполняется 1.6мс максимум
  LcdWriteCommand(0x06);
  LcdWriteCommand(0x0c);
  delay_ms(30); // предыдущая команда исполняется 40 мкс, дополнительная задержка не нужна.
}

И подумайте - надо ли вам передавать параметр в эту функцию? Вы по ходу выполнения программы будете его менять? Если нет, напишите две функции инициализации и вызывайте нужную в конкретном проекте - зачем вам лишний код в рабочей программе?

В общем видно, что вы надергали код из разных библиотек не разбираясь. Посмотрите, у вас void tlcd_write_byte() делает то же самое, что и LcdWriteCommand(), LcdWriteData().


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016