# Escribir bien en los LCD.



## Meta (Mar 24, 2008)

En el LCD 2x16 al escribir palabras con tilde, por ejemplo.

*Está*, me aparece en el LCS *Estä*, cosas así.

¿Hay algún método para resolverlo?


----------



## eidtech (Mar 25, 2008)

para escribir bien:

lcd_putsf("bien");








crea tu caracter personalizado en la memoria RAM disponible y usalo, si no me equivoco el LCD lo tendras que usar en otro modo.  Nunca lo he hecho, pero se que se puede.


----------



## Meta (Mar 25, 2008)

Bueno, me refiero a ASM. Gracias.


----------



## pic-man (Mar 25, 2008)

Meta, podrías probar mandando el caracter en ASCII, tal vez tu lo escribes 'á' en mplab, en vez de mandar el caracter mandalo con su equivalente en código ascii

á = 0xE1 = b'11100001'
é = 0xE9 = b'11101001'
í = 0xED = b'11101101'
ó = 0xF3 = b'11110011'
ú = 0xFA = b'11111010'

ahí está el equivalente en hexadecimal y en binario del código ascii, intenta mandando así el dato (en hexadecimal o binario, el que prefieras), debe funcionar porque así aparece en el datasheet del LCD.


----------



## Meta (Mar 25, 2008)

```
; En la pantalla se visualizan varios mensajes, uno detrás de otro. Cada mensaje permanece
; durante 2 segundos. Entre mensaje y mensaje la pantalla se apaga durante unos 200 ms.
;
; ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK  0x0C
	ENDC

; ZONA DE CÓDIGOS ********************************************************************

	ORG	0
Inicio
	call	LCD_Inicializa
Principal
	movlw	Mensaje0			; Apunta al mensaje 0.
	call	Visualiza
	movlw	Mensaje1			; Apunta al mensaje 1.
	call	Visualiza
	movlw	Mensaje2			; Apunta al mensaje 2.
	call	Visualiza
	movlw	Mensaje3			; Apunta a Menajazo número 3.
	call	Visualiza
	movlw	Mensaje4			; Apunta al mensaje 4.
	call	Visualiza
	movlw	Mensaje5			; Apunta al mensaje 5.
	call	Visualiza
	movlw	Mensaje6			; Apunta al mensaje 6.
	call	Visualiza
	call	Retardo_5s			; Permanece apagada durante este tiempo.
	goto	Principal			; Repite la visualización de todos los mensajes.
;
; Subrutina "Visualiza" -----------------------------------------------------------------
;
Visualiza
	call	LCD_Mensaje
	call	Retardo_2s			; Visualiza el mensaje durante este tiempo.
	call	LCD_Borra			; Borra la pantalla y se mantiene así durante 
	call	Retardo_200ms		; este tiempo.
	return
;
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
	addwf	PCL,F
Mensaje0						; Posición inicial del mensaje 0.
	DT "LCD 2x16", 0x00
Mensaje1						; Posición inicial del mensaje 1.
	DT "compatible con", 0x00	
Mensaje2						; Posición inicial del mensaje 2.
	DT "HD44870.", 0x00
Mensaje3
	DT "Este LCD está", 0x00
Mensaje4
	DT "controlado con", 0x00
Mensaje5
	DT "el PIC 16F84A", 0x00
Mensaje6
	DT "25-03-2008", 0x00

	INCLUDE  <LCD_4BIT.INC>
	INCLUDE  <LCD_MENS.INC>
	INCLUDE  <RETARDOS.INC>
	END
```

¿Exactamente dónde pongo eso con la directiva *DT*?


```
; Voy a cambiar la á por el 0xE1.
Mensaje3
	DT "Este LCD está", 0x00

Mensaje3
	DT "Este LCD est0xE1", 0x00
```

Lo acaba de comprobar y no funciona, capaz que hay que programarlo con *retlw*.


----------



## Leon Elec (Mar 25, 2008)

Meta, podrías adjuntar los 3 includes (LCD_4bit.inc, LCD_mens.inc y Retardos.inc el último porque me interesa, los primeros 2 ya que puede haber un error en el programa.

El mplab, solo se encarga de pasar un caracter en ascii, me llama la atención que lo ponga de esa manera en el LCD.

Cuando se utiliza el retlw es porque para mostrar el mensaje, se va a una tabla, pero aquí se utiliza otra tabla. debe ser por eso que está tomando mal la letra.


----------



## Meta (Mar 25, 2008)

Esas librerías me vino en un libro y las puedes descargar directamente en www.pic16f84a.com

Aún así te lo pongo aquí.


----------



## Leon Elec (Mar 25, 2008)

Pues, la verdad, es que no entiendo porqué sale de esa manera.

Intenta poner de esta manera:

Mensaje0

            DT   "á", 0x00


si solo de esta manera lo toma, quiere decir que el MPLAB, está haciendo mal la convesión. Por el contrario, si aún no sale bien, prueba de esta manera

Mansaje0
          DT     0xE1, 0x00

si es que 0xE1 corresponde a la letra á, y si aún no anda, intentaremos otra cosa


----------



## Meta (Mar 25, 2008)

Si corresponde la letra á. En el simulador del Proteus también da el mismo error.


----------



## Meta (Mar 25, 2008)

He probado esto aquí abajo con tildes.


```
DT "áÁ éÉ óÓ,etc", 0x00
```


----------



## Meta (Mar 25, 2008)

Por cierto, me he fijado que en la tabla de CGROM de Hitachi no incluye las letras con tildes.

En otras tabla de ASCII tampoco vale.

http://www.cdrummond.qc.ca/cegep/informaciónrmat/Professeurs/Alain/Images/ascii2.gif

¿Alguien ha probado utilizando palabras con tildes y que funcione?


----------



## Meta (Mar 25, 2008)

pic-man dijo:
			
		

> Meta, podrías probar mandando el caracter en ASCII, tal vez tu lo escribes 'á' en mplab, en vez de mandar el caracter mandalo con su equivalente en código ascii
> 
> á = 0xE1 = b'11100001'
> é = 0xE9 = b'11101001'
> ...



Tampoco funciona.


```
; ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK 0x0C
	ENDC

; ZONA DE CÓDIGOS ********************************************************************

	ORG	0
Inicio
	call	LCD_Inicializa
	movlw	'E'
	call	LCD_Caracter
	movlw	's'
	call	LCD_Caracter
	movlw	't'
	call	LCD_Caracter
	movlw	b'11100001'      ; Letra á.
	call	LCD_Caracter
	sleep							; Entra en modo de bajo consumo.

	INCLUDE  <LCD_4BIT.INC>			; Subrutinas de control del módulo LCD.
	INCLUDE  <RETARDOS.INC>			; Subrutinas de retardo.
	END								; Fin del programa.
```


----------



## pic-man (Mar 25, 2008)

Si te fijas en la página 6 del datasheet aparecen los caractéres que puede desplegar el LCD, en ningún lado aparecen las letras con acento pero si las letras con diéresis

ä = 0xE1

Entonces tu LCD no soporta acentos, no es ningún error, es que así está diseñado el LCD.


----------



## Meta (Mar 25, 2008)

En realidad no es ese mi LCD, es este.

http://www.msebilbao.com/tienda/product_información.php?products_id=301

Digo yo que habrá una forma de poner tildes. En caso contrario, fuerte porquería de LCD que compré ahí. Menos mal que no me dio por comprar el del 4x20 que vale más caro.

Aún así voy a consultar al autor del libro a ver que opina.


----------



## pic-man (Mar 25, 2008)

Si no es tu LCD al menos debe usar el mismo microcontrolador ya que corresponde el caracter que mandas (0xE1) con el que aparece (ä). Puedes crear tu propio caracter escribiendo en la RAM del LCD, en ese datasheet no parece explicar como. Te adjunto el datasheet del lcd hitachi 44780, ahi viene explicado como crear caractéres.


----------



## Meta (Mar 25, 2008)

Hola:

Según me han dicho ellos, este LCD es un compatible con el Hitachi 44870.

Estoy leyendo el pdf, en la página 15 te dice cosas a base de pixel, en la página 18 se ve otra tabla la letra á con el binario 11100001. Pues no funciona si pongo eso.

Eso si, esta tabla es el ROM code A02, ¿Cómo paso ahí? Quizás sea por eso.

Usar este ejemplo de código.


```
; ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK 0x0C
	ENDC

; ZONA DE CÓDIGOS ********************************************************************

	ORG	0
Inicio
	call	LCD_Inicializa
	movlw	'E'
	call	LCD_Caracter
	movlw	's'
	call	LCD_Caracter
	movlw	't'
	call	LCD_Caracter
	movlw	b'11100001'     ; Letra ä, quiero la á.
	call	LCD_Caracter
	sleep							; Entra en modo de bajo consumo.

	INCLUDE  <LCD_4BIT.INC>			; Subrutinas de control del módulo LCD.
	INCLUDE  <RETARDOS.INC>			; Subrutinas de retardo.
	END								; Fin del programa.
```








¿Funcionaría usando este tipo de cosas? Es decir, creando tus porpios pixeles, pero si podemos acceder a la segunda tabla de la página 18 de este LCD mejor que mejor.


```
CGRAM_Escribe
	addwf	PCL,F
	
; Bateria al 0%, byte 0 de la CGRAM.
							;   ________
	retlw	b'00001110'		;  |    xxx |
	retlw	b'00001010'		;  |    x x |
	retlw	b'00010001'		;  |   x   x|
	retlw	b'00010001'		;  |   x   x|
	retlw	b'00010001'		;  |   x   x|
	retlw	b'00010001'		;  |   x   x|
	retlw	b'00010001'		;  |   x   x|
	retlw	b'00011111'		;  |   xxxxx|
							;   --------
```


----------



## pic-man (Mar 25, 2008)

Tienes razón, no me había fijado que era con el ROM code A02. Estuve revisando el datasheet y en ningun lado vi como accesar a esa tabla.


----------



## Tomasito (Mar 26, 2008)

Acá tenés un ejemplo de creación de caracteres especiales en un LCD que funciona (simulado con proteus):
http://personales.ya.com/cepalacios/Proy_bateria_carga.htm

La contraseña del ZIP es "D.P.E." (sin las comillas)


Espero que te sirva!



Salu2!


----------



## Jack921 (May 12, 2010)

Gracias, necesitaba las librerías, lamento no poder ayudarlos con el problema de las letras, pero me resolvieron el mío.


----------



## gonpa (Oct 16, 2010)

hola, yo tengo una duda con respecto a los display lcd, yo programa el at90s2313 de atmel y manejo con el un lcd, teclado, dos reles, un buzzer y nada mas creo....

lo que pasa es lo siguiente sin conectar el bkack light del lcd anda perfecto todo....pero cuando lo conecto por ejemplo  cuando deberia sonar el buzzer no suena, como que no le da el cuero o algo

y el regulador 7805 calienta bastante

podria ser falta de corriente?? tanto consume ese back light?

tendre que usar otro metodo de regulacion para el micro?

muchas gracias espero que me ayuden con mi problema.


----------



## Astharoth (Feb 9, 2011)

Saludos foreros, tengo un problema con un LCD no puedo hacerlo arrancar cuando lo alimentó, aparece la primera fila los rectangulos llenos y la segunda no aparece, ahora mi pregunta es ¿Las rutinas del LM016L funcionan con el  LM093LN? ambos son de Hitachi, pero el LM093LN tiene un microcontrolador HD44780A00, que creo que no es lo mismo que el HD44780. Adjunto un pequeño datasheet del LM093LN.

PD. Ayudenme que soy novato en el manejo de LCD's


----------

