hola,
Estoy teniendo problemas con la pantalla LCD en el modo 4 bits, no se muestra los mensajes.
¿Me puedes ayudar?
Aquí estoy utilizando el código:
//LCD => 4 bits
#include<p30f4011.h>
//Configuración el bits
_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF);
_FGS(CODE_PROT_OFF);
#define ENABLE PORTEbits.RE5 //pin de la activación
#define RS PORTEbits.RE4 //Selección comando/escrito
#define D7 PORTBbits.RB3 //datos del LCD (4 bits)
#define D6 PORTBbits.RB2
#define D5 PORTBbits.RB1
#define D4 PORTBbits.RB0
//vector del configuración de LCD=>4 bits
unsigned char config[13]={0x03,0x03,0x03,0x02,0x02,0x08,0x00,0x08,0x00,0x01,0x00,0x01,0x0c};
//vector de los retrasos
unsigned int retraso[13]={0,0,50,0,50,0,2000,0,0,2000,0,2000,50};
//mensajes de LCD
unsigned char mem1[5]={'d','s','P','I','C'};
unsigned char mem2[7]={'3','0','F','4','0','1','1'};
//rutina de demora de (tiempo*1us)
void delay_us(unsigned tiempo)
{
TMR5 = 0; //Zera temporizador para el inicio del conteo
PR5 = 16; //Ajuste el período de registro
T5CON=0; //Modo de temporizador, Prescaler 1:1
IFS1bits.T5IF = 0; //limpia el flag de temporizador
T5CONbits.TON = 1; //activa temporizador
while(tiempo != 0)
{
while(IFS1bits.T5IF == 0); //la espera de 1us
IFS1bits.T5IF == 0; //limpia el flag de temporizador
tiempo--; //decrement tiempo
}
T5CONbits.TON = 0; //desactiva el Timer5
}
//rutina para el modo de 4 bits
void Niblle_LCD(unsigned char x)
{
D7 = (unsigned char)((x&0x08)>>3);
D6 = (unsigned char)((x&0x04)>>2);
D5 = (unsigned char)((x&0x02)>>1);
D4 = (unsigned char)((x&0x01));
ENABLE=1;
delay_us(200);
ENABLE=0;
delay_us(200);
}
void Escribir_LCD(unsigned char x) //rutina para escribir LCD
{
Niblle_LCD(x >> 4);
Niblle_LCD(x);
}
void Inicio_LCD() //Inicio LCD (4 bits)
{
unsigned char y;
delay_us(30000);
RS=0; //comando LCD
for(y=0;y<13;y++)
{
Escribir_LCD(config[y]);
delay_us(retraso[y]);
}
RS=1;
}
void Comando_LCD(unsigned char x)
{
RS=0;
Escribir_LCD(x);
RS=1;
}
void Primera_Linea(void){Comando_LCD(0x80);}
void Segunda_Linea(void){Comando_LCD(0xc0);}
main()
{
Inicio_LCD();
unsigned char i;
Primera_Linea();
for(i=0;i<5;i++) //'dsPIC'
{ Escribir_LCD(mem1); }
Segunda_Linea();
for(i=0;i<7;i++) //'30F4011'
{ Escribir_LCD(mem2); }
}
Saludo,
Rodrigo