Отговори на тема  [ 17 мнения ]  Отиди на страница 1, 2  Следваща
Въпрос за LCD дисплей 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Окт 16, 2012 8:44 pm
Мнения: 18
Мнение Въпрос за LCD дисплей
Здравейте колеги, опитвам се да направя зарядно за LI-ION и LI-POLYMER батерии с pic16 и LCD екранче което да показва когато е заредена батерията и евентуално да може да се избира между различен ток на зареждане. Но имам проблем със дисплея, явно не мога да го управлявам. Начина на свързване го направих по идеята на един приятел( в някакво списание видях че трябвало да се свърже и R/W със Pic-a но вече всичко е направено, и всичките крачета на микропроцесора са заети). Но също така не съм сигурен и в кода.

Код:
#ifndef   LCD_H
#define   LCD_H


#define      E         0x08
#define      E_HIGH      PORTC = PORTC | E
#define      E_LOW      PORTC = PORTC & (~E)

#define      RS         0x04
#define      RS_HIGH      PORTC = PORTC | RS
#define      RS_LOW      PORTC = PORTC & (~RS)

#define      COMMAND      1
#define      DATA      0

// LCD commands
#define      CLR_DISP      0x01   
#define      DISP_ON         0x0C   
#define      DISP_OFF      0x08   
#define      CUR_HOME        0x02
#define      CUR_OFF       0x0C
#define    CUR_ON_UNDER    0x0E
#define      CUR_ON_BLINK    0x0F
#define    CUR_LEFT        0x10
#define      CUR_RIGHT       0x14
#define      CUR_UP        0x80   
#define      CUR_DOWN      0xC0
#define      ENTER           0xC0
#define      DD_RAM_ADDR      0x80   
#define      DD_RAM_ADDR2   0xC0   
#define      FUN_1L_5X8D      0x20
#define      FUN_1L_5X11D   0x24
#define      FUN_2L_5X8D      0x28
#define      FUN_2L_5X11D   0x2C

// LCD functions prototypes
void LCD_E_Pulse (void);

void LCD_Init (void);

void LCD_Configurate (void);

void LCD_Send (unsigned char Data, unsigned char MetaData);

void LCD_Send_String (const unsigned char str[], char Length);

int LCD_Form_Message (char x, int Value);

void LCD_Print_Message (const unsigned char Text[]);

void LCD_Slide_String (unsigned int Timeout, char Length);

void LCD_Display_State (void);

#endif

Черпенето е от мен :partyman: само да се покажат пустите буквички :D


Прикачени файлове:
Instruction.JPG
Instruction.JPG [ 151.06 KiB | Прегледано 3858 пъти ]
LCD.JPG
LCD.JPG [ 71.43 KiB | Прегледано 3858 пъти ]
charger.JPG
charger.JPG [ 126.07 KiB | Прегледано 3858 пъти ]
Сря Окт 31, 2012 9:17 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Вто Юни 27, 2006 11:13 am
Мнения: 381
Местоположение: Варна
Мнение Re: Въпрос за LCD дисплей
Не си написал никакви функции. изобщо ли не е тръгнал, какво си успял да направиш?


Чет Ное 01, 2012 10:53 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Въпрос за LCD дисплей
За този проект можеш да минеш и без LCD само с няколко светодиода.
R/W към маса. Контраста не е свързан правилно. С6 или С7 може да го махнеш.
И както didofen, каза не си показал никакъв код, така че не можем да гадаем дали е правилен или не.

_________________
Warriors of the Night, ASSEMBLER!!!


Чет Ное 01, 2012 5:33 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Окт 16, 2012 8:44 pm
Мнения: 18
Мнение Re: Въпрос за LCD дисплей
Код:
#include "main.h"
void LCD_E_Pulse (void)
{
   E_HIGH;
   E_LOW;
}

// Init LCD  after reset
void LCD_Init (void)
{
   TRISC = 0x03;   // E, RS directed as output, D4-D7 as output

   // Initialize 4-bit transfer mode
   PORTC = 0x30;   // RS -> LOW, D4, D5 -> HIGH, D6, D7 -> LOW
   DelayMs(110);

   LCD_E_Pulse();
   DelayMs(10);
   
   LCD_E_Pulse();
   DelayMs(10);

   LCD_E_Pulse();
   DelayMs(10);
   
   PORTC = PORTC & (~0x10);
   LCD_E_Pulse();
}

void LCD_Configurate (void)
{
   LCD_Send (DISP_ON, COMMAND);      // Dispplay ON
   LCD_Send (FUN_1L_5X8D, COMMAND);   // Function: 1 line, 5X8 pixels
   return;
}   

// Send Data/Command to LCD
void LCD_Send (unsigned char Data, unsigned char MetaData)
{
   char Info;
   DelayMs(1);
   
   if (MetaData == COMMAND)
      RS_LOW;            // Send command
   else
      RS_HIGH;         // Send data

   Info = Data & 0xF0;

   PORTC = (PORTC & 0x0F) | Info;

   LCD_E_Pulse();         // toggle E for LCD   
   
   Info = (Data & 0x0F);
   Info = Info << 4;

   PORTC = (PORTC & 0x0F) | Info;   //send data to LCD

   LCD_E_Pulse();         //toggle E for LCD
   return;
}

void LCD_Send_String (const unsigned char str[], char Length)
{
   int i=0;
   LCD_Send (CLR_DISP, COMMAND);
   for (i=0; i<8; i++)
      LCD_Send (str[(i+First)%Length], DATA);
   return;
}

int LCD_Form_Message (char x, int Value)
{
   int i;
   First = 0;
   for (i=0; i<9; i++)
      Number[i] = ' ';
   if (x==1)
   {
      String_Copy (Message, I_MSG);
      Int_to_String (Number, Value);
      for (i=2; i<6; i++)
         Message[i] = Number[i-2];
   }   
   else
   {
      String_Copy (Message, U_MSG);
      Int_to_String (Number, Value);
      for (i=2; i<6; i++)
         Message[i] = Number[i-2];
   }
   return 10;
}

void LCD_Print_Message (const unsigned char Text[])
{
   char L;
   First = 0;
   L = String_Copy (Message, Text);
   LCD_Send_String (Message, L);
   return;
}

void LCD_Slide_String (unsigned int Timeout, char Length)
{
   while (Timeout)
   {
      Timeout--;
      if (!Timeout)
      {
         First = (First + 1) % Length;
         LCD_Send_String (Message, Length);
         return;
      }
   }
   return;
}

void LCD_Display_State (void)
{
   if (IS_BUTTON2_PRESSED && Released2)
   {
      Button2_Timeout = 50000;
      while (IS_BUTTON2_PRESSED && Button2_Timeout)
         Button2_Timeout--;
      if (!Button2_Timeout)
      {
         Reset = 1;
         return;
      }
      if (Ready)
         return;
      ADC_Init (Channel);
      Channel = (Channel+1) % 2;      // Switch to next analog channel
      Show_Values = 1;
      Switch = 1;
      Released2 = 0;
   }
   
   ADC_Result = ADC_GetResult (10);
   if ((ADC_Result != Old_Result && !ADC_Timeout && Show_Values && !Ready) || Switch)
   {
      //float Value;
      int Value;
      Old_Result = ADC_Result;
      if (Channel==1)
         Value = (ADC_Result << 1) + (ADC_Result/10);      // ADC_Result * 2 + ADC_Result/10 = ADC_Result * 2.1
      else
         Value = (ADC_Result << 2) + ((ADC_Result<<2)/10);   // ADC_Result * 4 + (ADC_Result*4)/10 = ADC_Result * 4.4
      
      Length = LCD_Form_Message (Channel, Value);
      LCD_Send_String (Message, Length);
      
      ADC_Timeout=5000;
      Switch = 0;
   }
   
   if (!IS_BUTTON1_PRESSED)
      Released1 = 1;
   if (!IS_BUTTON2_PRESSED)
      Released2 = 1;
   if (ADC_Timeout)
      ADC_Timeout--;

   return;
}


Чет Ное 01, 2012 8:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Окт 16, 2012 8:44 pm
Мнения: 18
Мнение Re: Въпрос за LCD дисплей
Благодаря ви за бързите отговори.
didofen не изкарва нищо на дисплея и мислех че е нещо във хардуера, защото имах проблем с програматора които и сега не работи като хората но уж програмира.
ike ще го направя както казваш и ще драсна резултата. Контраста трябва към масата да се свърже или бъркам :?:


Чет Ное 01, 2012 8:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Въпрос за LCD дисплей
Контраста понякога трябва да се свърже към -1 или -2 Волта, понякога трябва да се върже с резистор към маса, а понякога направо към маса. Зависи от дисплея и напрежението с което го захранваш.

_________________
Warriors of the Night, ASSEMBLER!!!


Чет Ное 01, 2012 10:00 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Окт 16, 2012 8:44 pm
Мнения: 18
Мнение Re: Въпрос за LCD дисплей
Значи ми остава варианта с потенциометър :)


Чет Ное 01, 2012 10:10 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Окт 16, 2012 8:44 pm
Мнения: 18
Мнение Re: Въпрос за LCD дисплей
Благодаря ike тръгна дисплея :lol: Но не мога да накарам дисплея да изкара информацията на целия екран:
при 1-line -> LCD_Send (FUN_1L_5X8D, COMMAND) изкарва текста на екрана на половина.
А при 2-line-> LCD_Send (FUN_2L_5X8D, COMMAND)
Също така разреших на дисплея да показва до 16 символа
Код:
int LCD_Form_Message (char x, int Value)
{
   int i;
   First = 0;
   for (i=0; i<16; i++)

Би трябвало да го изкара на целия но не става



Пон Ное 05, 2012 5:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Въпрос за LCD дисплей
#define FUN_2L_5X11D 0x2C
Това е невалиден режим.
Ползвай само FUN_2L_5X8D. Никаде не си казал какъв точно е дисплея, 1х16 ли е? Няма как на дисплея да му разрешаваш и забраняваш колко символа да показва.

_________________
Warriors of the Night, ASSEMBLER!!!


Пон Ное 05, 2012 6:41 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Окт 16, 2012 8:44 pm
Мнения: 18
Мнение Re: Въпрос за LCD дисплей
Да 1x16 е.


Пон Ное 05, 2012 7:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Въпрос за LCD дисплей
Добре де защо тогава мълчиш, като комунист на разпит.
Дисплея ти е 8+8 втората осмица на кой адрес се намира трябва да провериш в документацията.
Слагаш го в режим #define FUN_2L_5X11D 0x2C и му подаваш 80 различни символа, нататък смятам че и сам ще можеш да се ориентираш.

_________________
Warriors of the Night, ASSEMBLER!!!


Пон Ное 05, 2012 8:26 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Вто Юни 27, 2006 11:13 am
Мнения: 381
Местоположение: Варна
Мнение Re: Въпрос за LCD дисплей
при 1х16 имаш 80-88 и С0-С8 адреси


Вто Ное 06, 2012 9:55 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: Въпрос за LCD дисплей
Ако са ти кът пиновете защо не добавиш буфер м/у контролера и дисплея(поне за информационните пинове)?!

_________________
www.elkran.com


Вто Ное 06, 2012 6:26 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Окт 16, 2012 8:44 pm
Мнения: 18
Мнение Re: Въпрос за LCD дисплей
ike :lol: даже не съм се усетил че не съм написал колко символен е :oops:
Извинявам се че се замотах с отговора, просто пак започнаха някакви мизерии с микропроцесора и програматора ](*,) .
ike и didofen благодаря за насоката, ще разгледам datasheet и ще пробвам да го направя. Иначе си реших проблема със слайдване още в началото :D ама е много несериозно когато имам 1х16 дисплей, но толкова са ми възможностите.
stoyanoff нямам и на идея за какъв буфер става въпрос, ще можеш ли да ми подскажеш как ще стане?


Вто Ное 06, 2012 8:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: Въпрос за LCD дисплей
Трябва ти интеграла с няколко D тригера вътре(octal или quad). Тези интеграли имат много голямо входно съпротивление и могат да се навързват към обща магистрала. Изходите им се променят само, когато се подаде сигнал на управляващите им входове. Идеята е, че можеш да си вържеш такава(такива) на някой порт, който вече ползваш за нещо друго, и с останалите малко свободни пинове да я управляваш. Само трябва да знаеш, че при старт на програмата, трябва да установиш изходите на буфера(ите) в 0, за да сработи правилно инициализацията.
Поздрави!

_________________
www.elkran.com


Вто Ное 06, 2012 8:26 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 17 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни