Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LCD, помогите разобратся 
:(
    Опции темы
goodking
Дата 16.11.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Не могу разобратся с LCD, постоянно горит только верхняя строка, которая при запуске программы слегка гаснет, и больше никаких изменений  smile  вот код, может в нем что-то неправильно 
Код
#include "c8051F120.h"
#include <string.h>

sbit LCD_rs=P7^4;
sbit LCD_rw=P7^2;
sbit LCD_en=P7^0;
#define LCD_data P6

void Port_IO_Init(void);
void LCD_init(void);
void LCD_command(unsigned char var);
void LCD_busy(void);
void LCD_senddata(unsigned char var);
void LCD_sendstring(unsigned char *var);
void LCD_build();
unsigned char Mas[40];

 void main (void)
  {
    int i;
    
    WDTCN     = 0xDE;
    WDTCN     = 0xAD;
    Port_IO_Init();
    LCD_init ();
    LCD_build();
    for(i =0;i<35;i++) Mas[i] = 0;
    strcpy(Mas,"0123456789ABCDEFGHJKL");
   LCD_sendstring (Mas);
   while (1) {};
  
   }
   
  void Port_IO_Init(void)
{
    SFRPAGE   = CONFIG_PAGE;
    P6MDOUT   = 0xFF;
    P7MDOUT   = 0x15;
    XBR2      = 0xC0;

}


void LCD_init(void)
{LCD_data = 0x38;// 2 линии 8 бит 5х8 точек
 LCD_rs = 0;// обработка данных как инструкций
 LCD_rw = 0; // запись данных в ЖКИ
 LCD_en = 1;
 LCD_en = 0;
 LCD_busy(); //пауза для обработки команд
 LCD_data = 0x0F;//включить дисплей, курсор
 LCD_rs  = 0;
 LCD_rw = 0;
 LCD_en = 1;
 LCD_en = 0;
 LCD_busy();
 LCD_data = 0x01;
 LCD_rs = 0;
 LCD_rw = 0;
 LCD_en = 1;
 LCD_en = 0;
 LCD_busy();
 LCD_data = 0x06;//режим введения авто увиличение без сдвига
 LCD_rs = 0;
 LCD_rw = 0;
 LCD_en = 1;
 LCD_busy();

}

void LCD_busy()
{unsigned char i,j; 
for(i=0;i<50;i++) //A simple for loop for delay 
for(j=0;j<255;j++);
}
void LCD_command(unsigned char var)
{
 LCD_data = var;
 LCD_rs = 0;
 LCD_rw = 0;
 LCD_en = 1;
 LCD_en = 0;
 LCD_busy();
}
void LCD_sendstring(unsigned char *var)
{ while(*var) //till string ends 
LCD_senddata(*var++); //send characters one by one 
}

void LCD_build()
{
LCD_command(0x48); //Load the location where we want to store 
LCD_senddata(0x32); //Load row 1 data 
LCD_senddata(0x0E); //Load row 2 data 
LCD_senddata(0x0E); //Load row 3 data 
LCD_senddata(0x0E); //Load row 4 data 
LCD_senddata(0x1F); //Load row 5 data 
LCD_senddata(0x00); //Load row 6 data 
LCD_senddata(0x04); //Load row 7 data 
LCD_senddata(0x00); //Load row
}



void LCD_senddata(unsigned char var)
{
 LCD_data = var;
 LCD_rs = 1;
 LCD_rw = 0;
 LCD_en = 1;
 LCD_en = 0;
 LCD_busy();
}

 

Это сообщение отредактировал(а) goodking - 19.11.2009, 14:42
PM MAIL   Вверх
Dreamer_0x01
Дата 19.11.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 12



Цитата(goodking @  16.11.2009,  14:47 Найти цитируемый пост)
постоянно горит только верхняя строка, которая при запуске программы слегка гаснет, и больше никаких изменений


Без описания дисплея (а в данном случае, судя по коду - контроллера дисплея) понять трудно.
Но очень похоже, что не проходит инициализация. 
Горящая верхняя строка как правило означает, что контроллер не получил нужную инициализацию.



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
goodking
Дата 19.11.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Цитата(Dreamer_0x01 @ 19.11.2009,  12:25)
Цитата(goodking @  16.11.2009,  14:47 Найти цитируемый пост)
постоянно горит только верхняя строка, которая при запуске программы слегка гаснет, и больше никаких изменений


Без описания дисплея (а в данном случае, судя по коду - контроллера дисплея) понять трудно.
Но очень похоже, что не проходит инициализация. 
Горящая верхняя строка как правило означает, что контроллер не получил нужную инициализацию.

Микроконтроллер SiLabs C8051F120, индикатор PYC1602AHW-SYL  вот ссылка на данные по ЖКИ http://zefiryn.tme.pl/dok/a06/pyc1602a-series-1.pdf, то-есть из-за неправильной инициализации он вообще никак не реагирует??

Это сообщение отредактировал(а) goodking - 19.11.2009, 14:40
PM MAIL   Вверх
Dreamer_0x01
Дата 19.11.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 12



Цитата(goodking @  19.11.2009,  14:29 Найти цитируемый пост)
то-есть из-за неправильной инициализации он вообще никак не реагирует??


ИМХО, да.

Попробуйте вместо фиксированной задержки между командами ожидать влаг busy. В моем случае это помогло.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
goodking
Дата 20.11.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Цитата(Dreamer_0x01 @ 19.11.2009,  19:01)
Цитата(goodking @  19.11.2009,  14:29 Найти цитируемый пост)
то-есть из-за неправильной инициализации он вообще никак не реагирует??


ИМХО, да.

Попробуйте вместо фиксированной задержки между командами ожидать влаг busy. В моем случае это помогло.

Я попробовал вот так, как Вы посоветовали 
Код

void LCD_busy()
{LCD_D7 = 1; 
 LCD_en = 1;
 LCD_rs = 0; 
 LCD_rw = 1;
while(LCD_D7){
LCD_en = 0; 
LCD_en = 1;}


  
но программа почему-то не выходит из while 

PM MAIL   Вверх
goodking
Дата 20.11.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



И еще вопрос- правильно-ли при программировании ЖКИ устанавливать порты в режим push-pull?
PM MAIL   Вверх
Dreamer_0x01
Дата 30.11.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 12



Цитата

но программа почему-то не выходит из while

Значит, берем в зубы осциллограф и смотрим, что происходит на этой ноге. (да и на остальных тоже).

Извиняюсь, что сразу не ответил - неделю отсутствовал.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Eleman
Дата 30.11.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.11.2009
Где: Россия , Тверь

Репутация: нет
Всего: нет



Привет !!  Если система команд совместима с   HD44780   инициализируй :


 WriteNibble(0x33);
  WriteNibble(0x33);
  WriteNibble(0x33);
  WriteNibble(0x22);
  WriteByte(0xef);
  WriteByte(0x01);
  WriteByte(0x10);
  WriteByte(0x06);
  WriteByte(0x0C); так инициализирована  одна строка 

WriteNibble(0x33);
  WriteNibble(0x33);
  WriteNibble(0x33);
  WriteNibble(0x22);
  WriteByte(0xef);
  WriteByte(0x01);
  WriteByte(0x10);
  WriteByte(0x06);
  WriteByte(0x0C);
  WriteByte(0x28); так  обе

Добавлено через 4 минуты и 18 секунд
кстати в документации так и написано .
PM MAIL ICQ Skype   Вверх
Dreamer_0x01
Дата 1.12.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 12



Посмотрел свой код, у меня действительно задержка делается на опросе флага, но это уже ПОСЛЕ тройной инициализации (именно тройной),причем у меня между первой и второй инициализацией задержка порядка 100 мс, а между втророй  и третьей - 300. Как и почему их подбирал - не помню. В самой инициализации стоит принудительная задержка 100 мс. 
Почему именно тройная инициализация нужна, тоже не помню, но Eleman дело говорит. 

Прикладываю файлик из рабочего проекта, в упор не помню, какой там был контроллер дисплея, но по командам очень похожий на Ваш.
Это примерчик из отладочной платы Embedded Artist для процессора lpc2148, немного мною переработанный (переработана как раз инициализация и задержка по флагу). 



Это сообщение отредактировал(а) Dreamer_0x01 - 1.12.2009, 11:47

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  lcd.c 8,14 Kb


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
goodking
Дата 7.12.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Eleman
Dreamer_0x01, Спасибо!! Проблема именно с инициализацией, сейчас разбираюсь! Еще такой вопрос: хватает ли напряжения на портах  для работы логики ЖКИ, или нужно подключать подтягивающие резисторы?
PM MAIL   Вверх
Dreamer_0x01
Дата 7.12.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 12



Цитата(goodking @  7.12.2009,  11:05 Найти цитируемый пост)
Еще такой вопрос: хватает ли напряжения на портах  для работы логики ЖКИ, или нужно подключать подтягивающие резисторы?


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


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
goodking
Дата 7.12.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Значит не проходит init 

Вот написал, с учетом Ваших советов, все-равно не проходит 
Код
void LCD_init() 
{
delay();
LCD_data = 0x30;
LCD_rs = 0;
LCD_rw = 0;
LCD_en = 1;
delay ();
LCD_en = 0;
delay ();
LCD_data = 0x30;
LCD_rs = 0;
LCD_rw = 0;
LCD_en = 1;
delay ();
LCD_en = 0;
delay ();
LCD_data = 0x30;
LCD_rs = 0;
LCD_rw = 0;
LCD_en = 1;
delay ();
LCD_en = 0;
delay ();
LCD_data = 0x38;
LCD_rs = 0;
LCD_rw = 0;
LCD_en = 1;
delay ();
LCD_en = 0;
delay ();
}

void delay (void)
{int i;
 for (i=0;i<300000;i++) {};//100 ms
}


PM MAIL   Вверх
Dreamer_0x01
Дата 7.12.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 12



Осциллографом в ножки процессора тыкали? Сигналы точно идут от процессора к контролру дисплея?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dreamer_0x01
Дата 7.12.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 12



Так, посмотрел внимательно на ваш код и даташит. Вообще все не так, как в указанном мною случае.


Пробуем Переписать функцию  так:

Код

void WriteByte(unsigned char dtx, unsigned char rs)
{
LCD_rs = rs & 1;
LCD_rw = 0;
delay();
LCD_en = 1;
delay();
LCD_data = dtx;
delay();
LCD_en = 0;

}

void Init()
{
WriteByte(0x01,0);
delay();
WriteByte(0x06,0);
WriteByte(0x0F,0);
WriteByte(0x38,0);

}



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
goodking
Дата 18.12.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Спасибо большое, получилось  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0852 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.