Escribir bien en los LCD.

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?
 
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, 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.
 
Código:
; 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?

Código:
; 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.
 
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.
 
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
 
Si corresponde la letra á. En el simulador del Proteus también da el mismo error.

letra_a.jpg
 
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'
í = 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.

Tampoco funciona.

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 á.
	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.
 

Adjuntos

  • lm016l_256.pdf
    350.7 KB · Visitas: 113
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.
 
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.
 

Adjuntos

  • lcd_hitachi44780_153.pdf
    278.4 KB · Visitas: 119
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.

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.

Código:
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|
							;   --------
 
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.
 
Atrás
Arriba