    ;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

;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 .100
	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'
        MOVWF VALOR
        RETURN
DOS
        MOVLW D'02'
        MOVWF VALOR
        RETURN

TRES
        MOVLW D'03'
        MOVWF VALOR
        RETURN

CUATRO
        MOVLW D'04'
        MOVWF VALOR
        RETURN

CINCO
        MOVLW D'05'
        MOVWF VALOR
        RETURN

SEIS
        MOVLW D'06'
        MOVWF VALOR
        RETURN

SIETE
        MOVLW D'07'
        MOVWF VALOR
        RETURN

OCHO
        MOVLW D'08'
        MOVWF VALOR
        RETURN

NUEVE
        MOVLW D'09'
        MOVWF VALOR
        RETURN

ASTERISCO
        MOVLW D'40'
        MOVWF VALOR
        RETURN

CERO
        MOVLW D'00'
        MOVWF VALOR
        RETURN

NUMERAL
        MOVLW D'35'
        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
    GOTO VERIFICAR ; 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
    GOTO VERIFICAR

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
    GOTO VERIFICAR

    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 .10
        MOVWF G
G5
        MOVLW .100
        MOVWF G1
G4
        MOVLW .249
        MOVWF G2
G3
        NOP
        DECFSZ G2
        GOTO G3
        DECFSZ G1
        GOTO G4
        DECFSZ G
        GOTO G5
        RETURN

        END
