TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cerc151 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();
}
-
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.
-
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.
*
*/
-
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.
-
Claro que si. El unico resultado que obtengo del programa es el parapadeo del cursor en la pantalla y no la visualizacion del mensaje.
-
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);
-
Ya cofingure el puerto a como digital pero sigo teniendo los mismos resultados
-
¿Ya conectaste D0 a D3 de la LCD a 0V ó 5V? Seguramente ya.

Pues no se me ocurre otra falla... espera a ver si alguien más te puede ayudar.
-
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
-
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í.
-
Gracias por tu ayuda pero lo nececito para PICC de HI-TECH
-
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