Ayuda con LCD 2x16, no logro insertar caracter especial

#1
Buenas, de antemando gracias por interesarse en el tema (es mi primera vez que posteo (y)) . Hace poco tiempo empece a involucrarme al mundo de los PIC mediante la programacion en Proton IDE, resulta que estoy intentando hacer una especie de animacion en una LCD 2x16 para lo que necesito caracteres especiales, que segun lo que se, yo mismo debo incluir en la RAM de la LCD, en proton encontre una aplicacion llamada "LCD Chr Generator" con la cual puedo configurar uno por uno los displays (si se puede llamar asi) de mi LCD dibujando el caracter que deseo una vez que utilizo esta aplicacion me aparece la siguiente linea de comando

Print $FE,$40,$00,$1F,$1F,$18,$18,$1F,$1F,$00

Segun lo que he investigado el $FE corresponde a un comando especial que seguido de $40 indica que se escribira en Chr(0) y de ultimo $00 indica que se termino de ingresar los datos de la cadena.

Mi problema es que agrego esta linea de codigo a mi programa pero no logro visualizar nada en la pantalla LCD de la simulacion



Les adjunto el codigo para que lo revisen aunque la configuracion creo que esta bien hecha​


Código:
 Device 16F877A
XTAL 20
ALL_DIGITAL 1

LCD_DTPIN = PORTB.4
LCD_RSPIN = PORTB.2
LCD_ENPIN = PORTB.1
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0



Input PORTA.1
Output PORTB

inicio:
If PORTA.1 = 1 Then
GoTo Imprime
EndIf
If PORTA.1 = 0 Then
Cls
GoTo inicio
EndIf

Imprime:
Cls
Print $FE,$40,$00,$1F,$1F,$18,$18,$1F,$1F,$00
DelayMS 100

GoTo inicio
 
#2
Que tal intenta esta configuración el carácter es una especia de ª

Código:
Device 16F877A
XTAL 20
ALL_DIGITAL 1

LCD_DTPIN = PORTB.4
LCD_RSPIN = PORTB.2
LCD_ENPIN = PORTB.1
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0

Symbol CGRAM = $64 ' Apuntador a la Memoria CGRAM del LCD

Input PORTA.1
Output PORTB

inicio:
If PORTA.1 = 1 Then
GoTo Imprime
EndIf
If PORTA.1 = 0 Then
Cls
GoTo inicio
EndIf

Imprime:
Print Cls ' Limpia la pantalla LCD
Print $40,$00,$1F,$1F,$18,$18,$1F,$1F,$00
DelayMS 100

GoTo inicio
 
#4
Para modificar un caracter en pantalla, simplemente tendrias que modificar el valor del contenido de la direccion en donde queres hacer el cambio.

No recuerdo bien, pero creo que las direcciones eran:

0x00 -----> 0x10 (16 columnas)
0x40 -----> 0x50 (16 columnas)

Entonces, si quisieras modicar el caracter en la 3era posicion de la fila 1, deberia hacer esto:

1- Seteo la direccion 0x03, para lo cual debo mandar 0x83 (1000-0011, el 1er 1 indica que se trata de una direccion).

2- Enviar el ascii.
 
#5
Hola, a todos, tengo una duda, como puedo hacer para escribir palabras con tilde en una pantalla LCD 16x2.... y tambien como puedo hacer que salga la letra "ñ" .

EJM:
Quisiera que en la pantalla salga: " sólo " //(en particular me refiero sólo a la tilde..)


Ahh... lo olvidaba, estoy trabajando con un ARDUINO uno.
Gracias a sus posible respuestas.
 
#7
Estimados,
estoy teniendo problemas con la creación de caractéres especiales en un lcd 16x2.
En Proteus simula barbaro, pero al momento de la realidad no aparecen los caracteres en el display o aparecen otros diferentes a los grabados en la CgRam.
Adjunto extracto del código:
Código:
char customChar[8] = {
	0b01110,
	0b11011,
	0b10001,
	0b10001,
	0b10001,
	0b10001,
	0b11111,
	0b11111
};
Código:
void LCDCharBuilder(unsigned char loc, unsigned char *p){
	unsigned char i;
	if(loc<8){
		comandXLCD(0x40+(loc*8));
		for(i=0;i<8;i++)
			putcXLCD(p[i]);
		}
		comandXLCD(0x80);
	}
Código:
void LCD (void){
	OpenXLCD (FOUR_BIT & LINES_5X7 ); //
	comandXLCD (0x06); //
	comandXLCD (0x0C); //
	comandXLCD(0x01);
	
	LCDCharBuilder(1, customChar);

	gotoxyXLCD(3,1);
	putcXLCD(0x01);
Aclaro que el LCD está funcionando correctamente, ya que puedo visualizar caractéres de la ROM perfectamente usando el coomando putrsXLCD.

Muchas gracias por cualquier ayuda.
 
#10
Al final pude resolver el tema de los caracteres especiales.
Estoy usando una versión de LCD que ya tiene en su ROM los caracteres de español, como la ñ que era justamente lo que queria visualizar.

Adjuntando un BusyXLCD() entre lineas pude enviar correctamente el codigo binario de la letra/simbolo que quiero mostrar, segun la tabla del fabricante del LCD.

Adjunto codigo:
Código:
putrsXLCD("  Cumplea");
    BusyXLCD();
    putcXLCD(0b10011011); //Letra ñ según tabla del fabricante.
    putrsXLCD("os");
Muestra en pantalla: "Cumpleaños".
Saludos!

---------- Actualizado ----------


Adjunto header para manejo fácil de los caractéres especiales:

Código:
#ifndef __Char_Especiales_H
#define __Char_Especiales_H

#include <p18cxxx.h>
#include <xlcd.h>

/********************************************************************
*       Function Name:  Char_Especiales                             *
*                                           *
*       Parameters:     data byte to be written to LCD              *
*       Description:    Esta rutina asigna nombres a los comandos    *
*        de caracteres especiales en LCD Winstar 1602 con             *
*        controlador ST7066 y ROM 0B.                                *
*********************************************************************/


#define enie putcXLCD(0b10011011)
#define a_tilde putcXLCD(0b10100000)
#define u_tilde putcXLCD(0b10100011)
#define i_tilde putcXLCD(0b10100001)
#define o_tilde putcXLCD(0b10100010)
#define e_tilde putcXLCD(0b10000010)
#define enie_mayus putcXLCD(0b10011100)
Para escribir "Cumpleaños" entonces:

Código:
putrsXLCD("Cumplea");
BusyXLCD();
enie;
putrsXLCD("os");
Solamente hay que incluir la libreria en el archivo main.
Código:
#include "Char_Especiales.h"
y adjuntarlo al Project en el árbol de desarrollo.
 
Última edición por un moderador: