  list     p=16f877
   errorlevel-302
pcl      equ      0x02            
adcon1   equ      0x9f
letra    equ      0x20
tiempo   equ      0x21
tiempo1  equ      0x22
tiempo2  equ      0x23
reg1     equ      26            
reg2     equ      27
reg3     equ      28
reg4     equ      29
reg6     equ      35

         org      0x0
         goto     inicio
         org      0x5

inicio  bsf     3,5             ;Pasa a pagina 1
        movlw   b'000000'     ;Configura puerto A
        movwf   0x05
        movlw   b'00000000'
        movwf   0x06            ;Puerto B completo como salidas (bus del LCD)
        movlw   b'00000000'     ;Puerto B completo como salidas
        movwf   0x07
        movlw   b'00000000'
        movwf   0x08
        movlw   b'000'
        movwf   0x09
        movlw   b'00000110'    ;Configura los pines del Puerto A
        movwf   adcon1          ;como e/s digitales
        bcf     3,5
	
        clrf    0x05           ;Apaga todo
        clrf    0x06
        clrf    0x07
        clrf    0x08
        clrf    0x09
        clrf      letra
        clrf      tiempo
        clrf      tiempo1
        clrf      tiempo2
;--------------------------------------------------------------
        movlw    b'00111000'     ;Comunicación con el LCD a ocho bits - Dos líneas de texto
        call     CONTROL
        movlw    d'2'
        call     DEMORA            ;Demora 2ms
        movlw    b'00000110'     ;Mensaje estático, se desplaza el cursor hacia la derecha
        call     CONTROL
        movlw    d'2'
        call     DEMORA            ;Demora 2ms
        movlw    b'00001100'       ;Enciende el display - Oculta el cursor - Caracter fijo
        call     CONTROL
        movlw    d'2'
        call     DEMORA            ;Demora 2ms
empezar movlw    b'00000001'       ;Limpia la pantalla y pone cursor en posición inicial
        call     CONTROL
        movlw    d'2'
        call     DEMORA            ;Demora 2ms

        clrf     letra             ;Coloca el titulo en el LCD
OTRA1   movf     letra, 0          ;Letra actual -> W
        call     LINEA1        ;Obtiene el caracter a colocar desde la tabla
        call     DATO              ;Envia el caracter al LCD
        incf     letra, 1

        movf     letra, 0    ;Comprueba si ya envio los 20 caracteres del título
        sublw    d'20'
        btfss    3,2
        goto     OTRA1          ;Si no llego a la letra 20 sigue enviando
 
        movlw   0xc0            ;Posiciona el cursor en la 2da. linea
        call    CONTROL
        movlw   d'2'
        call    DEMORA          ;Demora 2ms

        clrf    letra           ;Coloca el titulo en el LCD
OTRA2   movf    letra, 0        ;Letra actual -> W
        call    LINEA2          ;Obtiene el caracter a colocar desde la tabla
        call    DATO            ;Envia el caracter al LCD
        incf    letra, 1

        movf    letra, 0        ;Comprueba si ya envio los 16 caracteres del título
        sublw   d'20'
        btfss   3,2
        goto    OTRA2           ;Si no llego a la letra 16 sigue enviando
        call    plo             ;RETARDO

        call     cambio       
        clrf     letra             ;Coloca el título en el LCD
OTRA3   movf     letra, 0          ;Letra actual -> W
        call     LINEA3        ;Obtiene el caracter a colocar desde la tabla
        call     DATO              ;Envía el caracter al LCD
        incf     letra, 1

        movf     letra, 0    ;Comprueba si ya envió los 20 caracteres del título
        sublw    d'20'
        btfss    3,2
        goto     OTRA3            ;Si no llego a la letra 20 sigue enviando

        movlw   0xc0            ;Posiciona el cursor en la 2da. linea
        call    CONTROL
        movlw    d'2'
        call     DEMORA            ;Demora 2ms

        clrf    letra           ;Coloca el título en el LCD
OTRA4   movf    letra, 0        ;Letra actual -> W
        call    LINEA4          ;Obtiene el caracter a colocar desde la tabla
        call    DATO            ;Envía el caracter al LCD
        incf    letra, 1

        movf    letra, 0        ;Comprueba si ya envió los 20 caracteres del título
        sublw   d'20'
        btfss   3,2
        goto    OTRA4           ;Si no llego a la letra 20 sigue enviando
        call    plo             ;RETARDO
       
        call     cambio          ;Coloca el titulo en el LCD
        clrf     letra             ;Coloca el titulo en el LCD
OTRA5   movf     letra, 0          ;Letra actual -> W
        call     LINEA5        ;Obtiene el caracter a colocar desde la tabla
        call     DATO              ;Envia el caracter al LCD
        incf     letra, 1

        movf     letra, 0    ;Comprueba si ya envió los 20 caracteres del título
        sublw    d'20'
        btfss    3,2
        goto     OTRA5            ;Si no llego a la letra 20 sigue enviando
    
        movlw   0xc0            ;Posiciona el cursor en la 2da. linea
        call    CONTROL
        movlw    d'2'
        call     DEMORA            ;Demora 2ms

        clrf    letra           ;Coloca el título en el LCD
OTRA6   movf    letra, 0        ;Letra actual -> W
        call    LINEA6          ;Obtiene el caracter a colocar desde la tabla
        call    DATO            ;Envía el caracter al LCD
        incf    letra, 1

        movf    letra, 0        ;Comprueba si ya envió los 16 caracteres del título
        sublw   d'20'
        btfss   3,2
        goto    OTRA6           ;Si no llego a la letra 20 sigue enviando
        call    plo     

        call     cambio
        clrf     letra             ;Coloca el titulo en el LCD
OTRA7   movf     letra, 0          ;Letra actual -> W
        call     LINEA7        ;Obtiene el caracter a colocar desde la tabla
        call     DATO              ;Envia el caracter al LCD
        incf     letra, 1

        movf     letra, 0    ;Comprueba si ya envio los 20 caracteres del titulo
        sublw    d'20'
        btfss    3,2
        goto     OTRA7            ;Si no llego a la letra 20 sigue enviando

        movlw   0xc0            ;Posiciona el cursor en la 2da. linea
        call    CONTROL
        movlw   d'1'
        call    DEMORA          ;Demora 1ms

        clrf    letra           ;Coloca el titulo en el LCD
OTRA8   movf    letra, 0        ;Letra actual -> W
        call    LINEA8          ;Obtiene el caracter a colocar desde la tabla
        call    DATO            ;Envia el caracter al LCD
        incf    letra, 1

        movf    letra, 0        ;Comprueba si ya envio los 20 caracteres del título
        sublw   d'20'
        btfss   3,2
        goto    OTRA8           ;Si no llego a la letra 20 sigue enviando
        call      plo
        goto    empezar
;--------------------------------------------------------------
LINEA1  addwf    pcl, 1     ;Suma el contenido de W al contador de programa (para explorar la tabla)
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   "I"
        retlw   "N"
        retlw   "G"
        retlw   "R"
        retlw   "E"
        retlw   "S"
        retlw   "E"
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   "C"
        retlw   "L"
        retlw   "A"
        retlw   "V"
        retlw   "E"
        retlw   " "
        retlw   " "

LINEA2  addwf    pcl, 1    ;Suma el contenido de W al contador de programa (para explorar la tabla)
        retlw   " "
        retlw   " "
        retlw   " " 
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   "P"
        retlw   "O"
        retlw   "R"
        retlw   " "
        retlw   "F"
        retlw   "A"
        retlw   "V"
        retlw   "O"
        retlw   "R"
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "

LINEA3  addwf    pcl, 1     ;Suma el contenido de W al contador de programa (para explorar la tabla)
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   "C"
        retlw   "L"
        retlw   "A"
        retlw   "V"
        retlw   "E"
        retlw   " "
        retlw   "C"
        retlw   "O"
        retlw   "R"
        retlw   "R"
        retlw   "E"
        retlw   "C"
        retlw   "T"
        retlw   "A"
        retlw   " "
        retlw   " "

LINEA4  addwf    pcl, 1     ;Suma el contenido de W al contador de programa (para explorar la tabla)
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   "E"
        retlw   "S"
        retlw   "P"
        retlw   "E"
        retlw   "R"
        retlw   "E"
        retlw   " "
        retlw   "P"
        retlw   "O"
        retlw   "R"
        retlw   " "
        retlw   "F"
        retlw   "A"
        retlw   "V"
        retlw   "O"
        retlw   "R"
        retlw   " "

LINEA5  addwf    pcl, 1     ;Suma el contenido de W al contador de programa (para explorar la tabla)
        retlw   " "
        retlw   "P"
        retlw   "A"
        retlw   "R"
        retlw   "A"
        retlw   " "
        retlw   "C"
        retlw   "O"
        retlw   "N"
        retlw   "S"
        retlw   "U"
        retlw   "L"
        retlw   "T"
        retlw   "A"
        retlw   "S"
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "

LINEA6  addwf    pcl, 1      ;Suma el contenido de W al contador de programa (para explorar la tabla)
        retlw   " "
        retlw   " "
        retlw   "I"
        retlw   "N"
        retlw   "G"
        retlw   "R"
        retlw   "E"
        retlw   "S"
        retlw   "E"
        retlw   " "
        retlw   " "
        retlw   "C"
        retlw   "E"
        retlw   "L"
        retlw   "U"
        retlw   "L"
        retlw   "A"
        retlw   " "
        retlw   " "
        retlw   " "

LINEA7  addwf    pcl, 1      ;Suma el contenido de W al contador de programa (para explorar la tabla)
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   "G"
        retlw   "R"
        retlw   "A"
        retlw   "C"
        retlw   "I"
        retlw   "A"
        retlw   "S"
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "

LINEA8  addwf    pcl, 1            ;Suma el contenido de W al contador de programa (para explorar la tabla)
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   " "
        retlw   "P"
        retlw   "O"
        retlw   "R"
        retlw   " "
        retlw   "S"
        retlw   "U"
        retlw   " "
        retlw   "T"
        retlw   "I"
        retlw   "E"
        retlw   "M"
        retlw   "P"
        retlw   "O"
        retlw   " "
        retlw   " "
        retlw   " "
;--------------------------------------------------------------------
DEMORA   movwf    tiempo2       ;Demora tantos milisegundos como valor en w
TOP2     movlw    d'110'
	movwf	tiempo1
TOP1	nop
	nop
	nop
	nop
	nop
	nop
	decfsz	tiempo1, 1
	goto	TOP1
	decfsz	tiempo2, 1
	goto	TOP2
	return
;--------------------------------------------------------------------
CONTROL bcf     0x08,7       ;Pone en bajo la línea de modo del LCD (Control)
        goto    ENVIAR       ;Se saltea la sig. linea
DATO    bsf     0x08,7       ;Pone en alto la linea de modo del LCD (Dato)
ENVIAR  movwf   0x06         ;Coloca el dato o control a enviar en el bus del LCD
        movlw   d'1'
        call    DEMORA          ;Demora 1ms 
        bsf     0x08,6          ;Habilita el LCD
        movlw   d'1'
        call    DEMORA         ;Demora 1ms
        bcf     0x08,6          ;Deshabilita el LCD
        movlw   d'1'
        call    DEMORA         ;Demora 1ms
        return
;-------------------------------------------------------------------
cambio  movlw    b'00000001'    ;Limpia la pantalla y pone cursor en posicion inicial
        call     CONTROL       ;para sacar los mensajes de la primera
        movlw    d'2'          ;linea
        call     DEMORA        ;Demora 2ms
        return
;----------------------------------------------------------------------
plo      movlw    .255
         movwf    reg6
qqqa     movlw    .240
         movwf    reg2
ttta     movlw    .10
         movwf    reg3         
ddda     decfsz   reg3,1
         goto     ddda
         decfsz   reg2,1
         goto     ttta
         decfsz   reg6,1
         goto     qqqa
         return
;-----------------------------------------------------------------
	end

