Autor Tema: Ayuda LCD  (Leído 2401 veces)

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

Desconectado cerc151

  • PIC10
  • *
  • Mensajes: 17
Ayuda LCD
« en: 22 de Febrero de 2005, 17:03:00 »
Hola a todos
He estado probando un codigo que hice para visualizar un mensaje en el lcd y no he tenido buenos resultados, si alguien sabe lo que estoy haciendo mal les agradeceria su colaboracion

Conexiones:  PIC       LCD
                     RB0        D4
                     RB1        D5
                     RB2        D6
                     RB3        D7
                     RA2        RS
                     RA3        EN

Codigo:
#include <pic.h>
#include "lcd.c"
#include "delay.c"
#include "delay.h"
#include "lcd.h"
#include "stdio.h"

#define XTAL_FREQ 4MHZ

__CONFIG(XT & WDTDIS & PWRTEN & LVPDIS & DUNPROT & DEBUGDIS);

//Declaracion de funciones
void puertos(void);
void mostrar(void);

void puertos(void)
{
   TRISA=0;
   TRISB=0;
   PORTB=0;
}
void mostrar(void)
{
   //inicializar lcd
   lcd_init();
   //limpiar lcd
   lcd_clear();
   //mensaje de prueba
   lcd_puts("TEST" ) ;
}
void main(void)
{
   //configurar puertos
   puertos();
   //mostrar mensajes
   mostrar();
}

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Ayuda LCD
« Respuesta #1 en: 22 de Febrero de 2005, 18:06:00 »
Hola

¿Qué pic estás usando?

Mi recomendación es que leas el archivo lcd.c, porque según sé esta cabecera usa sólo 7 bits de un sólo puerto para comunicarse con la LCD. En tu programa tu usas port a y port b para comunicarlo y no creo que esté bien.

Desconectado cerc151

  • PIC10
  • *
  • Mensajes: 17
RE: Ayuda LCD
« Respuesta #2 en: 22 de Febrero de 2005, 18:10:00 »
Estoy utilizando el 16F877
la info que me da la libreria es la siguiente:
/*
 *   LCD interface example
 *   Uses routines from delay.c
 *   This code will interface to a standard LCD controller
 *   like the Hitachi HD44780. It uses it in 4 bit mode, with
 *   the hardware connected as follows (the standard 14 pin
 *   LCD connector is used):
 *   
 *   PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
 *   PORTA bit 2 is connected to the LCD RS input (register select)
 *   PORTA bit 3 is connected to the LCD EN bit (enable)
 *   
 *   To use these routines, set up the port I/O (TRISA, TRISB) then
 *   call lcd_init(), then other routines as required.
 *   
 */

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Ayuda LCD
« Respuesta #3 en: 22 de Febrero de 2005, 18:19:00 »
OK, pues se me ocurre preguntarte si conectaste RW de la LCD a tierra y si conectaste la terminal del contraste correctamente, es decir, a tierra generalmente.

Desconectado cerc151

  • PIC10
  • *
  • Mensajes: 17
RE: Ayuda LCD
« Respuesta #4 en: 22 de Febrero de 2005, 18:21:00 »
Claro que si. El unico resultado que obtengo del programa es el parapadeo del cursor en la pantalla y no la  visualizacion del mensaje.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Ayuda LCD
« Respuesta #5 en: 22 de Febrero de 2005, 18:26:00 »
hum...

pues ahora pienso que debes configurar el puerto A como salida y que todas sus terminales sean digitales, que no sean análogas.

no sé como se configure eso en tu compilador, pero en CCS se le pone SETUP_ADC_PORTS(NO_ANALOGS);


Desconectado cerc151

  • PIC10
  • *
  • Mensajes: 17
RE: Ayuda LCD
« Respuesta #6 en: 22 de Febrero de 2005, 18:47:00 »
Ya cofingure el puerto a como digital pero sigo teniendo los mismos resultados

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Ayuda LCD
« Respuesta #7 en: 22 de Febrero de 2005, 18:57:00 »
¿Ya conectaste D0 a D3 de la LCD a 0V ó 5V? Seguramente ya. Muchas risas

Pues no se me ocurre otra falla... espera a ver si alguien más te puede ayudar. Giño

Desconectado cerc151

  • PIC10
  • *
  • Mensajes: 17
RE: Ayuda LCD
« Respuesta #8 en: 22 de Febrero de 2005, 19:17:00 »
Los puse a tierra.
Gracias de todas maneras, esperare que alguien me pueda solucionar el problema.
Y de paso otra pregunta, ¿Como hago para visualizar el contenido de una variable?
Probe con el comando lcd_puts("%d",nombre_variable), pero el compilador me arroga un errores:  Prueba_lcd.c 35 : too many arguments
                                Prueba_lcd.c 36 : expression syntax
Apreciaria mucho la colaboracion de cualquiera que me ayudara

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Ayuda LCD
« Respuesta #9 en: 23 de Febrero de 2005, 14:43:00 »
Hola

en el compilador CCS se hace así:

printf(lcd_putc,"%2x-%2x-20%2x",date,month,year);

donde la x es un dato hexadecimal
c es caracter
f es flotante 16 bits

checa la ayuda de tu compilador, todo comando debe estar explicado ahí. Giño

Desconectado cerc151

  • PIC10
  • *
  • Mensajes: 17
RE: Ayuda LCD
« Respuesta #10 en: 23 de Febrero de 2005, 15:28:00 »
Gracias por tu ayuda pero lo nececito para PICC de HI-TECH

Desconectado PeitoPic

  • PIC10
  • *
  • Mensajes: 2
RE: Ayuda LCD
« Respuesta #11 en: 01 de Marzo de 2005, 13:50:00 »
Hola cerc151 si lo deseas puedes probar con mi libreria q esta preparada para conectar el lcd 2X16 al portd:


//*****************  Cabecera LCD.h para el PIC16F87x  **********************
//Interace a 4 bits usando el puerto PORTD para conectar el display LCD y el
//Timer 1 para inicializar el LCD.                  Version 1.0 - 20/06/2002
//************************  Definicion de variables  ************************
#define RS RD0
#define RW RD1
#define EN RD2
#define DB4 RD4
#define DB5 RD5
#define DB6 RD6
#define DB7 RD7
unsigned char temp_lcd;
//************************  Prototipos funciones  ***************************
void tiempo_lcd (unsigned char t);
void inicializar_lcd (void);
void envia_al_lcd (unsigned char codigo, unsigned char dato);
unsigned char leer_lcd (void);
unsigned char esperar_bf (void);
//********************  Desarrollo de las funciones  ************************
void tiempo_lcd (unsigned char t)      //Temporiza t milesimas de segundo
{   T1CON=0x00;               //Timer 1 sin interrupcion
   while (t)
   {   TMR1H=0xFC;
      TMR1L=0x18;
      TMR1ON=1;
      while(!TMR1IF);
      TMR1ON=TMR1IF=0;
      t--;
   }
}

void inicializar_lcd (void)
{   TRISD=0x00;            //PORTD salida
   tiempo_lcd(20);         //esperar mas de 15 mseg
   PORTD=0x30;            //0011--00
   EN=1; EN=0;
   tiempo_lcd(1+5);         //esperar tiempo ejecucion y mas de 4"1 mseg
   PORTD=0x30;            //0011--00
   EN=1; EN=0;
   tiempo_lcd(1+1);         //esperar tiempo ejecucion y mas de 0"1 mseg
   PORTD=0x30;            //0011--00
   EN=1; EN=0;
   tiempo_lcd(1);            //esperar tiempo ejecucion
   PORTD=0x20;            //0010--00
   EN=1; EN=0;
   temp_lcd=esperar_bf();

   PORTD=0x20;            //0010--00
   EN=1; EN=0;
   PORTD=0x80;            //1000--00
   EN=1; EN=0;
   temp_lcd=esperar_bf();      //Interface a 4 bits, 2 lineas y 5x7 puntos

   PORTD=0x00;            //0000--00
   EN=1; EN=0;
   PORTD=0x80;            //1000--00
   EN=1; EN=0;
   temp_lcd=esperar_bf();      //Display OFF

   PORTD=0x00;            //0000--00
   EN=1; EN=0;
   PORTD=0x01;            //0001--00
   EN=1; EN=0;
   temp_lcd=esperar_bf();      //Display borrado

   PORTD=0x00;            //0000--00
   EN=1; EN=0;
   PORTD=0x60;            //0110--00
   EN=1; EN=0;
   temp_lcd=esperar_bf();      //Seleccion modo entrada datos

   PORTD=0x00;            //0000--00
   EN=1; EN=0;
   PORTD=0xC0;            //1100--00
   EN=1; EN=0;
   temp_lcd=esperar_bf();      //Activar display, sin cursor ni parpadeo
}

void envia_al_lcd(unsigned char codigo, unsigned char dato)
{   PORTD=(dato&0xF0)|codigo;
   EN=1; EN=0;
   PORTD=((dato<<4)&0xF0)|codigo;
   EN=1; EN=0;
   temp_lcd=esperar_bf();
}

unsigned char leer_lcd(void)
{   unsigned char aux=0;
   TRISD=0xF0;            //DB7 a DB4 entradas
   PORTD=0xF3;            //RS=RW=1
   EN=1;   
   aux=PORTD&0xF0;
   EN=0; EN=1;
   aux=((PORTD&0xF0)>>4)|aux;
   EN=0;
   temp_lcd=esperar_bf();
   TRISD=0x00;            //PORTD salida
   return (aux);
}

unsigned char esperar_bf (void)
{   unsigned char aux=0;
   TRISD=0xF0;            //DB7 a DB4 entradas
   PORTD=0xF2;             //RS=0 y RW=1
   do
   {   EN=1;
      aux=PORTD&0xF0;
      EN=0; EN=1;
      aux=((PORTD&0xF0)>>4)|aux;
      EN=0;
   }
   while((aux&0x80)!=0);
   TRISD=0x00;            //PORTD salida
   return(aux);
}



Y aqui un ejemplo de como usarla, veras q es realmente facil:


#include <pic1687x.h>
#include <lcd.h>

const   unsigned char mensaje1[]={"Mensaje 1"};
const   unsigned char mensaje2[]={"Mensaje 2"};

void main (void)
{
   unsigned char x;
   inicializar_lcd();
   envia_al_lcd(0,0x01); //borrado
   envia_al_lcd(0,0x80); //Primera linea
   for(x=0;mensaje1
  • ;x++)
          envia_al_lcd(1,mensaje1
  • );
       envia_al_lcd(0,0xC0); //segunda linea
       for(x=0;mensaje2
  • ;x++)
          envia_al_lcd(1,mensaje2
  • );
       while(1);
    }

    ESPERO Q PUEDA SERTE UTIL, ES UN SISTEMA SENCILLO DE MANEJAR EL 2X16