Página 1 de 1

Biblioteca para usar lcd?

MensagemEnviado: 05 Nov 2006 23:05
por lmdmendes
Eu estou querendo usar uma biblioteca para escrever num lcd de 16*2, no forum antigo foi referida a seguinte pelo nosso amigo welll:

#ifndef lcd_enable
#define lcd_enable P1_0 // pino enable do LCD
#define lcd_rs P1_1 // pino rs do LCD
//#define lcd_rw pin_e2 // pino rw do LCD
#define lcd_d4 P1_4 // pino de dados d4 do LCD
#define lcd_d5 P1_5 // pino de dados d5 do LCD
#define lcd_d6 P1_6 // pino de dados d6 do LCD
#define lcd_d7 P1_7 // pino de dados d7 do LCD
#endif

void lcd_name(unsigned char *p);

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40 // Endereço da segunda linha na RAM do LCD
#define lcd_seg_lin 0x40 // Endereço da segunda linha na RAM do LCD
#define lcd_ter_lin 0x10
#define lcd_qua_lin 0x50

int INI_LCD[4] = {0x20 | (lcd_type << 2), 0xE, 1, 6};
void delay_ms(float x)
{
int y;
for (y=0;y<=x;y++);
}

bit_test(int x, int y)
{
int c;
c=0;

switch (y)
{
case 0 : y=1 ;
break;
case 1 : y=2;
break;
case 2 : y=4;
break;

case 3 : y=8;
break;

}

c= x & y;
if (c!=0){
c=1;
return (c);
}
else{
c=0;
return (c);

}

}


void lcd_envia_nibble( int dado )
// envia um dado de quatro bits para o display
{
// coloca os quatro bits nas saidas
lcd_d4=bit_test(dado,0);
lcd_d5=bit_test(dado,1);
lcd_d6=bit_test(dado,2);
lcd_d7=bit_test(dado,3);
// dá um pulso na linha enable
lcd_enable=1;
lcd_enable=0;
}


void lcd_envia_byte( int endereco, int dado )
{
// coloca a linha rs em 0
lcd_rs=0;
// aguarda o display ficar desocupado
//while ( bit_test(lcd_le_byte(),7) ) ;
// configura a linha rs dependendo do modo selecionado
lcd_rs=endereco;


// delay_ms(5); // aguarda 100 us
// caso a linha rw esteja definida, coloca em 0
#ifdef lcd_rw
lcd_rw=0;
#endif
// desativa linha enable
lcd_enable=0;
// envia a primeira parte do byte
lcd_envia_nibble(dado >> 4);
// envia a segunda parte do byte
lcd_envia_nibble(dado & 0x0f);
}


void lcd_ini()
// rotina de inicialização do display
{
int conta;
lcd_d4=0;
lcd_d5=0;
lcd_d6=0;
lcd_d7=0;
lcd_rs=0;
#ifdef lcd_rw
lcd_rw=1;
#endif
lcd_enable=0;
delay_ms(15);
// envia uma seqüência de 3 vezes 0x03
// e depois 0x02 para configurar o módulo
// para modo de 4 bits
for(conta=1;conta<=3;++conta)
{
lcd_envia_nibble(3);
delay_ms(5);
}
lcd_envia_nibble(2);
// envia string de inicialização do display
for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}

void lcd_pos_xy( int x, int y)
{
int endereco;
if(y==4){
endereco = 0;
endereco=lcd_qua_lin;
endereco += x-1;
lcd_envia_byte(0,0x80|endereco);
}
if(y==3){
endereco = 0;


endereco= lcd_ter_lin;
endereco += x-1;


lcd_envia_byte(0,0x80|endereco);

}
if(y==2){

endereco = 0;

endereco = lcd_seg_lin;
endereco += x-1;


lcd_envia_byte(0,0x80|endereco);
}
if(y==1){
endereco = 0;
endereco += x-1;
lcd_envia_byte(0,0x80|endereco);
}
}

void lcd_escreve( char c)
// envia caractere para o display
{
switch (c)
{
case '\f' : lcd_envia_byte(0,1);
delay_ms(2);
break;
case '\n' :
case '\r' : lcd_pos_xy(1,2);
break;
case '\b' : lcd_envia_byte(0,0x10);
break;
default : lcd_envia_byte(1,c);
break;
}
}

void lcd_name(unsigned char *p)
{
while(*p != 0)
{
lcd_escreve(*p);
p++;
}
}


*************************
*************************

Que colocou como exemplo como usar:

#include <AT89X52.h>

#include <LCD_MOD.h>

main()
{
EA =0;
P0=1;
P3=0;
P2=0;
P2_1=1;
P1=0;
lcd_ini(); //iniciar display

lcd_escreve('\f'); //iniciar na primeira linha

lcd_pos_xy(4,1); //posicionar

lcd_escreve('W');
lcd_escreve('e');
lcd_escreve('l');
lcd_escreve('l');
lcd_escreve('i');
lcd_escreve('n');
lcd_escreve('g');
lcd_escreve('t');
lcd_escreve('o');
lcd_escreve('n');
lcd_pos_xy(5,2);
lcd_escreve('T');
lcd_escreve('e');
lcd_escreve('c');
lcd_escreve('n');
lcd_escreve('i');
lcd_escreve('c');
lcd_escreve('o');
while(1){}
}


*******************
*******************

Depois:

exemplo:
lcd_name("wellington"); //para escrever string

*******************
*******************

O problema e que eu compilo no keil 5 estrelas, na partica n da nada,
sera por esta linh tar comentada?
//while ( bit_test(lcd_le_byte(),7) ) ;

Não compreendo como esta tanta linha comentada, por exemplo a WR, como usar esta biblioteca?

Ou alguem tem uma biblioteca para usar lcd 16*2 q possa enviar?

MensagemEnviado: 06 Nov 2006 02:09
por Maurício
experimenta usar esta daqui:

http://www.editoraerica.com.br/download ... troladores

[]'s

RETI.

MensagemEnviado: 06 Nov 2006 07:36
por lmdmendes
Mas esse e de 8 bits n e?
Eu gostaria de usar de apenas 4 bits.
Outra questao nesse, os 8bits, sao os 8 bits de dados do porto 0 (P0), correcto?
Isso e uma rotina, podera ser usada como biblioteca?

MensagemEnviado: 06 Nov 2006 08:56
por andre_luis
Rotina, biblioteca, classe, driver; no fundo a função é a mesma. É um trecho de programa que voce de algum modo, anexa ( 'linka' ) ao seu programa.

Biblioteca vem dentro do compilador, de maneira intrínseca, sem que voce tenha acesso ao código fonte ou objeto, e em princípio podem ser mais eficientes, uma vez que teoricamente já foram escritos em assembly.

+++

MensagemEnviado: 06 Nov 2006 16:23
por lmdmendes
Sim, tens razao esquece, no fim de directas devolta de relatorios para a escola uma pessoa, nem pensa direito :P hee heee
O problema era mesmo so de hardware :D
ai ai ai
Desculpem la, mas o menos este post pode servir, para alguem poder usar a biblioteca para escrever em lcd 16*2 com 4bits

Um Abraço