    LIST P=16F887
    INCLUDE "P16F887.INC"

            __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF &_INTRC_OSC_NOCLKOUT
            __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V


    CBLOCK 20H
    TECLA
    CONTA
    CONTB
    CONTC
    CONTAR
    MULTI1
    MULTI2
    LSB
    RES1
    RES2
    MOST0
    MOST1
    MOST2
    DIG1
    DIG2
    PRI
    SEG
    TER
    ENDC

	ORG 0X00
    GOTO PRINCIPAL

    Org      900h
TABLASCII2
    ADDWF	PCL,F
    RETLW   H'30'
    RETLW	H'31'        ;LETRA 1
    RETLW	H'32'        ;LETRA 2
    RETLW	H'33'        ;LETRA 3
    RETLW	H'34'        ;LETRA 4
    RETLW	H'35'        ;LETRA 5
    RETLW	H'36'	     ;LETRA 6
    RETLW	H'37'        ;LETRA 7
    RETLW	H'38'        ;LETRA 8
    RETLW	H'39'        ;LETRA 9
    RETURN

PRINCIPAL

	BANKSEL	ANSEL
	CLRF ANSEL
	CLRF ANSELH
	BANKSEL OSCCON
	MOVLW B'1110100'        ; Oscilador interno estable a 8MHz.
	MOVWF OSCCON

	BANKSEL	TRISA
	CLRF TRISD
	CLRF TRISA
	CLRF TRISC
	CLRF TRISB
	CLRF TRISE

	MOVLW B'01110000'
	MOVWF TRISB

	BANKSEL	PORTA
	CLRF PORTA
	CLRF PORTB
	CLRF PORTD
	CLRF PORTC
	CLRF PORTE
	MOVLW .2
	MOVWF CONTAR

INICIO
	MOVLW B'00000001'
	MOVWF PORTB
	CLRF TECLA

;=============RUTINA: DETECCION DE FILAS============
;ESTA RUTINA HACE EL RECORRIDO DE DETECCION DE PRESION DE TECLAS
PRIMERFILA
	BTFSS PORTB,0
	GOTO SEGUNDAFILA
	GOTO COLUMNA1

SEGUNDAFILA
	MOVLW .03
	MOVWF TECLA
	BTFSS PORTB,1
	GOTO TERCERAFILA
	GOTO COLUMNA1

TERCERAFILA
	MOVLW .06
	MOVWF TECLA
	BTFSS PORTB,2
	GOTO CUARTAFILA
	GOTO COLUMNA1

CUARTAFILA
	MOVLW .09
	MOVWF TECLA
	BTFSS PORTB,3
	GOTO PRIMERFILA
	GOTO COLUMNA1
;=============RUTINA: DETECCION DE COLUMNAS============
;ESTA RUTINA VALIDA EN QUE COLUMNA SE ENCUENTRA LA TECLA PRESIONADA

COLUMNA1
	BTFSS PORTB,4
	GOTO COLUMNA2
	GOTO TECLA1

COLUMNA2
	BTFSS PORTB,5
	GOTO COLUMNA3
	GOTO TECLA2

COLUMNA3
	BTFSS PORTB,6
	GOTO CAMBIAFILA
	GOTO TECLA3
	;SI NO SE DETECTA NINGUNA TECLA SE PROCEDE A CAMBIAR A LA SIGUIENTE FILA
CAMBIAFILA
	BTFSS PORTB,3
	GOTO PASALA
	GOTO INICIO
PASALA
	RLF PORTB
	GOTO PRIMERFILA
	;=============RUTINA: TECLAS============
	;UNA VES PRECINADA LA TECLA SEGUN LA COLUMNA SELECCIONADA SE REALIZA
	;LA SUBRUTINA PERTINENTE
TECLA1
B1	BTFSC PORTB,4
	GOTO B1
	MOVLW 0X01
	ADDWF TECLA,1
	CALL GUAR
	CLRF TECLA
    CALL RETARDO
	GOTO INICIO

TECLA2
B2	BTFSC PORTB,5
	GOTO B2
	MOVLW 0X02
	ADDWF TECLA,1
	CALL GUAR
	CLRF TECLA
    CALL RETARDO
	GOTO INICIO

TECLA3
B3	BTFSC PORTB,6
	GOTO B3
	MOVLW 0X03
	ADDWF TECLA,1
	CALL GUAR
	CLRF TECLA
    CALL RETARDO
	GOTO INICIO

GUAR
	DECFSZ CONTAR,1
	CALL GUARDO1
	BTFSS CONTAR,0
	CALL GUARDO2
	RETURN

GUARDO1
	MOVFW TECLA
	MOVWF MULTI1
	CALL  TABLA
	MOVWF PORTA
	CALL  RETARDO
    CLRF  TECLA
	RETURN

GUARDO2
	MOVFW TECLA
	MOVWF MULTI2
    CALL  TABLA
	MOVWF PORTC
	CALL RETARDO
    CLRF TECLA
    CALL MULTIPLICACION
    CALL TRANSFORMACION
	RETURN

TABLA ;DEBO TENER ALGO EN EL ACUMULADOR
	ADDWF PCL,1 ;PCL ES UN REGISTRO QUE ESTA EN LOS 4 BANCOS (0 PARA EL ACUMULADOR Y 1 PARA LA MISMA FUNCION)
	RETLW  B'00111111'
	RETLW  B'00000110'
	RETLW  B'01011011'
	RETLW  B'01001111'
	RETLW  B'01100110'
	RETLW  B'01101101'
	RETLW  B'01111101'
	RETLW  B'00000111'
	RETLW  B'01111111'
	RETLW  B'01100111'
	RETLW  B'01110111'
	RETLW  B'00111111'
    RETURN

RETARDO
	MOVLW D'10'
	MOVWF CONTA
BUCLE3
	MOVLW D'60'
	MOVWF CONTB
BUCLE2
	MOVLW D'60'
	MOVWF CONTC
BUCLE1
	DECFSZ CONTC,1
	GOTO BUCLE1
	DECFSZ CONTB,1
	GOTO BUCLE2
	DECFSZ CONTA,1
	GOTO BUCLE3
	RETURN

;*********************************************************************************
MULTIPLICACION ;Rutina para multiplicar los dos números pulsados
;*********************************************************************************
VARIABLE_DE_CARGA
    MOVF MULTI2,W

SUMA_1
    DECFSZ  MULTI1,1
    GOTO    SUMA_2
    RETURN

SUMA_2
    ADDWF   MULTI2,W   ; X +
    MOVWF   LSB
    GOTO    SUMA_1

;*********************************************************************************
TRANSFORMACION ;Rutina para separar cada número del resultado de la multiplicación
;*********************************************************************************

RESULTADO_2
    MOVLW  H'0F'
    MOVWF  DIG1
    MOVF   LSB,W
    ANDWF  DIG1,W
    MOVWF  RES1
    MOVF   RES1,W
    CALL   TABLASCII1
    MOVWF  MOST1
    GOTO RESULTADO_3

TABLASCII1
    ADDWF	PCL,F
    RETLW   H'30'
    RETLW	H'31'        ;LETRA 1
    RETLW	H'32'        ;LETRA 2
    RETLW	H'33'        ;LETRA 3
    RETLW	H'34'        ;LETRA 4
    RETLW	H'35'        ;LETRA 5
    RETLW	H'36'	     ;LETRA 6
    RETLW	H'37'        ;LETRA 7
    RETLW	H'38'        ;LETRA 8
    RETLW	H'39'        ;LETRA 9
    RETURN

RESULTADO_3
    MOVLW  H'F0'
    MOVWF  DIG2
    MOVF   LSB,W
    ANDWF  DIG2,W
    MOVWF  RES2
    SWAPF  RES2,W
    movlw h'09'  ; pag 0 subpagina 6
    movwf PCLATH
    MOVF   RES2,W
    CALL   TABLASCII2
    MOVWF  MOST2
    CALL   PANTALLA_LCD_2
    RETURN

PANTALLA_LCD_2 ;Rutina Principal de la pantalla LDC
	CALL INICIAR_LCD_2
	CALL MOSTRADO_2
    RETURN

INICIAR_LCD_2 ;Rutina de configuración del LCD
	MOVLW 00C	;ENCENDER APAGAR PANTALLA
	CALL OPCOM_2
	MOVLW 006	;MENSAJE FIJO E INCREMENTAL
	CALL OPCOM_2
	MOVLW 001	;BORRAR Y RETORNAR AL INICIO
	CALL OPCOM_2
	MOVLW 0x82      ;Inicia escritura en línea 1
	CALL OPCOM_2
	MOVLW 0x3C      ;Inicia escritura en línea 1
	CALL OPCOM_2
	MOVLW 0x80  ; Inicia escritura en línea 1 ( 0X8(el numero de aca es para designar en q posicion iniciar la escritura), el 0 es para iniciar pegadito a la izq de la pantalla)
	CALL OPCOM_2
    RETURN

MOSTRADO_2
    MOVF MOST1,W
    CALL OPDAT_2
    CALL RETARDO
    MOVF MOST2,W
    CALL OPDAT_2
    CALL RETARDO
    RETURN

    ;=============SUBRRUTINA: OPERACION DE ESCRITURA DE COMANDO============
OPCOM_2
	BCF PORTE,0	;RS=0 PARA REGISTRO DE COMANDOS
	BCF PORTE,1	;RW=0 PARA ESCRITURA
	BSF PORTE,2	;E=1

	CLRF PORTD
	MOVWF PORTD
	CALL RETARDO	;(RETARDO)
	BCF PORTE,2
	RETURN
    ;=============SUBRRUTINA: OPERACION DE ESCRITURA DE DATO=============
OPDAT_2
	BSF PORTE,0	;RS=1 PARA REGISTRO DE DATOS
	BCF PORTE,1	;RW=0 PARA ESCRITURA
	BSF PORTE,2
	CLRF PORTD
	MOVWF PORTD
	CALL RETARDO	;(RETARDO)
	BCF PORTE,2
	RETURN
    END