Saludos, espero que estas rutinas les sea de ayuda.
Codigo:
; REALIZA LA INICIALIZACION DEL LCD. UNA INTERFAZ DE 4 BITS,
; 2 LINEAS Y 5X7 PIXELS.
;
; RS ----> RA4 D7 ----> RA3
; RW ----> RA6 D6 ----> RA2
; E ----> RA7 D5 ----> RA1
; D4 ----> RA0
; D3 ----> GND
; D2 ----> GND
; D1 ----> GND
; D0 ----> GND
; _____________________________________________________
; | |
; | ----------------------------------------------- |
; | | | |
; | | | |
; | | | |
; | ----------------------------------------------- |
; | _ |
; | GND VCC VEE RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 A K |
; |_____________________________________________________|
; | | | | | | | | | | | | | | | |
; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
; SE DEFINEN PINES DEL PORTA
#DEFINE D4_LCD PORTA,0
#DEFINE D5_LCD PORTA,1
#DEFINE D6_LCD PORTA,2
#DEFINE D7_LCD PORTA,3
#DEFINE RS PORTA,4
#DEFINE RW PORTA,6
#DEFINE E PORTA,7
; BLOQUE DE COMANDOS
LCD_LINEA1 EQU 0X80 ;COLOCA EL CURSOR EN LA POSICION 1 LINEA 1
LCD_LINEA2 EQU 0XC0 ;COLOCA EL CURSOR EN LA POSICION 1 LINEA 2
LCD_BORRAR EQU 0X01 ;CLR LCD, CURSOR EN LA POSICION 1 LINEA 1
LCD_INICIO EQU 0X02 ;COLOCA EL CURSOR EN LA POSICION 1 LINEA 1
LCD_INC EQU 0X06 ;INC POSICION CURSOR DESPUES DE CADA CARACTER
LCD_DEC EQU 0X04 ;DEC POSICION CURSOR DESPUES DE CADA CARACTER
LCD_ON EQU 0X0C ;ENCIENDE LCD
LCD_OFF EQU 0X08 ;APAGA LCD
LCD_CURSON EQU 0X0E ;ENCIENDE LCD Y EL CURSOR (_CURSOR)
LCD_CURSOFF EQU 0X0C ;APAGA EL CURSOR
LCD_CURSBLK EQU 0X0D ;ENCIENDE LCD Y PARPADEA EL CURSOR ([]CURSOR)
LCD_IZDA EQU 0X18 ;DESPLAZA LOS CARACTERES MOSTRADOS A LA IZQUIERDA
LCD_DECHA EQU 0X1C ;DESPLAZA LOS CARACTERES MOSTRADOS A LA DERECHA
LCD_CURSIZ EQU 0X10 ;MUEVE EL CURSOR UNA POSICION A LA IZQUIERDA
LCD_CURSDE EQU 0X14 ;MUEVE EL CURSOR UNA POSICION A LA DERECHA
LCD_4BITS EQU 0X28 ;INTERFACE 4 BITS, 2 LINEAS, 5X7 PIXELES
LCD_CGRAM EQU 0X40 ;GENERADOR DE CARACTERES DE USUARIO RAM
; RUTINA PARA LA CONFIGURACION DEL LCD
LCD_CONFIG
CALL DEMO_5MS
MOVLW B"11110000"
ANDWF PORTA,F ;BORRA PORTA_LOW RESPETANDO LAS RESTANTES
MOVLW 0X03
IORWF PORTA,F ;INTERFACE DE 8 BITS
BCF RW ;MODO ESCRITURA
BCF RS ;MODO COMANDO
CALL LCD_E
CALL DEMO_150MS ;RETARDO SUGERIDO POR EL FABRICANTE
CALL LCD_E
CALL DEMO_150MS ;RETARDO SUGERIDO POR EL FABRICANTE
CALL LCD_E
CALL DEMO_150MS ;RETARDO SUGERIDO POR EL FABRICANTE
MOVLW B"11110000"
ANDWF PORTA,F ;BORRA PORTA_LOW RESPETANDO LAS RESTANTES
MOVLW 0X02
IORWF PORTA,F ;INTERFACE DE 4 BITS
CALL LCD_E
MOVLW LCD_4BITS ;INTERFACE DE 4 BITS, 2 LINEAS Y 5X7 PIXELS
CALL LCD_CMD
MOVLW LCD_ON
CALL LCD_CMD
MOVLW LCD_BORRAR
CALL LCD_CMD
RETURN
; RUTINA QUE ENTREGA UN PULSO A ENABLE DEL LCD
LCD_E
BSF E
NOP
NOP
BCF E
RETURN
; RUTINA QUE VERIFICA EL ESTADO DEL FLAG BUSY DEL LCD.
LCD_BUSY
BANK_1
MOVLW B"00001111"
IORWF TRISA,F ;PORTA_LOW COMO ENTRADA
BANK_0
BSF RW ;MODO LECTURA
BCF RS ;MODO COMANDO
NOP
LCD_BUSY3
BSF E
NOP
NOP
MOVFW PORTA
MOVWF LCD_TEMP
NOP
NOP
BCF E
NOP
NOP
BSF E
NOP
NOP
BCF E
BTFSC LCD_TEMP,3
GOTO LCD_BUSY3
BANK_1
MOVLW B"11110000"
ANDWF TRISA,F ;PORTA_LOW COMO SALIDA
BANK_0
RETURN
; RUTINA QUE ENVIA UN COMANDO AL LCD
LCD_CMD
MOVWF LCD_CHAR ;SALVA COMANDO PARA SER ENVIADO
CALL LCD_BUSY
BCF RW ;MODO ESCRITURA
BCF RS ;MODO COMANDO
GOTO $+.5
; RUTINA QUE VISUALIZA EN EL LCD EL CONTENIDO CARGADO EN W (W=ASCII)
LCD_DATA
MOVWF LCD_CHAR ;SALVA COMANDO PARA SER ENVIADO
CALL LCD_BUSY
BCF RW ;MODO ESCRITURA
BSF RS ;MODO CARACTER
BCF D4_LCD
BCF D5_LCD
BCF D6_LCD
BCF D7_LCD
; SEND NYBLE MSB
BTFSC LCD_CHAR,7
BSF D7_LCD
BTFSC LCD_CHAR,6
BSF D6_LCD
BTFSC LCD_CHAR,5
BSF D5_LCD
BTFSC LCD_CHAR,4
BSF D4_LCD
CALL LCD_E
; SEND NYBLE LSB
BCF D4_LCD
BCF D5_LCD
BCF D6_LCD
BCF D7_LCD
BTFSC LCD_CHAR,3
BSF D7_LCD
BTFSC LCD_CHAR,2
BSF D6_LCD
BTFSC LCD_CHAR,1
BSF D5_LCD
BTFSC LCD_CHAR,0
BSF D4_LCD
CALL LCD_E
RETURN