    ;El siguiente programa se encarga de representar todas las letras del abecedario mediante
    ;el uso del código ASCII, comenzando desde el número 41 (A) hasta el 66 (Z)

    INCLUDE <P16F887.INC>
    LIST P=16F887
        __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
        __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

    CBLOCK 20H
    VALOR
    G
    G1
    G2
    REFRESCAMIENTO
    DOSDIG
    DIG1
    DIG2
    RESULT
    BUSCA
    ENDC

    ORG 0x00
    GOTO INICIO

    ORG 0X05
ASIG_LETRA ; BUSCA LA LETRA CON LA POSICIÓN QUE SE LE ASIGNÓ (EN ESTA PARTE)
;MI LÓGICA ES ASIGNARLE A CADA LETRA UNA POSICIÓN DEL PCL Y YA TENIENDO ESTO
;NO SE VA A LA POSICIÓN QUE LE ASIGNO SINO QUE SE SALTA A OTRO LADO Y SE VUELVE
;LOCO EL PROGRAMA

        MOVF BUSCA,W
        ADDWF   PCL,1
        RETLW	B'01110111'        ;LETRA A1-41 Elemento "0"
        RETLW	B'01111100'        ;LETRA B2-42
        RETLW	B'00111001'        ;LETRA C3-43
        RETLW	B'01011110'        ;LETRA D4-44
        RETLW	B'01111001'        ;LETRA E5-45
        RETLW	B'01110001'        ;LETRA F6-46
        RETLW	B'01101111'        ;LETRA G7-47
        RETLW	B'01110110'        ;LETRA H8-48
        RETLW	B'00000110'        ;LETRA I9-49
        RETLW	B'00001110'        ;LETRA J10-50
        RETLW	B'01111010'        ;LETRA K11-51
        RETLW	B'00111000'        ;LETRA L12-52
        RETLW	B'00110111'        ;LETRA M13-53
        RETLW	B'01010100'        ;LETRA N14-54
        RETLW	B'00111111'        ;LETRA O15-55
        RETLW	B'00110011'        ;LETRA P16-56
        RETLW	B'01100111'        ;LETRA Q17-57
        RETLW	B'01010000'        ;LETRA R18-58
        RETLW	B'01101101'        ;LETRA S19-59
        RETLW	B'01111000'        ;LETRA T20-60
        RETLW	B'00011100'        ;LETRA U21-61
        RETLW	B'00111110'        ;LETRA V22-62
        RETLW	B'01011101'        ;LETRA W23-63
        RETLW	B'01110000'        ;LETRA X24-64
        RETLW	B'01101110'        ;LETRA Y25-65
        RETLW	B'01001001'        ;LETRA Z26-66
        RETURN

INICIO
;CONFIGURACION DE LOS PUERTOS
        BANKSEL ANSEL
        CLRF ANSEL
        CLRF ANSELH

        BANKSEL TRISA
        CLRF TRISC
        MOVLW B'00001111'
        MOVWF TRISB

        BANKSEL PORTA
        CLRF PORTB
        CLRF PORTC
        CLRF PCLATH

PRINCIPAL
        MOVLW D'2' ;Mi contador para la cantidad de teclas que voy a presionar en el matricial
        MOVWF DOSDIG; que en este caso deben ser obligatoriamente dos dígitos

;VERIFICAR TECLA DE LA MATRIZ
VERIFICAR
        CALL TECLADO ; Rutina que me ubica el número de la matriz
        CALL CONTADOR_1 ; Rutina que me cuenta el primer o segundo dígito para formar la letra
        GOTO VERIFICAR

;COORDENADAS DE LA MATRIZ - COMIENZO DE LA RUTINA DE MATRICIAL
TECLADO
        CLRF PORTB
        CLRF VALOR

        ;REFRESCAMIENTO
        MOVLW .249
        MOVWF REFRESCAMIENTO

DECREMENTO
        DECFSZ REFRESCAMIENTO
        GOTO DECREMENTO

        BSF PORTB,4

        BTFSC PORTB,0
        GOTO UNO
        BTFSC PORTB,1
        GOTO DOS
        BTFSC PORTB,2
        GOTO TRES

;REFRESCAMIENTO
        MOVLW .249
        MOVWF REFRESCAMIENTO

DECREMENTO1
        DECFSZ REFRESCAMIENTO
        GOTO DECREMENTO1

        BCF PORTB,4
        BSF PORTB,5

        BTFSC PORTB,0
        GOTO CUATRO

        BTFSC PORTB,1
        GOTO CINCO

        BTFSC PORTB,2
        GOTO SEIS

    ;REFRESCAMIENTO
        MOVLW .249
        MOVWF REFRESCAMIENTO

DECREMENTO2
        DECFSZ REFRESCAMIENTO
        GOTO DECREMENTO2

        BCF PORTB,5
        BSF PORTB,6

        BTFSC PORTB,0
        GOTO SIETE

        BTFSC PORTB,1
        GOTO OCHO

        BTFSC PORTB,2
        GOTO NUEVE

;REFRESCAMIENTO
        MOVLW .249
        MOVWF REFRESCAMIENTO

DECREMENTO3
        DECFSZ REFRESCAMIENTO
        GOTO DECREMENTO3

        BCF PORTB,6
        BSF PORTB,7

        BTFSC PORTB,0
        GOTO ASTERISCO

        BTFSC PORTB,1
        GOTO CERO

        BTFSC PORTB,2
        GOTO NUMERAL

        ;BCF PORTB,7
        GOTO TECLADO

;VALORES DE LAS COORDENADAS DE LA MATTRIZ
UNO
        MOVLW D'01'
        CALL RETARDO
        MOVWF VALOR
        RETURN
DOS
        MOVLW D'02'
        CALL RETARDO
        MOVWF VALOR
        RETURN

TRES
        MOVLW D'03'
        CALL RETARDO
        MOVWF VALOR
        RETURN

CUATRO
        MOVLW D'04'
        CALL RETARDO
        MOVWF VALOR
        RETURN

CINCO
        MOVLW D'05'
        CALL RETARDO
        MOVWF VALOR
        RETURN

SEIS
        MOVLW D'06'
        CALL RETARDO
        MOVWF VALOR
        RETURN

SIETE
        MOVLW D'07'
        CALL RETARDO
        MOVWF VALOR
        RETURN

OCHO
        MOVLW D'08'
        CALL RETARDO
        MOVWF VALOR
        RETURN

NUEVE
        MOVLW D'09'
        CALL RETARDO
        MOVWF VALOR
        RETURN

ASTERISCO
        MOVLW D'40'
        CALL RETARDO
        MOVWF VALOR
        RETURN

CERO
        MOVLW D'00'
        CALL RETARDO
        MOVWF VALOR
        RETURN

NUMERAL
        MOVLW D'35'
        CALL RETARDO
        MOVWF VALOR
        RETURN ; FINAL DE LA RUTINA DEL MATRICIAL

CONTADOR_1 ; Verifica cuántas teclas se han pulsado para arrojar la tecla
        DECFSZ DOSDIG
        GOTO DIG_1
        GOTO DIG_2

DIG_1 ; Primer dígito me manda de nuevo
        MOVF VALOR,W ; a la rutina del
        MOVWF DIG1 ; matricial para
        CLRF VALOR ; que busque el
        RETURN ; otro dígito

DIG_2 ; Ya se ingresó el segundo
        MOVF VALOR,W ; dígito
        MOVWF DIG2 ; preparo
        CLRF VALOR ; para que
        CALL SUMA_DIG ; me forme la suma de los dos dígitos, si es 40,41..., 50, 51... , 60, 61...
        CALL BUSCAR_LETRA ; rutina que me ubica exactamente qué letra es con los dígitos que se ingresaron,
        ;MOVLW 1                          ;en este ejemplo, la tabla se encuentra en la página 1.
        ;MOVWF PCLATH           ;carga el número de página en PCLATH
        CALL ASIG_LETRA ; ¡¡¡RUTINA CON PROBLEMAS!!!

MOSTRAR_LETRA
        ;MOVF BUSCA,W
        MOVWF PORTC
        ;CALL RETARDO
        CLRF VALOR
        CLRF BUSCA
        CLRF PORTC
        RETURN

SUMA_DIG ; VOLTEA EL PRIMER NÚMERO Y LO SUMA CON EL OTRO PARA ASÍ TENER EL HEXADECIMAL ASCII
        MOVF DIG1,F
        SWAPF DIG1,W
        ADDWF DIG2,W
        MOVWF RESULT
        RETURN

BUSCAR_LETRA ;COMPARO BIT POR BIT EL NÚMERO FORMADO EN ASCII PARA QUE ME MANDE A LA LETRA QUE DESEO

        CLRF BUSCA
        BTFSS RESULT,6
        RETURN

        BTFSC RESULT,5
        GOTO DEC60

        BTFSC RESULT,4
        GOTO DEC50
        GOTO DEC40

DEC40
        BTFSC RESULT,3
        GOTO IJ
        BTFSC RESULT,2
        GOTO EFGH
        BTFSC RESULT,1
        GOTO CD
        BTFSC RESULT,0
        GOTO LETRAB
        GOTO LETRAA

IJ
        BTFSC RESULT,0
        GOTO LETRAJ
        GOTO LETRAI

EFGH
        BTFSC RESULT,1
        GOTO GH
        BTFSC RESULT,0
        GOTO LETRAF
        GOTO LETRAE

CD
        BTFSC RESULT,0
        GOTO LETRAD
        GOTO LETRAC

GH
        BTFSC RESULT,0
        GOTO LETRAH
        GOTO LETRAG

DEC50
        BTFSC RESULT,3
        GOTO ST
        BTFSC RESULT,2
        GOTO OPQR
        BTFSC RESULT,1
        GOTO MN
        BTFSC RESULT,0
        GOTO LETRAL
        GOTO LETRAK

ST
        BTFSC RESULT,0
        GOTO LETRAT
        GOTO LETRAS

OPQR
        BTFSC RESULT,1
        GOTO QR
        BTFSC RESULT,0
        GOTO LETRAP
        GOTO LETRAO

MN
        BTFSC RESULT,0
        GOTO LETRAN
        GOTO LETRAM

QR
        BTFSC RESULT,0
        GOTO LETRAR
        GOTO LETRAQ

DEC60
        BTFSC RESULT,3
        GOTO TECLADO
        BTFSC RESULT,2
        GOTO YZ
        BTFSC RESULT,1
        GOTO XW
        BTFSC RESULT,0
        GOTO LETRAV
        GOTO LETRAU

YZ
        BTFSC RESULT,0
        GOTO LETRAZ
        GOTO LETRAY

XW
        BTFSC RESULT,0
        GOTO LETRAX
        GOTO LETRAW

LETRAA
        MOVLW 0x00
        MOVWF BUSCA
        RETURN

LETRAB
        MOVLW 0x01
        MOVWF BUSCA
        RETURN

LETRAC
        MOVLW 0x02
        MOVWF BUSCA
        RETURN

LETRAD
        MOVLW 0x03
        MOVWF BUSCA
        RETURN

LETRAE
        MOVLW 0x04
        MOVWF BUSCA
        RETURN

LETRAF
        MOVLW 0x05
        MOVWF BUSCA
        RETURN

LETRAG
        MOVLW 0x06
        MOVWF BUSCA
        RETURN

LETRAH
        MOVLW 0x07
        MOVWF BUSCA
        RETURN

LETRAI
        MOVLW 0x08
        MOVWF BUSCA
        RETURN

LETRAJ
        MOVLW 0x09
        MOVWF BUSCA
        RETURN

LETRAK
        MOVLW 0x0A
        MOVWF BUSCA
        RETURN

LETRAL
        MOVLW 0X0B
        MOVWF BUSCA
        RETURN

LETRAM
        MOVLW 0X0C
        MOVWF BUSCA
        RETURN

LETRAN
        MOVLW 0X0D
        MOVWF BUSCA
        RETURN

LETRAO
        MOVLW 0X0E
        MOVWF BUSCA
        RETURN

LETRAP
        MOVLW 0X0F
        MOVWF BUSCA
        RETURN

LETRAQ
        MOVLW 0X10
        MOVWF BUSCA
        RETURN

LETRAR
        MOVLW 0X11
        MOVWF BUSCA
        RETURN

LETRAS
        MOVLW 0X12
        MOVWF BUSCA
        RETURN

LETRAT
        MOVLW 0X13
        MOVWF BUSCA
        RETURN

LETRAU
        MOVLW 0X14
        MOVWF BUSCA
        RETURN

LETRAV
        MOVLW 0X15
        MOVWF BUSCA
        RETURN

LETRAW
        MOVLW 0X16
        MOVWF BUSCA
        RETURN

LETRAX
        MOVLW 0X17
        MOVWF BUSCA
        RETURN

LETRAY
        MOVLW 0X18
        MOVWF BUSCA
        RETURN

LETRAZ
        MOVLW 0X19
        MOVWF BUSCA
        RETURN

RETARDO
        MOVLW .249
        MOVWF G1
G3
        DECFSZ G1
        GOTO G3
        RETURN

        END