Rutinas Manejo LCD Con PICS

11
Displays de Cristal Líquido Software De Control Para Driver de LCD HD44780 o compatible 1 de 11 SUBPROGRAMAS DE MANEJO DEL MÓDULO LCD CON DRIVER HD44780 (o compatibles) Para que estos subprogramas sean totalmente generales, en el programa principal deben declararse una serie de etiquetas que se utilizan en estos subprogramas y que definen el conexionado realizado en la aplicación concreta. También se debe definir una posición auxiliar LCD_TEMP de almacenamiento temporal de información y dos posiciones más para realizar una temporización software del orden de 15ms Declaración de etiquetas en el programa principal, en rojo aparecen los valores a decidir: LCD_DATA EQU PORTx ;DATOS se conecta a PORTx LCD_DATA_TRIS EQU TRISx ; LCD_CTRL EQU PORTy ;CONTROL se conecta a PORTy LCD_CTRL_TRIS EQU TRISy ; LCD_LINE0 EQU 0x000 ;dirección comienzo línea superior DDRAM LCD_LINE1 EQU 0x040 ;dirección comienzo línea inferior DDRAM ; Bits de control: LCD_E EQU n ; Enable será el bit n del PORTy LCD_RW EQU m ; Read/Write bit m del PORTy LCD_RS EQU p ; RS será el bit p del PORTy ; Bits de datos: DB7 EQU 7 ; bit 7 (MSB) DB6 EQU 6 ; bit 6 DB5 EQU 5 ; bit 5 DB4 EQU 4 ; bit 4 DB3 EQU 3 ; bit 3 DB2 EQU 2 ; bit 2 DB1 EQU 1 ; bit 1 DB0 EQU 0 ; bit 0 (LSB) LCD_TEMP EQU 0x?? ; Posición auxiliar en el banco 0 AUX EQU 0x?? ; Otra posición auxiliar más DELAY EQU 0x?? ; Otra posición en banco 0 X_DELAY EQU 0x?? ; Otra más para temporizaciones

Transcript of Rutinas Manejo LCD Con PICS

Page 1: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

1 de 11

SUBPROGRAMAS DE MANEJO DEL MÓDULO LCD CON DRIVER HD44780(o compatibles)

Para que estos subprogramas sean totalmente generales, en el programaprincipal deben declararse una serie de etiquetas que se utilizan en estossubprogramas y que definen el conexionado realizado en la aplicaciónconcreta.

También se debe definir una posición auxiliar LCD_TEMP dealmacenamiento temporal de información y dos posiciones más para realizaruna temporización software del orden de 15ms

Declaración de etiquetas en el programa principal, en rojo aparecen losvalores a decidir:

LCD_DATA EQU PORTx ;DATOS se conecta a PORTxLCD_DATA_TRIS EQU TRISx ;LCD_CTRL EQU PORTy ;CONTROL se conecta a PORTyLCD_CTRL_TRIS EQU TRISy ;

LCD_LINE0 EQU 0x000 ;dirección comienzo línea superior DDRAMLCD_LINE1 EQU 0x040 ;dirección comienzo línea inferior DDRAM

; Bits de control:LCD_E EQU n ; Enable será el bit n del PORTyLCD_RW EQU m ; Read/Write bit m del PORTyLCD_RS EQU p ; RS será el bit p del PORTy

; Bits de datos:DB7 EQU 7 ; bit 7 (MSB)DB6 EQU 6 ; bit 6DB5 EQU 5 ; bit 5DB4 EQU 4 ; bit 4DB3 EQU 3 ; bit 3DB2 EQU 2 ; bit 2DB1 EQU 1 ; bit 1DB0 EQU 0 ; bit 0 (LSB)

LCD_TEMP EQU 0x?? ; Posición auxiliar en el banco 0AUX EQU 0x?? ; Otra posición auxiliar másDELAY EQU 0x?? ; Otra posición en banco 0X_DELAY EQU 0x?? ; Otra más para temporizaciones

Page 2: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

2 de 11

1.- INTERFACE DE 8 BITS CON MICROCONTROLADOR PIC

Estos subprogramas de manejo del LCD se pueden almacenar en un ficherocomún e incluirlo cada vez que se necesite utilizarlos:

LCDBUSY:• Tras la llamada, no se retorna hasta que el flag de ocupado BF del

LCD pase a cero lo que indica que finalizó las operaciones internasy puede recibir un nuevo comando

;=====================================================================; LCDBUSY; Retorna de este subprograma cuando el indicador de ocupado (BF) esté a cero;=====================================================================LCDBUSY

BSF STATUS,RP0 ; banco 1MOVLW 0xFF ; configura datos como entradaMOVWF LCD_DATA_TRISBCF STATUS, RP0 ; banco 0BCF LCD_CTRL, LCD_RS ; RS=0 (modo comando)BSF LCD_CTRL, LCD_RW ; R/W=1 (lectura)BSF LCD_CTRL, LCD_E ; E=1MOVF LCD_DATA, W ; Leemos flag ocupado (bit 7)BCF LCD_CTRL, LCD_E ; E=0ANDLW 0x80 ; Comprobamos la bandera de ocupadoBTFSS STATUS, Z ; Si está a cero saltamosGOTO LCDBUSY ; Si no, seguimos esperando

LCDNOTBUSY BCF LCD_CTRL, LCD_RW ; R/W=0BSF STATUS, RP0 ; banco 1CLRF LCD_DATA_TRIS ; configuramos datos como salidaBCF STATUS, RP0 ; banco 0RETURN

LCDPUTCHAR: envía un carácter al LCD• Se debe cargar el código del carácter a representar en W de

manera previa a la llamada

;=====================================================================; LCDPUTCHAR; Manda un caracter al LCD; El caracter que se envía es el que está en W cuando se llama al; subprograma;=====================================================================LCDPUTCHAR

MOVWF LCD_TEMP ; cargamos el caracter en LCD_TEMPCALL LCDBUSY ; esperamos a que el LCD esté libreBCF LCD_CTRL, LCD_RW ; modo escrituraBSF LCD_CTRL, LCD_RS ; modo datosBSF LCD_CTRL, LCD_E ; E=1MOVF LCD_TEMP, WMOVWF LCD_DATA ; escribimos el datoBCF LCD_CTRL, LCD_E ; E=0RETURN

Page 3: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

3 de 11

LCDPUTCMD: envía un comando al LCD• El comando a enviar se debe cargar en W de manera previa a la

llamada

;=============================================================================; LCDPUTCMD; Manda un comando al LCD; El comando que se envía es el que está en W cuando se llama;=============================================================================LCDPUTCMD

MOVWF LCD_TEMP ; cargamos el comando en LCD_TEMPCALL LCDBUSY ; esperamos a que el LCD esté libreBCF LCD_CTRL, LCD_RW ; modo escrituraBCF LCD_CTRL, LCD_RS ; modo comandosBSF LCD_CTRL, LCD_E ; E=1MOVF LCD_TEMP, WMOVWF LCD_DATA ; escribimos el comandoBCF LCD_CTRL, LCD_E ; E=0RETURN

LCDCLEAR: borra la pantalla y mueve el cursor a “casa”• Carga el comando en W y lo envía con LCDPUTCMD

;=============================================================================; LCDCLEAR; Borra la pantalla y retorna el cursor a la posición superior izquierda;=============================================================================LCDCLEAR

MOVLW B'00000001'CALL LCDPUTCMDRETURN

LCDHOME: retorna el cursor a la posición inicial “casa”• Carga el comando en W y lo envía con LCDPUTCMD

;=============================================================================; LCDHOME; Retorna el cursor a la posición superior izquierda; Retorna el display a su posición original (cuando se hubiese desplazado);=============================================================================LCDHOME

MOVLW B'00000010'CALL LCDPUTCMDRETURN

LCDEMODE: define el modo de funcionamiento del LCD• Se carga en 2 bits de W y se envía con LDPUTCMD

;=============================================================================; LCDEMODE; Configura el modo de funcionamiento del display; El modo de funcionamiento deseado deberá cargarse en los dos bits menores; de W: x x x x x x b1 b0;; b0 : 0 = no desplazamiento del display 1 = desplazamiento; b1 : 0 = autodecremento del cursor 1 = autoincremento; b2-7 : sin importancia;=============================================================================LCDEMODE

ANDLW 0x03 ; Nos quedamos con b1-b0

Page 4: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

4 de 11

IORLW 0x04 ; Incorporamos el bit de funciónCALL LCDPUTCMDRETURN

LCDDMODE: define el control del LCD, el cursor y el parpadeo• Se configura en 3 bits de W y se envía con LCDPUTCMD

;=============================================================================; LCDDMODE; Configura el control de display, cursor y parpadeo; El modo de control deseado deberá cargarse en los 3 bits menores de W:; x x x x x b2 b1 b0;; b0 : 0 = no parpadeo del cursor 1 = parpadeo; b1 : 0 = apagar cursor 1 = encender cursor; b2 : 0 = apagar display 1 = encender display (los datos siguenen DDRAM); b3-7 : sin importancia;=============================================================================LCDDMODE

ANDLW 0x07 ; Nos quedamos con b2-b1-b0IORLW 0x08 ; Incorporamos el bit de funciónCALL LCDPUTCMDRETURN

LCDINIT:• Espera por el arranque del LCD tras alimentarlo (15ms aprox)• Envía el modo de funcionamiento: 8 bits y 2 líneas activas

(podría ser modificado por el usuario)• Desactiva display, cursor y parpadeo• Borra la pantalla• Activa display y desactiva el cursor• Configura el “autoincremento” del cursor y el puntero, se anula el

desplazamiento de pantalla

;=====================================================================; LCDINIT; Inicializa el módulo LCD, no tiene parámetros;; Transferencia en 8 bits y 2 líneas activas en el LCD;;=====================================================================LCDINIT

CLRF LCD_CTRL ; salidas de control en estado bajo; temporización de encendido

MOVLW 0x01E ; con estas 2 instrucciones se lograCALL X_DELAY500 ; una llamada a una temporización de 15msMOVLW 0x038 ; Modo de 8-bits, 2-líneasCALL LCDPUTCMDMOVLW 0x000 ; apagar display y cursor, no parpadeoCALL LCDDMODECALL LCDCLEARMOVLW 0x004 ; encender display, apagar cursorCALL LCDDMODEMOVLW 0x002 ; autoincremento del cursorCALL LCDEMODERETURN

Page 5: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

5 de 11

LCDSCGA: sitúa el puntero de direcciones en una posición de la CGRAM• Se carga la dirección deseada en los 6 bits más bajos de W antes

de llamar a este subprograma• Toma esa dirección, le incorpora los bits de función y llama a

LCDPUTCMD

;=============================================================================; LCDSCGA; Fija la dirección de la CGRAM. La dirección de la CGRAM puede ser; leída/escrita después de este comando;; La dirección deseada deberá estar en el registro W: x x b5 b4 b3 b2 b1 b0; b0-5 : dirección de la CGRAM; b6-7 : sin importancia;;=============================================================================LCDSCGA

ANDLW B'00111111' ; Nos quedamos con b5-b0IORLW B'01000000' ; Incorporamos el bit de funciónCALL LCDPUTCMDRETURN

LCDSDDA: sitúa el puntero de direcciones en una posición de la DDRAM• Se carga la dirección deseada en los 7 bits más bajos de W antes

de llamar a este subprograma• Toma esa dirección, le incorpora el bit de función y llama a

LCDPUTCMD

;=============================================================================; LCDSDDA; Fija la dirección de la DDRAM. La dirección de la DDRAM puede ser; leída/escrita después de este comando;; La dirección deseada deberá estar en el registro W: x b6 b5 b4 b3 b2 b1 b0; b0-6 : dirección de la DDRAM; b7 : sin importancia;;=============================================================================LCDSDDA

IORLW B'10000000' ; Incorporamos el bit de funciónCALL LCDPUTCMDRETURN

LCDGADDR: devuelve en W el puntero de direcciones recibido desde el LCD

;=============================================================================; LCDGADDR; Devuelve el contenido del puntero de direcciones; La dirección RAM se devuelve en el registro W;;=============================================================================LCDGADDR

BSF STATUS,RP0 ; banco 1MOVLW 0xFF ; líneas de datos como entradasMOVWF LCD_DATA_TRISBCF STATUS, RP0 ; banco 0BCF LCD_CTRL, LCD_RS; modo comandoBSF LCD_CTRL, LCD_RW; modo lecturaBSF LCD_CTRL, LCD_E ; E=1MOVF LCD_DATA, W ; leemos bit de ocupado + dirección

Page 6: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

6 de 11

BCF LCD_CTRL, LCD_E ; E=0ANDLW 0x7F ; nos quedamos con b6-b0BCF LCD_CTRL, LCD_RWBSF STATUS, RP0 ; banco 1CLRF LCD_DATA_TRIS; líneas de datos como salidasBCF STATUS, RP0 ; banco 0RETURN

Page 7: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

7 de 11

2.- INTERFACE DE 4 BITS CON MICROCONTROLADOR PIC

LCDBUSY_4:• Tras la llamada, no se retorna hasta que el flag de ocupado BF del

LCD pase a cero lo que indica que finalizó las operaciones internasy puede recibir un nuevo comando

• Se leen los 4 bits más altos y luego los 4 más bajos

;=============================================================================; LCDBUSY_4; Retorna de este subprograma cuando el indicador de ocupado (BF) esté a cero;=============================================================================LCDBUSY_4

BSF STATUS,RP0 ; banco 1MOVLW 0xFF ; configura datos como entradaMOVWF LCD_DATA_TRISBCF STATUS, RP0 ; banco 0BCF LCD_CTRL,LCD_RS ; RS=0 (modo comando)BSF LCD_CTRL,LCD_RW ; R/W=1 (lectura)BSF LCD_CTRL, LCD_E ; E=1MOVF LCD_DATA, W ; Leemos BF (bit 7) + direcciónBCF LCD_CTRL, LCD_E ; E=0ANDLW 0xF0 ; Extraigo los 4 bits altosMOVWF AUX ; los almaceno en variable temporalBSF LCD_CTRL, LCD_E ; E=1SWAPF LCD_DATA, W ; Leemos los 4 bits más bajosBCF LCD_CTRL, LCD_E ; E=0ANDLW 0x0F ; Extraigo 4 bits bajosIORWF AUX, F ; los combino con los 4 superioresBTFSC AUX, 7 ; Si BF está a cero saltamosGOTO LCDBUSY_4 ; Si no, seguimos esperando

LCDNOTBUSY BCF LCD_CTRL,LCD_RW ; R/W=0BSF STATUS, RP0 ; banco 1MOVLW 0x0FMOVWF LCD_DATA_TRIS ; configuramos datos como salidaBCF STATUS, RP0 ; banco 0RETURN

LCDPUTCHAR_4: envía un carácter al LCD• Se debe cargar el código del carácter a representar en W de

manera previa a la llamada• El envío se realiza en dos paquetes de 4 bits

;=============================================================================; LCDPUTCHAR_4; Manda un caracter al LCD en dos paquetes de 4 bits; El caracter que se envía es el que está en W cuando se llama al subprograma;=============================================================================LCDPUTCHAR_4

MOVWF LCD_TEMP ; cargamos el caracter en LCD_TEMPCALL LCDBUSY_4 ; esperamos a que el LCD esté libreMOVF LCD_TEMP,W ; lo recuperamos temporalmenteANDLW 0xF0 ; extraigo los 4 bits más altosBCF LCD_CTRL,LCD_RW ; modo escrituraBSF LCD_CTRL,LCD_RS ; modo datosBSF LCD_CTRL, LCD_E ; E=1MOVWF LCD_DATA ; lo saco por los 4 bits del puertoBCF LCD_CTRL, LCD_E ; E=0SWAPF LCD_TEMP,W ; paso los 4 bits bajos a la parte altaANDLW 0xF0 ; los extraigo

Page 8: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

8 de 11

BSF LCD_CTRL, LCD_E ; E=1MOVWF LCD_DATA ; lo saco por los 4 bits del puertoBCF LCD_CTRL, LCD_E ; E=0RETURN

LCDPUTCMD_4: envía un comando al LCD• El comando a enviar se debe cargar en W de manera previa a la

llamada• Se envían dos paquetes de 4 bits

;=============================================================================; LCDPUTCMD_4; Manda un comando al LCD en dos paquetes de 4 bits; El comando que se envía es el que está en W cuando se llama;=============================================================================LCDPUTCMD_4

MOVWF LCD_TEMP ; cargamos el comando en LCD_TEMPCALL LCDBUSY_4 ; esperamos a que el LCD esté libreMOVF LCD_TEMP,W ; lo recuperamos temporalmenteANDLW 0xF0 ; extraigo los 4 bits más altos

BCF LCD_CTRL,LCD_RW ; modo escrituraBCF LCD_CTRL,LCD_RS ; modo comandosNOPBSF LCD_CTRL, LCD_E ; E=1MOVWF LCD_DATA ; lo saco por los 4 bits del puertoBCF LCD_CTRL, LCD_E ; E=0SWAPF LCD_TEMP,W ; paso los 4 bits bajos a la parte altaANDLW 0xF0 ; los extraigoNOPBSF LCD_CTRL, LCD_E ; E=1MOVWF LCD_DATA ; lo saco por los 4 bits del puertoBCF LCD_CTRL, LCD_E ; E=0RETURN

LCDCLEAR: borra la pantalla y mueve el cursor a “casa”• Carga el comando en W y lo envía con LCDPUTCMD_4

;=============================================================================; LCDCLEAR; Borra la pantalla y retorna el cursor a la posición superior izquierda;=============================================================================LCDCLEAR

MOVLW B'00000001'CALL LCDPUTCMD_4RETURN

Page 9: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

9 de 11

LCDHOME: retorna el cursor a la posición inicial “casa”• Carga el comando en W y lo envía con LCDPUTCMD_4

;=============================================================================; LCDHOME; Retorna el cursor a la posición superior izquierda; Retorna el display a su posición original (cuando se hubiese desplazado);=============================================================================LCDHOME

MOVLW B'00000010'CALL LCDPUTCMD_4RETURN

LCDEMODE: define el modo de funcionamiento del LCD• Se carga en 2 bits de W y se envía con LDPUTCMD_4

;=============================================================================; LCDEMODE; Configura el modo de funcionamiento del display; El modo de funcionamiento deseado deberá cargarse en los dos bits menores; de W: x x x x x x b1 b0;; b0 : 0 = no desplazamiento del display 1 = desplazamiento; b1 : 0 = autodecremento del cursor 1 = autoincremento; b2-7 : sin importancia;=============================================================================LCDEMODE

ANDLW 0x03 ; Nos quedamos con b1-b0IORLW 0x04 ; Incorporamos el bit de funciónCALL LCDPUTCMD_4RETURN

LCDDMODE: define el control del LCD, el cursor y el parpadeo• Se configura en 3 bits de W y se envía con LCDPUTCMD_4

;=============================================================================; LCDDMODE; Configura el control de display, cursor y parpadeo; El modo de control deseado deberá cargarse en los 3 bits menores de W:; x x x x x b2 b1 b0;; b0 : 0 = no parpadeo del cursor 1 = parpadeo; b1 : 0 = apagar cursor 1 = encender cursor; b2 : 0 = apagar display 1 = encender display (los datos siguenen DDRAM); b3-7 : sin importancia;=============================================================================LCDDMODE

ANDLW 0x07 ; Nos quedamos con b2-b1-b0IORLW 0x08 ; Incorporamos el bit de funciónCALL LCDPUTCMD_4RETURN

LCDINIT_4:• Espera por el arranque del LCD tras alimentarlo (15ms aprox)• Envía el modo de funcionamiento: 4 bits y 2 líneas activas

(podría ser modificado por el usuario)• Desactiva display, cursor y parpadeo

Page 10: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

10 de 11

• Borra la pantalla• Activa display y desactiva el cursor• Configura el “autoincremento” del cursor y el puntero, se anula el

desplazamiento de pantalla

;=============================================================================; LCDINIT_4; Inicializa el módulo LCD para interface de 4 bits y 2 líneas de pantalla;=============================================================================LCDINIT_4

CLRF LCD_CTRL ; salidas de control en estado bajo

MOVLW 0x1E ; temporización software de encendidoCALL X_DELAY500 ; ejecutaremos una temporización de 15ms

; calculada para fosc=4MHz

MOVLW B'00101000' ; Modo de 4-bits, 2-líneasCALL LCDPUTCMD_4 ; enviamos el comandoMOVLW 0x00 ; apagar display y cursor, temporalmenteCALL LCDDMODECALL LCDCLEAR ; borrar displayMOVLW B'00000100' ; activar display, apagar cursorCALL LCDDMODEMOVLW B'00000010' ; autoincremento del cursorCALL LCDEMODERETURN

LCDSCGA: sitúa el puntero de direcciones en una posición de la CGRAM• Se carga la dirección deseada en los 6 bits más bajos de W antes

de llamar a este subprograma• Toma esa dirección, le incorpora los bits de función y llama a

LCDPUTCMD_4

;=============================================================================; LCDSCGA; Fija la dirección de la CGRAM. La dirección de la CGRAM puede ser; leída/escrita después de este comando;; La dirección deseada deberá estar en el registro W: x x b5 b4 b3 b2 b1 b0; b0-5 : dirección de la CGRAM; b6-7 : sin importancia;;=============================================================================LCDSCGA

ANDLW B'00111111' ; Nos quedamos con b5-b0IORLW B'01000000' ; Incorporamos el bit de funciónCALL LCDPUTCMD_4RETURN

Page 11: Rutinas Manejo LCD Con PICS

Displays de Cristal LíquidoSoftware De Control Para Driver de LCD HD44780 o compatible

11 de 11

LCDSDDA: sitúa el puntero de direcciones en una posición de la DDRAM• Se carga la dirección deseada en los 7 bits más bajos de W antes

de llamar a este subprograma• Toma esa dirección, le incorpora el bit de función y llama a

LCDPUTCMD_4

;=============================================================================; LCDSDDA; Fija la dirección de la DDRAM. La dirección de la DDRAM puede ser; leída/escrita después de este comando;; La dirección deseada deberá estar en el registro W: x b6 b5 b4 b3 b2 b1 b0; b0-6 : dirección de la DDRAM; b7 : sin importancia;;=============================================================================LCDSDDA

IORLW B'10000000' ; Incorporamos el bit de funciónCALL LCDPUTCMD_4RETURN

LCDGADDR_4: devuelve en W el puntero de direcciones recibido desde elLCD

;=============================================================================; LCDGADDR_4; Devuelve el contenido del puntero de direcciones; La dirección RAM se devuelve en el registro W;;=============================================================================LCDGADDR_4

BSF STATUS,RP0 ; banco 1MOVLW 0xFF ; líneas de datos como entradasMOVWF LCD_DATA_TRISBCF STATUS, RP0 ; banco 0BCF LCD_CTRL,LCD_RS ; modo comandoBSF LCD_CTRL,LCD_RW ; modo lecturaNOPBSF LCD_CTRL, LCD_E ; E=1NOPMOVF LCD_DATA, W ; leemos bit de ocupado + direcciónBCF LCD_CTRL, LCD_E ; E=0ANDLW 0xF0 ; Extraigo los 4 bits altosMOVWF LCD_TEMP ; los almaceno en variable temporalNOPBSF LCD_CTRL, LCD_E ; E=1SWAPF LCD_DATA, W ; Leemos los 4 bits más bajosBCF LCD_CTRL, LCD_E ; E=0ANDLW 0x0F ; Extraigo 4 bits bajosIORWF LCD_TEMP, F ; los combino con los 4 superioresMOVF LCD_TEMP,W ; se lo paso a WANDLW 0x7F ; nos quedamos con b6-b0BCF LCD_CTRL,LCD_RW ; dejo R/W=0BSF STATUS, RP0 ; banco 1CLRF LCD_DATA_TRIS; líneas de datos como salidasBCF STATUS, RP0 ; banco 0RETURN