Otra vez por aquí amigos foreros.
Les cuento que solucioné el problema del lcd fantasma!!! .
El lcd que tengo es un marca FORDATA FDCC1602G.
Se ve que este guacho lcd es un poco perezoso y le tengo que dar más tiempos entre instrucción e instrucción.-
Solución:
1ro hice pruebas con proton y andaba bien el display.
2do hice pruebas con asm y andaba bien el display.
3ro Entonces me empeciné a solucionar el problema de usar CCS que es el lenguaje que quiero aprender a full
Probé cuanta librería encontré. y nada. siempre igual. Seguía sin ver nada.
O probando con el reset hasta que se veía bien con contraste a full.
4to para ver paso por paso como se inicializaba creé el programa que postéo más abajo. Y exageré los tiempos para estar tranquilo que no fallara el LCD y boalá!!!!!!. Ahora anda bien.
5to Estoy como perro con dos colas.-
6to Una vez más gracias pozeidón20 por tu respuesta.
Un abrazo a todos.
Jukinch
Aquí va el programa:
///////////////////////////////////////////////////////////////////////////////
// Autor: JUKINCH para el foro todopic
// Fecha: 30/ENERO/08
//
// Programa: INICIALIZACIÓN DE LCD en 8 bits
// Version: 0.0
//
// Dispositivo: PIC 16F84A Compilador: CCS vs3.42
// Entorno IDE: ccs
// PIC: 16f84a
// Notas: El programa está hecho para ejemplificar como see inicializa
// el display LCD HITACHI o Compatible.-
// Y escribe HOLA TODO PIC
// El código no es óptimo. Se podría simplificar usando funciones.
// Es para ejemplificar.-
// Además los tiempos de espera entre instrucción e instrucción se hicieron
// mucho más largos para evitar que se sature el display
///////////////////////////////////////////////////////////////////////////////
// Conexión del LCD al Pic (configuración de pines)
//
// PIC LCD
//
// PORTA.0 E
// PORTA.1 RS
// PORTA.2 R_W
//
//
//
// PORTB.0 D0
// PORTB.1 D1
// PORTB.2 D2
// PORTB.3 D3
// PORTB.4 D4
// PORTB.5 D5
// PORTB.6 D6
// PORTB.7 D7
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
#include <16f84a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
void strobe_enable(void); // declaro función
//------Programa principal--------------------------------------
void main(void)
{
//------Puertos y pines-----------------------------------------
set_tris_a(0b00000); // puerto a como salidas
set_tris_b(0b00000000); // puerto b como salidas
disable_interrupts(GLOBAL); // todas las interrupciones desactivadas
//-----Inicializo el LCD------------------------
output_low(PIN_A1); // RS = 0;
output_low(PIN_A2); // R_W = 0;
output_low(PIN_A0); // E = 0;
delay_ms(500); // espera más de 15 milisegundos para que le llegue al display
// el mínimo requerido de vdd
output_b(0b00110000); //inicializo el lcd en 8 bits hex = 0x030
strobe_enable(); // espera más de 5 milisegundos.
output_b(0b00110000); //inicializo el lcd en 8 bits hex = 0x030
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b00110000); //inicializo el lcd en 8 bits hex = 0x030
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b00111000); //establece display de 2 lineas y caracteres de 5x8
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b00001000); // Apaga el display
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b00000001); // Borra el display
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b00000110); // Entry mode set
strobe_enable(); // espera más de 160 microsegundos.-
//-----Fin de inicialización de LCD------------------------
//-----escribo en LCD------------------------
output_b(0b00000010); // Cursor al Home
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b00001100); // Prendo display
strobe_enable(); // espera más de 160 microsegundos.-
// --------- prepara para mandar caracteres ----------------------------------
output_high(PIN_A1); // RS = 1; Poner a positivo la señal de 'RS' (Envio de un dato)
output_low(PIN_A2); // R_W = 0;
//-----ESCRIBE HOLA ------------------------
output_b(0b01001000); // letra H. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b01001111); // letra O. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b01001100); // letra L. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b01000001); // letra A. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
//-----MUEVE CURSOR PARA HACER UN ESPACIO ------------------
//-----prepara para mandar comandos ------------------------
output_low(PIN_A1); // RS = 0; Poner a negativo la señal de 'RS' (Envio de comando)
output_low(PIN_A2); // R_W = 0;
output_b(0b00010100); // desplaza el cursor hacia la derecha
strobe_enable(); // espera más de 160 microsegundos.-
// --------- prepara para mandar caracteres ----------------------------------
output_high(PIN_A1); // RS = 1; Poner a positivo la señal de 'RS' (Envio de un dato)
output_low(PIN_A2); // R_W = 0;
//-----ESCRIBE TODO ------------------------
output_b(0b01010100); // letra T. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b01001111); // letra O. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b01000100); // letra D. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b01001111); // letra O. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
//-----MUEVE CURSOR PARA HACER UN ESPACIO ------------------
//-----prepara para mandar comandos ------------------------
output_low(PIN_A1); // RS = 0; Poner a negativo la señal de 'RS' (Envio de comando)
output_low(PIN_A2); // R_W = 0;
output_b(0b00010100); // desplaza el cursor hacia la derecha
strobe_enable(); // espera más de 160 microsegundos.-
// --------- prepara para mandar caracteres ----------------------------------
output_high(PIN_A1); // RS = 1; Poner a positivo la señal de 'RS' (Envio de un dato)
output_low(PIN_A2); // R_W = 0;
//-----ESCRIBE PIC ------------------------
output_b(0b01010000); // letra P. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b01001001); // letra I. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
output_b(0b01000011); // letra C. Enviar el byte de datos (8 bits en los pines D0 a D7)
strobe_enable(); // espera más de 160 microsegundos.-
//-----prepara para mandar comandos ------------------------
output_low(PIN_A1); // RS = 0; Poner a negativo la señal de 'RS' (Envio de comando)
}
//-----definición de funciones--------------------------------------
void strobe_enable(void)
{
output_high(PIN_A0); //E=1; // ACTIVA la señal de 'E' (a positivo)
delay_ms(25);
output_low(PIN_A0); //E=0; // Desactivar la señal de 'E' (a negativo)
}