Autor Tema: DRIVER PARA LCD  (Leído 2736 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nordestenica

  • PIC16
  • ***
  • Mensajes: 215
DRIVER PARA LCD
« en: 19 de Mayo de 2004, 09:19:00 »
les dejo una driver para controlar casi todo tipo de lcd alfanumerico la e probado con varias e funciono en todas elhas perfectamente he tenido algunas que con una configuracion funciona perfectamente pero quando conectaba otra de marca diferente esta ya no funcionaba de manera que e ido retocando el driver e con solo aumentar o diminuir los delays consegui acer que todas elhas funcionen

si alguien le interesa lo puede simular en el proteus e ir aciendo canbios con varias lcds e canbiando la configuracion del driver para que assi se aga una idea de las diferencias que ay entre elhas




este es el driver se puede canbiar facilmente el puerto que queramos usar


//GUARDAR CON ESTE NOME LCDTESTE.C
#use delay(clock=20000000)

//PARA USAR A PORTA D CONVENIENTE PARA 16F877A
#define LCD_D0  PIN_D2  
#define LCD_D1  PIN_D3
#define LCD_D2  PIN_D4
#define LCD_D3  PIN_D5
#define LCD_EN  PIN_D1
#define LCD_RS  PIN_D0
//O PIN R/W LIGADO A GND SENAO NAO FUNCIONA

// EXPECIAL PARA LCD 4x20 //
//#define LINHA_1 0x00
//#define LINHA_2 0x40
//#define LINHA_3 0x14
//#define LINHA_4 0x54

// EXPECIAL PARA LCD 4X16 //
//#define LINHA_1 0x00
//#define LINHA_2 0x40
//#define LINHA_3 0x10
//#define LINHA_4 0x50

// EXPECIAL PARA LCD 2x20 //
#define LINHA_1 0x00
#define LINHA_2 0x40

// EXPECIAL PARA LCD 1X16 //
//#define LINHA_1 0x00

// EXPECIAL PARA LCD 2X16 //
//#define LINHA_1 0x00
//#define LINHA_2 0x40


#define CLEAR  0x01
void LCD_Init ( void );
void LCD_SetPosition ( unsigned int cX );
void LCD_PutChar ( unsigned int cX );
void LCD_PutCmd ( unsigned int cX );
void LCD_PulseEnable ( void );
void LCD_SetData ( unsigned int cX );
void LCD_Init ( void )
    {
    LCD_SetData ( 0x00 );
    delay_ms ( 50 );       /* COLOCAR O TEMPO PARA DIFERENTES LCD REALIZAR EXPERIENCIAS*/
    output_low ( LCD_RS );
    LCD_SetData ( 0x03 );  
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_SetData ( 0x02 );  
    LCD_PulseEnable();      
    LCD_PutCmd ( 0x2C );    
    LCD_PutCmd ( 0x0C );    
    LCD_PutCmd ( 0x01 );    
    LCD_PutCmd ( 0x06 );    
    }

void LCD_SetPosition ( unsigned int cX )
    {
   
    LCD_SetData ( swap ( cX ) | 0x08 );
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );
    LCD_PulseEnable();
    }

void LCD_PutChar ( unsigned int cX )
    {
   
    output_high ( LCD_RS );
    LCD_SetData ( swap ( cX ) );    
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );    
    LCD_PulseEnable();
    output_low ( LCD_RS );
    }

void LCD_PutCmd ( unsigned int cX )
    {
   
    LCD_SetData ( swap ( cX ) );    
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );    
    LCD_PulseEnable();
    }

void LCD_PulseEnable ( void )
    {
    output_high ( LCD_EN );
    delay_us ( 20 );   //IR MODIFICANDO O VALOR ATE CONSEGUIR O MAIS ADEQUADO
    output_low ( LCD_EN );
    delay_ms ( 20 );  //IR MODIFICANDO O VALOR ATE CONSEGUIR O MAIS ADEQUADO
    }

void LCD_SetData ( unsigned int cX )
    {
    output_bit ( LCD_D0, cX & 0x01 );
    output_bit ( LCD_D1, cX & 0x02 );
    output_bit ( LCD_D2, cX & 0x04 );
    output_bit ( LCD_D3, cX & 0x08 );
    }







esto es un teste para usar este driver con el 16f877a

#include <16F877A.h>
#include <LCDTESTE.C>
#use delay(clock=20000000)
#fuses NOWDT,RC, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT




void main ( void )
    {
   LCD_Init();
   LCD_PutCmd ( CLEAR );
   LCD_SetPosition ( LINHA_1 );
   printf ( LCD_PutChar, "            LINHA1                " );
   delay_ms (500);
   LCD_SetPosition ( LINHA_2 );
   printf ( LCD_PutChar, "            LINHA2                " );
   delay_ms ( 1000);


   LCD_PutCmd ( CLEAR );  
LCD_SetPosition ( LINHA_1 );
   printf ( LCD_PutChar, "TESTE LCD 2 LINHAS POR 40 CARACTERES";
   delay_ms (500);
   LCD_SetPosition ( LINHA_2 );
   printf ( LCD_PutChar, " PREPARADO POR XASTRE NORDESTECNICA  ";
   delay_ms ( 1000);
    }  

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: DRIVER PARA LCD
« Respuesta #1 en: 19 de Mayo de 2004, 15:23:00 »
una consulta........

No tienes rutinas para LCD de 8 bit??. La de CCS es tb para LCD de 4 bit. La de microsystem es de 8 bit pero no me funciona con el 16F877 con un 18F452 tampoco funciona

Salud2
kruskal@hotmail.com

Desconectado nordestenica

  • PIC16
  • ***
  • Mensajes: 215
RE: DRIVER PARA LCD
« Respuesta #2 en: 20 de Mayo de 2004, 04:26:00 »
ola kruskal pues la verdade es que para 8bits nada de nada yo tengo 4 lcd una de sansung dos de epson e una de hitachi e e probado con las varias con las drivers de ccs e otras que e encontrado por la web e  la unica que me funciono fue la de hitachi las demas nada de nada ni con 4bits ni con 8bits el unico modo de ponerlas en funcionamiento fue con este driver e ajustando los delays para cada una aver si por todos acemos algo que funcione a 8 bits que creo que no seria dificil pero

Desconectado rage78

  • PIC10
  • *
  • Mensajes: 9
Re: (Consulta) DRIVER PARA LCD
« Respuesta #3 en: 12 de Junio de 2006, 06:06:29 »
Hola nordestenica:

Tengo ciertas nociones de C y mi idea es poder sacar por la LCD 2x16 (controlador Samsung) la información seleccionada por el usuario. Concretamente quiero poner en la línea superior una letra (la que seleccione en ese momento el usuario) y en la línea inferior la frase completa (acumulación de letras que haya seleccionado el usuario). El tema del control y asignación de carácteres lo tengo solucionado (o al menos eso creo) pero tengo serios problemas con el control de la lcd.

He mirado el código que propones y hay cosas que no entiendo:
1. Haces referencia a cX, variable que no declaras en ningún momento (que significa?)
   Ejemplo: LCD_SetData ( swap ( cX ) );
   En mi caso la variable que quiero enseñar por pantalla es un array de carácteres (char FRASE[100];)
2. Si quisiera hacer que esta frase se mueva por la línea inferior de la pantalla, como podría hacerlo (estoy intentando descifrar las funciones que utilizas para llevar a cabo mi propósito, pero de momento no me salgo con la mía).

Saludos y muchas grácias de antemano.
PD: Lo estoy programando en "CCS C Compiler" en un PIC 16F876

Desconectado Optimvs333

  • PIC10
  • *
  • Mensajes: 6
Re: DRIVER PARA LCD
« Respuesta #4 en: 12 de Junio de 2006, 13:21:09 »
Hola a todos...
Amigo Kuskal, no sé si te entiendo bien (y me corriges si estoy equivocado) quieres manejar tu LCD paralela con 8 bits y no con 4 como se maneja habitualmente para no copar todos los pines de un solo puerto del pic. Yo he manejado mi LCD con 8 bits gracias a un programa generado por Application Maestro de MicroChip (totalmente gratis) que te permite generar el código de 4 u 8 bits, con modo delay o busy flag, con o sin R/W, etc. Si requieres te puedo enviar el código pero es para ser compilado con MPLab C18, pero creo que haciendo pequeños ajustes se puede compilar con CCS. Ahora, si descargas el App Maestro, puedes generarla para la familia 18F en C y asm al igual que para la familia 16F sólo en asm.

Ahora, para el amigo rage78, la variable cX no se declara de manera global, sino que en cada void se está declarando (por ejemplo void LCD_SetPosition ( unsigned int cX ); ) que por defecto es un int8, pero sin signo como lo especifica nordestenica al declarar la variable, se usa para enviar datos a la lcd, aunque no necesariamente los caracteres que se desean visualizar, así que para mostrar tu frase, "creo" que deberías recorrer ese vector y enviar dichos caracteres a la LCD. Creo que para el segundo punto, lo que puedes hacer es tratar de entender el código del LCD.C que se encuentra en la carpeta PICC/Drivers.

Espero haber sido de alguna utilidad.

Saludos desde Colombia.

Optimvs