Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

04/05/2010 #61

Avatar de Chelouruguay

Respuesta: Control de Display LCD con microcontrolador PIC
Yo hice unos proyectos en un LCD con el Hitachi y trabaje a 48khz y anduvo sin problemas.

Habria que ver cada cuanto actualizas los valores del LCD, ahi estas dependiendo de la respuesta que debe tener el mismo, como te dicen aca mas arriba.

Saludos
04/05/2010 #62


Respuesta: Re: Proyectos con LCD y PIC16F84A
MaMu dijo: Ver Mensaje
Me alegra mucho que hayas logrado el control del LCD, pero ahora que quizas estés mas metido en el tema, te propongo un desafio mas grande, con resultados mucho mas que satisfactorios.

Fuente : http://www.apetech.de/article.php?artId=3&nnId=12



Puedes darle una miradita a este interesante proyecto... a continuacion te dejo una imagen que demuestra la calidad y el nivel del mismo...



Bajar Proyecto

Saludos, espero que lo encuentres interesante.
hola mamu podrias subir el proyecto que mencionas aqui , ya no esta mas y el link no funciona , un saludo
05/05/2010 #63

Avatar de FRYCK

Respuesta: Control de Display LCD con microcontrolador PIC
sammaael dijo: Ver Mensaje
ok entonces segun el odelo tendre que incorporar retardos en i rutina por lo que entendi o no es asi?
De ser asi como saber que tiempos de retardo debo incluir, dependera de la frecuencia de operacion del display?

Hola sammaael si para el manejo de la lcd se tienen que tener en cuenta unos tiempos minimos que depende del controlador de esta y de la función que se esta realizando si es de lectura escritura etc te adjunto algo de información en donde los describen http://www.docstoc.com/docs/22273558...C-El-PIC16F84/
Archivos Adjuntos
Tipo de Archivo: pdf LCD[1].pdf (142,3 KB (Kilobytes), 373 visitas)
06/05/2010 #64

Avatar de sammaael

Respuesta: Control de Display LCD con microcontrolador PIC
Muchas gracias a todos por guiarme ahora falta comprar el lcd y probar cualquier duda vuelvo a preguntar MUCHAS GRACIAS!!!
07/05/2010 #65


Respuesta: Control de Display LCD con microcontrolador PIC
muy buen aporte, haber utilizado pic en mi secundaria me hubieses facilitado aprender mas rapido a usar un LCD. ja
20/05/2010 #66


Lcd itm-1602a
No consigo nada de esto mas que el pin out de este LCD de fabricante INTECH, es compatible con el conosido HITACHI 44780 de ser asi que tan compatible es? A mi criterio si es compatible perono lo se, quiero estar seguro antes de comprarlo. Que me recomiendan, este bale 32 pesos argentinos el otro unos 140
22/05/2010 #67

Avatar de Meta

Respuesta: Control de Display LCD con microcontrolador PIC
Usando el HITACHI 44780 de 2x16 la configuración es;

Código:
LCD_2Lineas4Bits5x7                    ; Define la pantalla de 2 líneas, con caracteres
    movlw    b'00101000'                ; de 5x7 puntos y conexión al PIC mediante bus de
¿Cómo lo hago para un LCD de 4x20?
28/05/2010 #68

Avatar de sammaael

Respuesta: Control de Display LCD con microcontrolador PIC
Amigos al fin compre un LCD modelo gdm1602k(adjunto un pequeño data) la duda que tengo es que el display consta de una matriz de 5x8 y todas las librerias que he visto esta considerado para 5x7. La libreria que utilizo es la siuiente pero no se exactamente que cambios deberia hacer para que el lcd me funcione.

Código:
;**************************** Librería "LCD_4BIT.INC" ***********************************

	CBLOCK
	LCD_Dato
	LCD_GuardaDato
	LCD_GuardaTRISB
	LCD_Auxiliar1
	LCD_Auxiliar2
	ENDC

LCD_CaracteresPorLinea	EQU	.16			; Número de caracteres por línea de la pantalla.

#DEFINE  LCD_PinRS	PORTA,0
#DEFINE  LCD_PinRW	PORTA,1
#DEFINE  LCD_PinEnable	PORTA,2
#DEFINE  LCD_BusDatos	PORTB

; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
	bsf		STATUS,RP0				; Configura las líneas conectadas al pines RS,
	bcf		LCD_PinRS				; R/W y E.
	bcf		LCD_PinEnable
	bcf		LCD_PinRW
	bcf		STATUS,RP0
	bcf		LCD_PinRW				; En caso de que esté conectado le indica
									; que se va a escribir en el LCD.
	bcf		LCD_PinEnable			; Impide funcionamiento del LCD poniendo E=0.
	bcf 	LCD_PinRS				; Activa el Modo Comando poniendo RS=0.
	call	Retardo_20ms
	movlw	b'00110000'	
	call	LCD_EscribeLCD			; Escribe el dato en el LCD.
	call	Retardo_5ms	
	movlw	b'00110000'	
	call	LCD_EscribeLCD
	call	Retardo_200micros
	movlw	b'00110000'	
	call	LCD_EscribeLCD
	call	Retardo_20micros		; Este retardo es necesario para simular en PROTEUS.
	movlw	b'00100000'				; Interface de 4 bits.
	call	LCD_EscribeLCD
	call	Retardo_20micros		; Este retardo es necesario para simular en PROTEUS.
	
; Ahora configura el resto de los parámetros: 

	call	LCD_2Lineas4Bits5x7		; LCD de 2 líneas y caracteres de 5x7 puntos.
	call	LCD_Borra				; Pantalla encendida y limpia. Cursor al principio
	call	LCD_CursorOFF			; de la línea 1. Cursor apagado.
	call	LCD_CursorIncr			; Cursor en modo incrementar.
	return

; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.

LCD_EscribeLCD
	andlw	b'11110000'				; Se queda con el nibble alto del dato que es el
	movwf	LCD_Dato				; que hay que enviar y lo guarda.
	movf	LCD_BusDatos,W			; Lee la información actual de la parte baja
	andlw	b'00001111'				; del Puerto B, que no se debe alterar.
	iorwf	LCD_Dato,F				; Enviará la parte alta del dato de entrada
									; y en la parte baja lo que había antes.
	bsf		STATUS,RP0				; Acceso al Banco 1.
	movf	TRISB,W					; Guarda la configuración que tenía antes TRISB.
	movwf	LCD_GuardaTRISB
	movlw	b'00001111'				; Las 4 líneas inferiores del Puerto B se dejan 
	andwf	PORTB,F					; como estaban y las 4 superiores como salida.
	bcf		STATUS,RP0				; Acceso al Banco 0.
;
	movf	LCD_Dato,W				; Recupera el dato a enviar.
	movwf	LCD_BusDatos			; Envía el dato al módulo LCD.
	bsf		LCD_PinEnable			; Permite funcionamiento del LCD mediante un pequeño
	bcf		LCD_PinEnable			; pulso y termina impidiendo el funcionamiento del LCD.
	bsf		STATUS,RP0				; Acceso al Banco 1. Restaura el antiguo valor en
	movf	LCD_GuardaTRISB,W		; la configuración del Puerto B.
	movwf	TRISB
	bcf		STATUS,RP0				; Acceso al Banco 0.
	return

; Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr						; Cursor en modo incrementar.
	movlw	b'00000110'
	goto	LCD_EnviaComando
LCD_Linea1							; Cursor al principio de la Línea 1.
	movlw	b'10000000'				; Dirección 00h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea2							; Cursor al principio de la Línea 2.
	movlw	b'11000000'				; Dirección 40h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea3							; Cursor al principio de la Línea 3
	movlw	b'10010100'				; Dirección 14h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea4							; Cursor al principio de la Línea 4
	movlw	b'11010100'				; Dirección 54h de la DDRAM
	goto	LCD_EnviaComando
LCD_PosicionLinea1					; Cursor a posición de la Línea 1, a partir de la
	iorlw	b'10000000'				; dirección 00h de la DDRAM más el valor del
	goto	LCD_EnviaComando		; registro W.
LCD_PosicionLinea2					; Cursor a posición de la Línea 2, a partir de la
	iorlw	b'11000000'				; dirección 40h de la DDRAM más el valor del
	goto	LCD_EnviaComando		; registro W.
LCD_OFF								; Pantalla apagada.
	movlw	b'00001000'
	goto	LCD_EnviaComando
LCD_CursorON						; Pantalla encendida y cursor encendido.
	movlw	b'00001110'
	goto	LCD_EnviaComando
LCD_CursorOFF						; Pantalla encendida y cursor apagado.
	movlw	b'00001100'
	goto	LCD_EnviaComando
LCD_Borra							; Borra toda la pantalla, memoria DDRAM y pone el 
	movlw	b'00000001'				; cursor a principio de la línea 1.
	goto	LCD_EnviaComando
LCD_2Lineas4Bits5x7					; Define la pantalla de 2 líneas, con caracteres
	movlw	b'00101000'				; de 5x7 puntos y conexión al PIC mediante bus de
;	goto	LCD_EnviaComando		; 4 bits. 

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
;
; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
; a través del registro W. Trabaja en Modo Dato.
;
LCD_EnviaComando
	bcf		LCD_PinRS				; Activa el Modo Comando, poniendo RS=0.
	goto	LCD_Envia
LCD_Caracter
	bsf		LCD_PinRS				; Activa el "Modo Dato", poniendo RS=1.
	call	LCD_CodigoCGROM			; Obtiene el código para correcta visualización.
LCD_Envia
	movwf	LCD_GuardaDato			; Guarda el dato a enviar.
	call	LCD_EscribeLCD			; Primero envía el nibble alto.
	swapf	LCD_GuardaDato,W		; Ahora envía el nibble bajo. Para ello pasa el
									; nibble bajo del dato a enviar a parte alta del byte.
	call	LCD_EscribeLCD			; Se envía al visualizador LCD.
	btfss	LCD_PinRS				; Debe garantizar una correcta escritura manteniendo 
	call	Retardo_2ms				; 2 ms en modo comando y 50 µs en modo cáracter.
	call	Retardo_50micros
	return	

; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
; que puedan ser visualizado en el módulo LM016L.
; 
; Entrada:	En (W) el código ASCII del carácter que se desea visualizar.
; Salida:	En (W) el código definido en la tabla CGROM.

LCD_CodigoCGROM
	movwf	LCD_Dato				; Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula					; un carácter especial.
	sublw	'ñ' 					; ¿Es la "ñ"?
	btfss	STATUS,Z
	goto	LCD_EnheMayuscula		; No es "ñ".
	movlw	b'11101110'				; Código CGROM de la "ñ".
	movwf	LCD_Dato
	goto	LCD_FinCGROM
LCD_EnheMayuscula
	movf	LCD_Dato,W				; Recupera el código ASCII de entrada.
	sublw	'Ñ' 					; ¿Es la "Ñ"?
	btfss	STATUS,Z
	goto	LCD_Grado				; No es "Ñ".
	movlw	b'11101110'				; Código CGROM de la "ñ". (No hay símbolo para
	movwf	LCD_Dato				; la "Ñ" mayúscula en la CGROM).
	goto	LCD_FinCGROM	
LCD_Grado
	movf	LCD_Dato,W				; Recupera el código ASCII de entrada.
	sublw	'º' 					; ¿Es el símbolo "º"?
	btfss	STATUS,Z
	goto	LCD_FinCGROM			; No es "º".
	movlw	b'11011111'				; Código CGROM del símbolo "º".
	movwf	LCD_Dato
LCD_FinCGROM
	movf	LCD_Dato,W				; En (W) el código buscado.
	return

; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
;
; Visualiza espacios en blanco.

LCD_LineaEnBlanco
	movlw	LCD_CaracteresPorLinea
	goto	LCD_EnviaBlancos
LCD_UnEspacioBlanco
	movlw	.1
	goto	LCD_EnviaBlancos
LCD_DosEspaciosBlancos
	movlw	.2
	goto	LCD_EnviaBlancos
LCD_TresEspaciosBlancos
	movlw	.3
LCD_EnviaBlancos
	movwf	LCD_Auxiliar1			; (LCD_Auxiliar1) se utiliza como contador.
LCD_EnviaOtroBlanco	
	movlw	' '						; Esto es un espacio en blanco.
	call	LCD_Caracter			; Visualiza tanto espacios en blanco como se
	decfsz	LCD_Auxiliar1,F			; haya cargado en (LCD_Auxiliar1).
	goto	LCD_EnviaOtroBlanco
	return

; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
;
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero 
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
	movwf	LCD_Auxiliar2			; Guarda el valor de entrada.
	andlw	b'11110000'				; Analiza si el nibble alto es cero.
	btfss	STATUS,Z				; Si es cero lo apaga.
	goto	LCD_VisualizaAlto		; No es cero y lo visualiza.
	movlw	' '						; Visualiza un espacio en blanco.
	call	LCD_Caracter
	goto	LCD_VisualizaBajo

LCD_ByteCompleto
	movwf	LCD_Auxiliar2			; Guarda el valor de entrada.
LCD_VisualizaAlto
	swapf	LCD_Auxiliar2,W			; Pone el nibble alto en la parte baja.
	call	LCD_Nibble				; Lo visualiza.
LCD_VisualizaBajo
	movf	LCD_Auxiliar2,W			; Repite el proceso con el nibble bajo.
;	call	LCD_Nibble				; Lo visualiza.
;	return

; Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizará "6". 
; - Si (W)=b'10101110', se visualizará "E". 
;
LCD_Nibble
	andlw	b'00001111'				; Se queda con la parte baja.
	movwf	LCD_Auxiliar1			; Lo guarda.
	sublw	0x09					; Comprueba si hay que representarlo con letra.
	btfss	STATUS,C	
	goto	LCD_EnviaByteLetra
	movf	LCD_Auxiliar1,W
	addlw	'0'						; El número se pasa a carácter ASCII sumándole
	goto 	LCD_FinVisualizaDigito	; el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
	movf	LCD_Auxiliar1,W
	addlw	'A'-0x0A				; Sí, por tanto, se le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
	goto	LCD_Caracter			; Y visualiza el carácter. Se hace con un "goto"
									; para no sobrecargar la pila.
Probe utilizando esta libreria pero no me da resultados y la verdad estaba muy feliz cuando tenia el lcd en mis manos y ahora que no me funcio me he desanimado, pero quien dijo que seria facil....


Porfavor si alguien me puede dar una ayudita un empujoncito o algo...
Ademas estoy utilizando solo 4bits para programarlo, los bits restantes que debo hacer con ellos dejarlos sin coneccion solamente???(obviamente los que "sobran" de D0aD7)

Gracias saludos
28/05/2010 #69


Respuesta: Control de Display LCD con microcontrolador PIC
Hola amigos, me compré este LCD:

http://cgi.ebay.com/3-5-TFT-LCD-Modu...item2ea9a8bff0

color, pantalla táctil, 320x240, TFT, etc ..
pero no tengo ninguna experiencia con LCDs gráficos, y mucho menos a color, alguien puede darme una mano? cualquier programa, código, circuito, cualquier cosa es bienvenida jeje
Controlar ese aparatito no debe ser fácil ...
Lástima que Proteus no pueda simularlo ...



¿Alguien me puede dar una mano?


Saludos

link LCD: http://cgi.ebay.com/3-5-TFT-LCD-Modu...item2ea9a8bff0
29/05/2010 #70

Avatar de Meta

Respuesta: Control de Display LCD con microcontrolador PIC
Los gráficos con fotos que sepas esos LCD COLOR son retocado con Photoshop. No se ven tan perfectos como te lo muestra en la publicidad, se ven como pixelado a los móviles de Nokia de antes.

Los LCD COLOR son extremada mentes lentos y se recomienda manejarlos con PIC de alta gama, incluso de 16 a 32 Bits para manejarlo decentemente si hay muchos cambios de imagen.
31/05/2010 #71

Avatar de Rijiru

Respuesta: Control de Display LCD con microcontrolador PIC
Hola gente del foro, me estoy intoduciendo mas en el tema del manejo de LCD 16x2 con PIC, la verdad la libreria en CCs viene diseñada para los PIC cuya estructura tienen puerto D de 8 bits, para poder manejar LCD con PIC16F84 le adjunto la libreria que utilice para drivearlo en la libreria viene definido el puerto B para manejar LCD y solo hay que guardarlo como archivo de extencion .c, espero y sea de ayuda.



Saludos
Archivos Adjuntos
Tipo de Archivo: txt LCD_B.txt (5,4 KB (Kilobytes), 109 visitas)
31/05/2010 #72

Avatar de sammaael

Me funciono!!!!
Bueno solucione el problema y al fin pude utilizar mi LCD 16x2
Aca les dejo la libreria modificada para utilizarlo con el modulo lcd GDM1602k

SALUDOS!
Código PHP:
;**************************** Librería "LCD_4BIT.INC" ***********************************
;
esta comprobada su utilizacion con el modulo lcd GDM1602K
    CBLOCK
    LCD_Dato
    LCD_GuardaDato
    LCD_GuardaTRISB
    LCD_Auxiliar1
    LCD_Auxiliar2
    ENDC

LCD_CaracteresPorLinea    EQU    .16            
Número de caracteres por línea de la pantalla.

#DEFINE  LCD_PinRS    PORTA,0
#DEFINE  LCD_PinRW    PORTA,1
#DEFINE  LCD_PinEnable    PORTA,2
#DEFINE  LCD_BusDatos    PORTB

Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
Inicialización del módulo LCDConfigura funciones del LCDproduce reset por software,
borra memoria y enciende pantallaEl fabricante especifica que para garantizar la
configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
    call    Retardo_5ms    
;LO AGREGE YOOO
    bsf        STATUS
,RP0                Configura las líneas conectadas al pines RS,
    
bcf        LCD_PinRS                R/W y E.
    
bcf        LCD_PinEnable
    bcf        LCD_PinRW
    bcf        STATUS
,RP0




    bcf        LCD_PinRW                
En caso de que esté conectado le indica
                                    
que se va a escribir en el LCD.
    
bcf        LCD_PinEnable            Impide funcionamiento del LCD poniendo E=0.
    bcf     LCD_PinRS                
Activa el Modo Comando poniendo RS=0.
    call    Retardo_20ms
    movlw    
b'00110000'    
    
call    LCD_EscribeLCD            Escribe el dato en el LCD.
    
call    Retardo_5ms    
    movlw    
b'00110000'    
    
call    LCD_EscribeLCD
    call    Retardo_200micros
    movlw    
b'00110000'    
    
call    LCD_EscribeLCD
    call    Retardo_200micros        
Este retardo es necesario para simular en PROTEUS.
    
movlw    b'00100000'                ; Interface de 4 bits.
    
call    LCD_EscribeLCD
    call    Retardo_200micros        
Este retardo es necesario para simular en PROTEUS.
    
Ahora configura el resto de los parámetros

    
call    LCD_2Lineas4Bits5x7        LCD de 2 líneas y caracteres de 5x7 puntos.
    
call    LCD_Borra                Pantalla encendida y limpiaCursor al principio
    call    LCD_CursorOFF            
de la línea 1. Cursor apagado.
    
call    LCD_CursorIncr            Cursor en modo incrementar.
    return

Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
Enable del LCDPara no alterar el contenido de las líneas de la parte baja del Puerto B que
no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
vuelve a enviar este dato sin cambiarlo.

LCD_EscribeLCD
    andlw    
b'11110000'                Se queda con el nibble alto del dato que es el
    movwf    LCD_Dato                
que hay que enviar y lo guarda.
    
movf    LCD_BusDatos,W            Lee la información actual de la parte baja
    andlw    
b'00001111'                del Puerto Bque no se debe alterar.
    
iorwf    LCD_Dato,F                Enviará la parte alta del dato de entrada
                                    
y en la parte baja lo que había antes.
    
bsf        STATUS,RP0                Acceso al Banco 1.
    movf    TRISB
,W                    Guarda la configuración que tenía antes TRISB.
    
movwf    LCD_GuardaTRISB
    movlw    
b'00001111'                Las 4 líneas inferiores del Puerto B se dejan 
    andwf    PORTB
,F                    como estaban y las 4 superiores como salida.
    
bcf        STATUS,RP0                Acceso al Banco 0.
;
    
movf    LCD_Dato,W                Recupera el dato a enviar.
    
movwf    LCD_BusDatos            Envía el dato al módulo LCD.
    
bsf        LCD_PinEnablePermite funcionamiento del LCD mediante un pequeño
    nop
    
;CALL    Retardo_100ms   ;lo agrege yooooooo            
    bcf        LCD_PinEnable            
pulso y termina impidiendo el funcionamiento del LCD.
    
bsf        STATUS,RP0                Acceso al Banco 1. Restaura el antiguo valor en
    movf    LCD_GuardaTRISB
,W        la configuración del Puerto B.
    
movwf    TRISB
    bcf        STATUS
,RP0                Acceso al Banco 0.
    
return

Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;
Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr                        Cursor en modo incrementar.
    
movlw    b'00000110'
    
goto    LCD_EnviaComando
LCD_Linea1                            
Cursor al principio de la Línea 1.
    movlw    
b'10000000'                Dirección 00h de la DDRAM
    
goto    LCD_EnviaComando
LCD_Linea2                            
Cursor al principio de la Línea 2.
    movlw    
b'11000000'                Dirección 40h de la DDRAM
    
goto    LCD_EnviaComando
LCD_Linea3                            
Cursor al principio de la Línea 3
    movlw    
b'10010100'                Dirección 14h de la DDRAM
    
goto    LCD_EnviaComando
LCD_Linea4                            
Cursor al principio de la Línea 4
    movlw    
b'11010100'                Dirección 54h de la DDRAM
    
goto    LCD_EnviaComando
LCD_PosicionLinea1                    
Cursor a posición de la Línea 1a partir de la
    iorlw    
b'10000000'                dirección 00h de la DDRAM más el valor del
    
goto    LCD_EnviaComando        registro W.
LCD_PosicionLinea2                    Cursor a posición de la Línea 2a partir de la
    iorlw    
b'11000000'                dirección 40h de la DDRAM más el valor del
    
goto    LCD_EnviaComando        registro W.
LCD_OFF                                Pantalla apagada.
    
movlw    b'00001000'
    
goto    LCD_EnviaComando
LCD_CursorON                        
Pantalla encendida y cursor encendido.
    
movlw    b'00001110'
    
goto    LCD_EnviaComando
LCD_CursorOFF                        
Pantalla encendida y cursor apagado.
    
movlw    b'00001100'
    
goto    LCD_EnviaComando
LCD_Borra                            
Borra toda la pantallamemoria DDRAM y pone el 
    movlw    
b'00000001'                cursor a principio de la línea 1.
    
goto    LCD_EnviaComando
LCD_2Lineas4Bits5x7                    
Define la pantalla de 2 líneascon caracteres
    movlw    
b'00101000'                de 5x7 puntos y conexión al PIC mediante bus de
;    goto    LCD_EnviaComando        4 bits

Subrutinas "LCD_EnviaComando" "LCD_Caracter" ------------------------------------
;
"LCD_EnviaComando"Escribe un comando en el registro del módulo LCDLa palabra de
comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
"LCD_Caracter"Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
a través del registro WTrabaja en Modo Dato.
;
LCD_EnviaComando
    bcf        LCD_PinRS                
Activa el Modo Comandoponiendo RS=0.
    
goto    LCD_Envia
LCD_Caracter
    bsf        LCD_PinRS                
Activa el "Modo Dato"poniendo RS=1.
    call    LCD_CodigoCGROM            
Obtiene el código para correcta visualización.
LCD_Envia
    movwf    LCD_GuardaDato            
Guarda el dato a enviar.
    
call    LCD_EscribeLCD            Primero envía el nibble alto.
    
swapf    LCD_GuardaDato,W        Ahora envía el nibble bajoPara ello pasa el
                                    
nibble bajo del dato a enviar a parte alta del byte.
    
call    LCD_EscribeLCD            Se envía al visualizador LCD.
    
btfss    LCD_PinRS                Debe garantizar una correcta escritura manteniendo 
    call    Retardo_2ms                
2 ms en modo comando y 50 µs en modo cáracter.
    
call    Retardo_50micros

    
return    

Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
tabla CGROM del LM016L no coinciden con los códigos ASCIIAsí por ejemploel código
ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
Esta subrutina convierte los códigos ASCII de la "Ñ""º" y otrosa códigos CGROM para que
que puedan ser visualizado en el módulo LM016L.

Entrada:    En (Wel código ASCII del carácter que se desea visualizar.
Salida:    En (Wel código definido en la tabla CGROM.

LCD_CodigoCGROM
    movwf    LCD_Dato                
Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula                    
un carácter especial.
    
sublw    'ñ'                     ¿Es la "ñ"?
    
btfss    STATUS,Z
    
goto    LCD_EnheMayuscula        No es "ñ".
    
movlw    b'11101110'                Código CGROM de la "ñ".
    
movwf    LCD_Dato
    
goto    LCD_FinCGROM
LCD_EnheMayuscula
    movf    LCD_Dato
,W                Recupera el código ASCII de entrada.
    
sublw    'Ñ'                     ¿Es la "Ñ"?
    
btfss    STATUS,Z
    
goto    LCD_Grado                No es "Ñ".
    
movlw    b'11101110'                Código CGROM de la "ñ". (No hay símbolo para
    movwf    LCD_Dato                
la "Ñ" mayúscula en la CGROM).
    goto    
LCD_FinCGROM    
LCD_Grado
    movf    LCD_Dato
,W                Recupera el código ASCII de entrada.
    
sublw    'º'                     ¿Es el símbolo "º"?
    
btfss    STATUS,Z
    
goto    LCD_FinCGROM            No es "º".
    
movlw    b'11011111'                Código CGROM del símbolo "º".
    
movwf    LCD_Dato
LCD_FinCGROM
    movf    LCD_Dato
,W                En (Wel código buscado.
    return

Subrutina "LCD_DosEspaciosBlancos" "LCD_LineaBlanco" --------------------------------
;
Visualiza espacios en blanco.

LCD_LineaEnBlanco
    movlw    LCD_CaracteresPorLinea
    
goto    LCD_EnviaBlancos
LCD_UnEspacioBlanco
    movlw    .1
    
goto    LCD_EnviaBlancos
LCD_DosEspaciosBlancos
    movlw    .2
    
goto    LCD_EnviaBlancos
LCD_TresEspaciosBlancos
    movlw    .3
LCD_EnviaBlancos
    movwf    LCD_Auxiliar1            
; (LCD_Auxiliar1se utiliza como contador.
LCD_EnviaOtroBlanco    
    movlw    
' '                        Esto es un espacio en blanco.
    
call    LCD_Caracter            Visualiza tanto espacios en blanco como se
    decfsz    LCD_Auxiliar1
,F            haya cargado en (LCD_Auxiliar1).
    goto    
LCD_EnviaOtroBlanco
    
return

Subrutinas "LCD_ByteCompleto" "LCD_Byte" --------------------------------------------
;
Subrutina "LCD_ByteCompleto"visualiza el byte que almacena el registro W en el
lugar actual de la pantallaPor ejemplosi (W)=b'10101110' visualiza "AE".
;
Subrutina "LCD_Byte" igual que la anteriorpero en caso de que el nibble alto sea cero 
visualiza en su lugar un espacio en blancoPor ejemplo si (W)=b'10101110' visualiza "AE"
y si (W)=b'00001110'visualiza " E" (un espacio blanco delante).
;
Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
    movwf    LCD_Auxiliar2            
Guarda el valor de entrada.
    
andlw    b'11110000'                Analiza si el nibble alto es cero.
    
btfss    STATUS,Z                Si es cero lo apaga.
    goto    
LCD_VisualizaAlto        No es cero y lo visualiza.
    
movlw    ' '                        Visualiza un espacio en blanco.
    
call    LCD_Caracter
    
goto    LCD_VisualizaBajo

LCD_ByteCompleto
    movwf    LCD_Auxiliar2            
Guarda el valor de entrada.
LCD_VisualizaAlto
    swapf    LCD_Auxiliar2
,W            Pone el nibble alto en la parte baja.
    
call    LCD_Nibble                Lo visualiza.
LCD_VisualizaBajo
    movf    LCD_Auxiliar2
,W            Repite el proceso con el nibble bajo.
;    
call    LCD_Nibble                Lo visualiza.
;    return

Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
Visualiza en el lugar actual de la pantallael valor hexadecimal que almacena en el nibble
bajo del registro WEl nibble alto de W no es tenido en cuentaEjemplos:
; - 
Si (W)=b'01010110'se visualizará "6"
; - 
Si (W)=b'10101110'se visualizará "E"
;
LCD_Nibble
    andlw    
b'00001111'                Se queda con la parte baja.
    
movwf    LCD_Auxiliar1            Lo guarda.
    
sublw    0x09                    Comprueba si hay que representarlo con letra.
    
btfss    STATUS,C    
    
goto    LCD_EnviaByteLetra
    movf    LCD_Auxiliar1
,W
    addlw    
'0'                        El número se pasa a carácter ASCII sumándole
    
goto     LCD_FinVisualizaDigito    el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
    movf    LCD_Auxiliar1
,W
    addlw    
'A'-0x0A                por tantose le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
    
goto    LCD_Caracter            Y visualiza el carácterSe hace con un "goto"
                                    
para no sobrecargar la pila
04/06/2010 #73

Avatar de pablofer

Respuesta: Control de Display LCD con microcontrolador PIC
hola sammaael quisiera preguntarte si tu libreria funciona con el pic16f877a??
yo conozco esta libreria es de un libro sobre el pic 16f84a y viene con cd con todas sus librerias pero alguna vez probe en el pic16f877a y no da y quisiera saber la tuya modificada va dar de antemano gracias , y si quieren le puedo publicar todas las librerias y la mayoria funca para el pic16f877a pero el elc y el de mensaje no me funcionan pero haber si alguien me la puede adaptar al otro pic ya intente mucho pero no me puedo dar cuenta de mis errores
06/06/2010 #74


Respuesta: Control de Display LCD con microcontrolador PIC
Quiero controlar una LCD TFT de 7'' las que viene con los portaretratos, alguien sabe como se hace?
10/06/2010 #75

Avatar de sammaael

Respuesta: Control de Display LCD con microcontrolador PIC
nop claro que no funciona ya que los puertos son diferentes asi como tammbien la posicion de algunos registros pero eso no deberia frenarte no es tan dificil modificar la libreria para lo que quieres
24/06/2010 #76


Respuesta: Control de Display LCD con microcontrolador PIC
mmm...holitas tengo una dudda en lcd que tengo es tc 1602d-02(R) no encuentro su hoja de datos como puedo ver si es compatible con el hitachi???
24/06/2010 #77

Avatar de sammaael

Respuesta: Control de Display LCD con microcontrolador PIC
si, tambien tiene incorporado el hitachi
30/06/2010 #78

Avatar de Robo

Respuesta: Control de Display LCD con microcontrolador PIC
hola gente, en estos dias estaba buscando cosas y me encontre un telefono, no lo necesitaba asi qu lo deshuese jeje, me encontre con que tenia una lcd, que funcionaba y se la saque,lo que pasa es que no tiene ni 14 ni 16 pines, tiene 15, y he visto que las que tienen iluminacion tienen 16 y las que no 14, entonces como puedo conectar esta pantalla??
PD: ya tengo el pic programado esperando la pantalla
gracias
21/07/2010 #79

Avatar de sdel

Respuesta: Control de Display LCD con microcontrolador PIC
Hola amigos, vine a postear mi problema y me encontre con este tema que me viene al pelo...
estoy tratando de hacer funcionar mi lcd, es marca casil y por lo que dice el datasheet tiene el hitachi 44780 y el conexionado es igual que el lm016 que usa el libro del pic16f84 el cual estoy estudiando, adjunto datasheet del lcd.
el problema es que quiero hacerlo funcionar para el proyecto de un temporizador, es el que esta en el libro

http://www.pic16f84a.org/index.php?o...d=52&Itemid=95

utilizo el programa y rutina del libro y no logro ver nada en el lcd, solo se ve una linea mostrando las matrices enteras y la otra linea en blanco.

por comentarios mas arriba dice que no se inicializa bien, yo pregunto:
si el lcd que esta en el libro el lm016 usa el hitachi 44780 y el que yo uso tambien, los tiempos de inicializadcion no deberian ser iguales?
tendria que modificar las rutinas del manejo del lcd?
si alguien monto ese proyecto le andubo bien? saludos
Archivos Adjuntos
Tipo de Archivo: pdf CCM1620CSLLCD.pdf (349,7 KB (Kilobytes), 121 visitas)
22/07/2010 #80

Avatar de sdel

Respuesta: Control de Display LCD con microcontrolador PIC
ya lo hice andar, no tenia conectado el reset del pic a 5v jeje que pavo.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.