22-09-2014, 12:01
Hola, estoy intentando enviar datos al display de 16x2 de la placa del kit de info 2... el tema es que no logro imprimir lo que quiero, siempre me salen geroglificos, por lo que deduzco estoy enviando mal los datos, el tema es que es de 4 bits el bus para los datos y no de 8 (que si fuera de 8 seria un golaso jaja). les paso el codigo de inicializacion (que segun estuve googleando tenes que indicar primero que se va a trabajar con 4 bits, y luego reconfirmar eso enviando una trama partida), tambien les paso el codigo para enviar el dato a imprimir. Espero alguien pueda ayudarme con esto, ya le di muchas vueltas al codigo. Saludos y gracias!
Funcion de inicializacion:
Funcion para la escritura:
Funcion de inicializacion:
void init_lcd(void)
{
unsigned int i=0;
//Configuro pines como gpio
gpio_func(LCD_DATO_4,0);
gpio_func(LCD_DATO_5,0);
gpio_func(LCD_DATO_6,0);
gpio_func(LCD_DATO_7,0);
gpio_func(LCD_E,0);
gpio_func(LCD_RST,0);
//Configuro pines como salida
GPIOs[0].FIODIR |= (1<<5);
GPIOs[0].FIODIR |= (1<<10);
GPIOs[2].FIODIR |= (1<<4);
GPIOs[2].FIODIR |= (1<<5);
GPIOs[0].FIODIR |= (1<<4);
GPIOs[2].FIODIR |= (1<<6);
gpio_set(LCD_E, 0 );
//Los bits se leen de LCD_DATO_7 hasta LCD_DATO_4
// Configuracion en 4 bits ENVIO: 0010
gpio_set(LCD_DATO_4, 0 );
gpio_set(LCD_DATO_5, 1 );
gpio_set(LCD_DATO_6, 0 );
gpio_set(LCD_DATO_7, 0 );
gpio_set(LCD_RST, 0 );
gpio_set(LCD_E, 1 );
for(i=0; i<5; i++);//doy pequeña demora
gpio_set(LCD_E, 0 );
//Ahora se debe confirmar que el envio sera de 4 bits y se envia en 2 tramas: 00101000
gpio_set(LCD_DATO_4, 0 );
gpio_set(LCD_DATO_5, 1 );
gpio_set(LCD_DATO_6, 0 );
gpio_set(LCD_DATO_7, 0 );
gpio_set(LCD_RST, 0 );
gpio_set(LCD_E, 1 );
for(i=0; i<5; i++);//doy pequeña demora
gpio_set(LCD_E, 0 );
gpio_set(LCD_DATO_4, 0 );
gpio_set(LCD_DATO_5, 0 );
gpio_set(LCD_DATO_6, 0 );
gpio_set(LCD_DATO_7, 1 );
gpio_set(LCD_RST, 0 );
gpio_set(LCD_E, 1 );
for(i=0; i<5; i++);//doy pequeña demora
gpio_set(LCD_E, 0 );
//Inicializo valores del lcd
escribir_lcd(0x0E,0);//Enciendo, pongo cursor y desabilito parpadeo (00001110 = 0x0E)
escribir_lcd(0x38,0);
escribir_lcd(0x01,0);//clear
escribir_lcd(0x02,0);//pongo cursor en primera posicion
//Pruebo imprimir un caracter
escribir_lcd(0x30,1);
escribir_lcd(0x00,1);
}
Funcion para la escritura:
void escribir_lcd(uint32_t dato, unsigned int modo) //modo = 1 (DATOS) / modo = 0 (FUNCION)
{
unsigned int i=0;
if(modo != 0)
gpio_set(LCD_RST,1);
else
gpio_set(LCD_RST,0);
//Primero debo escribir los 4 bits mas significativos (los de la izquierda) y luego mandar los 4 bits menos significativos
//Mando la segunda trama de bits mas alta (los 4 primeros)
//lleno el dato en los pines para enviar
gpio_set(LCD_DATO_4, (dato>>4)&1 );
gpio_set(LCD_DATO_5, (dato>>5)&1 );
gpio_set(LCD_DATO_6, (dato>>6)&1 );
gpio_set(LCD_DATO_7, (dato>>7)&1 );
//abilito la lectura de los pines, doy una demora para dar tiempo a la lectura y la cierro
gpio_set(LCD_E,1);
for(i=0; i<5; i++);
gpio_set(LCD_E,0);
//Mando la primera trama de bits mas baja (los 4 ultimos)
//lleno el dato en los pines para enviar
gpio_set(LCD_DATO_4, (dato>>0)&1 );
gpio_set(LCD_DATO_5, (dato>>2)&1 );
gpio_set(LCD_DATO_6, (dato>>1)&1 );
gpio_set(LCD_DATO_7, (dato>>3)&1 );
//abilito la lectura de los pines, doy una demora para dar tiempo a la lectura y la cierro
gpio_set(LCD_E,1);
for(i=0; i<5; i++);
gpio_set(LCD_E,0);
}