	list p=16F84A
	include "p16F84A.inc"

;------------------------------------------------
			
	tecla		equ 	0x10	
	columna  	equ 	0x11
	salv_w 		equ 	0x12
	salv_s 		equ 	0x13
	d4			equ		0x14
	d3			equ		0x15
	d2			equ		0x16
	d1			equ		0x17

;------------------------------------------------
;MACROS
;------------------------------------------------

BANK0	macro
		bcf 	STATUS,RP0
		endm

BANK1	macro
		bsf		STATUS,RP0
		endm

PUSH	macro
		movwf	salv_w
		swapf	salv_w,F
		swapf	STATUS,W
		movwf	salv_s
		endm

POP		macro
		swapf	salv_s,W
		movwf	STATUS
		swapf	salv_w,W
		endm

;------------------------------------------------		
			org 	0x00
			goto 	Inicio
			
			org 	0x04
			goto 	TECLADO

;------------------------------------------------
;Tabla considerando lámparas 7 seg cátodo común.
;------------------------------------------------
TABLA 	addwf 	PCL,f ;Suma de PC con el dígito a representar
		retlw 	0x06 ;el uno
		retlw 	0x5B ;el dos
		retlw 	0x4F ;el tres
		retlw	0x71 ;F
		retlw 	0x66 ;el cuatro
		retlw 	0x6D ;el cinco
		retlw 	0x7D ;el seis
		retlw	0x79 ;E
		retlw 	0x07 ;el siete
		retlw 	0x7F ;el ocho
		retlw 	0x6F ;el nueve
		retlw	0x97 ;D
		retlw	0x77 ;A
		retlw	0x3F ;0
		retlw	0x7A ;B
		retlw	0x39 ;C
	 	retlw 	0x00 ;en blanco

;------------------------------------------------
;------------------------------------------------
;Programa Principal
;------------------------------------------------
;------------------------------------------------
Inicio clrf PORTB
		BANK1
		movlw b'00000000' 	;borra latch de salida
		movwf TRISB			
		movlw b'11110'
		movwf TRISA
		movlw b'10000111'	;preescalador del timer0 a 256.
		movwf OPTION_REG
		BANK0
		movlw 0x9C			;N=156
		movwf TMR0
		movlw b'10100000'
		movwf INTCON
		movlw 0x0D
		movwf tecla
		clrf columna		;inicializa registros de trabajo
		clrf d1
		clrf d2
		clrf d3
		clrf d4
		bcf PORTA,0			;apagado 7 seg inicialmente

loop	movf d1,0			;carga valor de tecla en el acumulador
		call TABLA			
		movwf PORTB			;saca representacion 7 seg por el puerto B
		bsf PORTA,0			;enciende digito 7 seg.
		NOP
		bcf	PORTA,0			;apaga digito 7 seg
		
		movf d2,0			;carga valor de tecla en el acumulador
		call TABLA			
		movwf PORTB			;saca representacion 7 seg por el puerto B
		bsf PORTA,1			;enciende digito 7 seg.
		NOP
		bcf	PORTA,1			;apaga digito 7 seg

		movf d3,0			;carga valor de tecla en el acumulador
		call TABLA			
		movwf PORTB			;saca representacion 7 seg por el puerto B
		bsf PORTA,3			;enciende digito 7 seg.
		NOP
		bcf	PORTA,3			;apaga digito 7 seg

		movf d4,0			;carga valor de tecla en el acumulador
		call TABLA			
		movwf PORTB			;saca representacion 7 seg por el puerto B
		bsf PORTA,4			;enciende digito 7 seg.
		NOP
		bcf	PORTA,4			;apaga digito 7 seg
		goto loop			
;------------------------------------------------
;ATENCIóN AL TECLADO
;------------------------------------------------

	TECLADO		PUSH 		;guardo contenido de w y status durante la int.
		bcf 	INTCON,2	;clear T0IF
		movlw 	0x9C		;rerponer timer.
		movwf 	TMR0
		bcf 	PORTA,0		;apagado 7 seg
		clrf 	PORTB
		BANK1
		movlw 	b'11110000'
		movwf 	TRISB		;pB0-PB3 salidas, PB4-PB7 entradas
		bcf 	OPTION_REG,7;habilita pull-ups
		BANK0
		movlw 	b'11110111'	;saca un 0 por la columna 0
		movwf 	PORTB
		NOP

	explora	btfss PORTB,7	;¿es 0 la fila cero?
		goto row0
		btfss PORTB,6		;¿es 0 la fila uno?
		goto row1
		btfss PORTB,5		;¿es 0 la fila dos?
		goto row2
		btfss PORTB,4		;¿es 0 la fila tres?
		goto row3
		movf columna,0		;¿columna es = 3?
		xorlw 0x03
		btfsc STATUS,Z
		goto final
		incf columna,1
		rrf PORTB,1
		NOP
		goto explora

row0	movf 	columna,0
		movwf 	tecla
		movf	d3
		movwf	d4
		movf	d2
		movwf	d3
		movf	d1
		movwf	d2
		movf	tecla
		movwf	d1			
		goto 	final
		

row1 	movf 	columna,0
		addlw 	0x04
		movwf 	tecla
		movf	d3
		movwf	d4
		movf	d2
		movwf	d3
		movf	d1
		movwf	d2
		movf	tecla
		movwf	d1	
		goto 	final

row2 	movf 	columna,0
		addlw 	0x08
		movwf 	tecla
		movf	d3
		movwf	d4
		movf	d2
		movwf	d3
		movf	d1
		movwf	d2
		movf	tecla
		movwf	d1	
		goto 	final

row3		movf columna,0
		addlw 0x0C
		movwf tecla
		movf	d3
		movwf	d4
		movf	d2
		movwf	d3
		movf	d1
		movwf	d2
		movf	tecla
		movwf	d1	
		goto final


final 	clrf columna 	;limpio contador de columna
		clrf PORTB		;reconfiguro PB
		BANK1
		movlw b'00000000'
		movwf TRISB		;PB0-7 salidas
		BANK0
		POP				;restauro contenido de W y status al regresar a INT
		retfie 
	
 end