; File TECLADO1F628.ASM
; Assembly code for PIC16F628 microcontroller

; recibe información de teclado matricial de 16 teclas (4 renglones, 4 columnas) y 
; cuando se oprime una tecla, despliega en los LEDS el código renglón-columna, 
; encendiendo los LEDS correspondientes.
; la velocidad de barrido del teclado es deliberadamente lenta para observar claramente
; el procedimiento. la tecla debe oprimirse durante casi un segundo.
; el programa debe de ejecutarse en el modo AUTORUN.

; Configuración del CPU
; 16F84, Oscilador cristal 4 Mhz,
; watchdog timer off, power-up timer on)
; incluye archivo p16f628.inc

	processor 16f628
	include	  <p16f628.inc>
	__config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF 

#DEFINE		BANCO0	BCF	STATUS,RP0
#DEFINE		BANCO1	BSF	STATUS,RP0
I			EQU	H'24'		;valor columna (salida en puerto B, RB0...RB3)
J			EQU	H'20'		;contador 4 rotaciones
K			EQU	H'21'		;valor renglón (entrada de puerto B, RB4..RB7)
L			EQU	H'22'		;variable subrutina delay
M			EQU	H'23'		;variable subrutina delay
PUERTOS		MACRO
			MOVLW	H'07'
			MOVWF	CMCON
			BSF	STATUS,RP0	;ELIJE EL BANCO DE REGISTROS ESPECIALES 1
			CLRF	VRCON
			MOVLW	H'1E'		;RA0=SALIDA, RA1..RA4=ENTRADAS
			MOVWF	TRISA		;PROGRAMA LA DIRECCIÓN DE LOS BITS
			MOVLW	H'F0'		;RB0..RB3=SALIDAS, RB4...RB7=ENTRADAS
			MOVWF	TRISB
			BCF	OPTION_REG,7	;RESISTENCIAS DE PULL UP EN PUERTO B, RB4...RB7
			BCF	STATUS,RP0	;ELIGE EL BANCO 0
		ENDM

; aquí inicia el programa

			org 	0
begin:			PUERTOS			;macro: inicializa los puertos A y B.
vuelta1:		movlw	H'EF'		;listo para iniciar rotación
			movwf	I
			movwf	PORTB
			movlw	D'4'
			movwf	J		;contador de 4 corrimientos
vuelta2:		rrf	I,f		;rotación de bits RB0..RB3 en puerto B
			movfw	I
			movwf	PORTB
			call	delay		;50 ms
			movfw	PORTB		;lee el puerto B
			iorlw	H'0F'		;conserva solo los bits RB4...RB7
			movwf	K
			comf	K,f
			btfss	STATUS,2	;si la lectura es 0, continúa
			goto	teclazo		;si la lectura es diferente de 0, teclazo...
			decfsz	J,f
			goto	vuelta2
			goto 	vuelta1
teclazo:		BANCO1					
			movlw	H'00'
			movwf	TRISB		;programa todos los bits de puerto B como salidas
			BANCO0
			comf	I,f		;logica positiva
			movfw	I		;toma valor
			andlw	H'0F'		;solo los bits RB0...RB3
			movwf	I		;regresa el valor a I
			movfw	K		;lee localidad con contenido
			andlw	H'F0'		;solo bits D4...D7
			iorwf	I,w		;suma los contenidos de I y K, resultado en W
			movwf	PORTB		;escribe en puerto B, código renglón y columna.
malla:			goto 	malla
delay:			movlw	D'250'		;250 milisegundos. cambiar a '50' para funcionamiento normal
			movwf	M
mallaM:			movwf	L
mallaL:			decfsz	L,f
			goto	mallaL	
			decfsz	M,f
			goto	mallaM
			return
			end

			
			
		
	

	

