; Configuración de registros y pines
cblock 0x20
contador
endc
; Definir constantes para el LCD
LCD_PORT EQU PORTB
LCD_RS EQU RB0
LCD_RW EQU RB1
LCD_EN EQU RB2
; Definir comandos del LCD
CLEAR_DISPLAY EQU 0x01
RETURN_HOME EQU 0x02
DISPLAY_ON EQU 0x0C
FUNCTION_SET EQU 0x28
ORG 0x0000
; Inicialización
BANKSEL TRISB
CLRF TRISB
BANKSEL LCD_PORT
CLRF LCD_PORT
BSF STATUS, RP0 ; Cambiar a Bank 1
MOVLW 0x00
MOVWF contador ; Inicializar contador
MAIN_LOOP:
; Configurar puertos para salida
BSF STATUS, RP0 ; Cambiar a Bank 1
BCF TRISB, LCD_EN
BCF TRISB, LCD_RW
BCF TRISB, LCD_RS
; Esperar un breve período de tiempo
CALL DELAY
; Inicializar LCD
CALL INIT_LCD
; Esperar un breve período de tiempo
CALL DELAY
; Mostrar mensaje en el LCD
CALL SEND_COMMAND, DISPLAY_ON
CALL SEND_COMMAND, CLEAR_DISPLAY
CALL SEND_COMMAND, RETURN_HOME
MOVLW 'H'
CALL SEND_DATA
MOVLW 'o'
CALL SEND_DATA
MOVLW 'l'
CALL SEND_DATA
MOVLW 'a'
CALL SEND_DATA
MOVLW '!'
CALL SEND_DATA
; Bucle infinito
BRA MAIN_LOOP
; Subrutina para enviar comandos al LCD
SEND_COMMAND:
BCF LCD_RS
BCF LCD_RW
MOVF contador, W
MOVWF LCD_PORT
BSF LCD_EN
CALL DELAY
BCF LCD_EN
INCF contador, F
RETURN
; Subrutina para enviar datos al LCD
SEND_DATA:
BSF LCD_RS
BCF LCD_RW
MOVF contador, W
MOVWF LCD_PORT
BSF LCD_EN
CALL DELAY
BCF LCD_EN
INCF contador, F
RETURN
; Subrutina de inicialización del LCD
INIT_LCD:
CALL SEND_COMMAND, FUNCTION_SET
CALL SEND_COMMAND, DISPLAY_ON
CALL SEND_COMMAND, CLEAR_DISPLAY
RETURN
; Subrutina de retardo
DELAY:
MOVLW D'100'
MOVWF contador
DELAY_LOOP:
DECFSZ contador, F
BRA DELAY_LOOP
RETURN
END