Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Программирование LCD  (Прочитано 20316 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
falanga
Гость
« : 16-11-2009 10:50 » 

Привет! Я недавно начал изучать микроконтроллеры, почему-то не получается разобратся с LCD вот код, если в нем есть ошибка- укажите, буду благодарен  Улыбаюсь
Код:
#include "c8051F120.h"


sbit LCD_rs=P2^2;
sbit LCD_rw=P2^1;
sbit LCD_en=P2^0;
#define LCD_data P4

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();


 void main (void)
  { 
   WDTCN     = 0xDE;
   WDTCN     = 0xAD;
   Port_IO_Init();
   LCD_init ();
   LCD_command ();
 
   LCD_sendstring ();
   LCD_build();
   LCD_busy();

   }
   
   void Port_IO_Init(void)
{
    SFRPAGE   = CONFIG_PAGE;
    P2MDOUT   = 0xFF;
    P4MDOUT   = 0xFF;
    XBR2      = 0x40;

}


void LCD_init(void)
{LCD_data = 0x0E;// 2 линии 8 бит 5х8 точек
 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 = 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();
 LCD_data = 0;
}




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(0x04); //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();
}
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-11-2009 10:59 » 

я так понимаю, что код откуда-то взят.

1. Где основной цикл?
Код:
void main (void)
  { 
   WDTCN     = 0xDE;
   WDTCN     = 0xAD;
   Port_IO_Init();
   LCD_init ();
   LCD_command ();
 
   LCD_sendstring ();
   LCD_build();
   LCD_busy();

   }
получается что,  инициализация портов, LCD, передача данных, наверное попытка "зажечь".
Бац. Конец.

Возможно, watchdog должен сбросить контроллер. но не сбрасывает.

почитай внимательно доку на LCD. В те ли порты контроллера пишешь?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
falanga
Гость
« Ответ #2 : 16-11-2009 11:11 » 

 забыл
Код:
 void main (void)
  { 
   WDTCN     = 0xDE;
   WDTCN     = 0xAD;
   Port_IO_Init();
   LCD_init ();
   LCD_command ();
 
   LCD_sendstring ();
   LCD_build();
   LCD_busy();

   while (1){};

   }
но все-равно, горит только верхняя строка экрана, которая  потухает при запуске программы! А даташит я читал, вроде все правильно! Не понял
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 16-11-2009 11:19 » 

а так
Код:


   while (1){
LCD_command ();
  
   LCD_sendstring ();
   LCD_build();
   LCD_busy();

};
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
falanga
Гость
« Ответ #4 : 16-11-2009 11:39 » 

Да, так наверное  правильно, но все-равно не работает Не понял, и еще при компилляции пишет, что в main, в подпрограмме sendstring не указаны данные, не подскажешь, с чем это связано?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 16-11-2009 11:57 » new

у тебя как объявлена функция?
void LCD_sendstring(unsigned char *var);

а как ты ее вызываешь?

LCD_sendstring ();

И потом... откуда LCD будет знать что ему выводить?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
falanga
Гость
« Ответ #6 : 16-11-2009 12:20 » 

что выводить, указано в LCD_build, а в LSD_string на протяжении программы заносятся различные данные (var), что -же туда записать? 
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 16-11-2009 14:22 » 

falanga, расскажи алгоритм работы с LCD, чувствую, что ты до конца не проникся.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
falanga
Гость
« Ответ #8 : 16-11-2009 14:58 » 

Код:
sbit LCD_rs=P2^2;
sbit LCD_rw=P2^1;
sbit LCD_en=P2^0;
#define LCD_data P4//назначаю соответствующие выводы портов-линиям ЖКИ

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();


 void main (void)
  {  
   WDTCN     = 0xDE;
   WDTCN     = 0xAD;
   Port_IO_Init();
   LCD_init ();
   LCD_command ();
  
   LCD_sendstring ();
   LCD_build();
   LCD_busy();

   }
  
   void Port_IO_Init(void)
{
    SFRPAGE   = CONFIG_PAGE;
    P2MDOUT   = 0xFF;
    P4MDOUT   = 0xFF;
    XBR2      = 0x40;

}//инициализация портов


void LCD_init(void)
{LCD_data = 0x0E;// 2 линии 8 бит 5х8 точек
 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 = 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();
 LCD_data = 0;
}//инициализация ЖКИ (LCD_rs-регистр LCD, если1-данные (которые подаются в LCD_data) воспринимаются как собственно данные, если 0-как инструкции;  LCD_rw,0-запись данных, 1-чтение;  LCD_en - если 0-то данные можно записывать в ЖКИ, если 1- нет )




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(0x04); //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();
}//вывод данных на экран
« Последнее редактирование: 16-11-2009 15:46 от Sla » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 16-11-2009 15:21 » 

falanga, это не алгоритм, это программа. Ты русским языком объясни.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 16-11-2009 15:49 » 

Опиши словами как надо работать с LCD
например
1. инициализация портов контроллера
2. инициализация порnов LCD
3. подготовка строки вывода
и т.д.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
falanga
Гость
« Ответ #11 : 17-11-2009 08:19 » 

Ясно:
Инициализировать порты МК, инициализировать LCD, задать параметры пересылки комманд в LCD (LCD_command), параметры пересылки данных в LCD (LCD_sendstring; LCD_senddata) , переслать данные (LCD_build)
ну в принципе все  Улыбаюсь
« Последнее редактирование: 17-11-2009 08:25 от falanga » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 17-11-2009 10:41 » 

я думаю, что у тебя проблема с пониманием работы LCD

Как это, наверное, должно работать?

1. Инит портов МК и LCD
2. Подготовка данных для вывода на LCD
3. Вывод на LCD
4. Переход на 2.


2. Подготовка данных
как я понимаю дисплей многострочный
подготовить первую строку
подготовить вторую строку
...

3. Команда запись


Задержка LCDBusy - для каждого дисплея индивидуальна
Команды записи/чтения для каждого дисплея индивидуальны.

А теперь показывай свой код


в принципе
Код:
void LCD_senddata(unsigned char var)
{
 LCD_data = var;
 LCD_rs = 1;
 LCD_rw = 0;
 LCD_en = 1;
 LCD_en = 0;
 LCD_busy();
Это и есть код вывода

Но! Ведь это у тебя библиотечные функции, возможно, что ты не совсем понимаешь их назначения.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 17-11-2009 10:55 » 

покажи ассемблерный код библиотек, приложи его к ответу
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
falanga
Гость
« Ответ #14 : 17-11-2009 11:05 » 

Нет, функции я взял из найденного примера, в принципе назначение регистров LCD, как я понял не отличается для разных моделей.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 17-11-2009 11:24 » 

вот гляди
Код:
void wrt_string(bit_8 *string)
{
busy();
while(*string)
wrt_data(*string++);
}
Что происходит?
Задержка
побайтная выгрузка данных

Крутим дальше
Код:
void wrt_data(bit_8 ch)
{
busy();
LCD_PORT = ch;
rs=1;
rw=0;
en=1;
en=0;
}
Задержка
Запихнули байт в порт
Выдали команду записи в порт LCD



 

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
falanga
Гость
« Ответ #16 : 17-11-2009 13:04 » 

вот гляди
Код:
void wrt_string(bit_8 *string)
{
busy();
while(*string)
wrt_data(*string++);
}
Что происходит?
Задержка
побайтная выгрузка данных

Крутим дальше
Код:
void wrt_data(bit_8 ch)
{
busy();
LCD_PORT = ch;
rs=1;
rw=0;
en=1;
en=0;
}
Задержка
Запихнули байт в порт
Выдали команду записи в порт LCD



 



Понятно, а какое значение заносить в wrt_string (в моеи случае LCD_sendstring) в главной функции?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 17-11-2009 13:18 » 

falanga, заноси строку, которую нужно вывести на экран, например "Привет мир" Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
falanga
Гость
« Ответ #18 : 18-11-2009 08:26 » 

Да, получилось, спасибо большое !! Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines