Biblioteca para usar lcd?

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?
#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?