; File TECLADO3F88TINY.ASM
; Assembly code for PIC16F88 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 ASCII de dicha tecla.
; 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
; 16F628, Oscilador cristal 4 Mhz,
; watchdog timer off, power-up timer on)
; incluye archivo p16f88.inc

	processor 16f88
	include	  <p16f88.inc>
	

#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
			
			BANCO0
			bcf	RCSTA,SPEN		;DESHABILITA UART
			BANCO1
			movlw	7
			movwf	CMCON
			clrf	CVRCON
			clrf	ANSEL				
			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		;RB4...RB7, CON PULL UPS
			BANCO0
		ENDM

; aquí inicia el programa
			org		0
			CLRF	PCLATH
			goto	begin
			org 	3
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			;lógica positiva
			movfw	I
			andlw	H'0F'			;solo los bits RB0...RB3
			movwf	I			;regresa el valor a I
			movfw	K			;lee localidad con contenido de rotación
			andlw	H'F0'			;solo bits D4...D7
			iorwf	I,f			;suma I y K resultado en I
			movfw	I			;suma los contenidos de I y K, resultado en W
			movwf	PORTB			;escribe en puerto B, CODIGO RENGLON COLUMNA
ide:			movlw	D'17'			;pasa a la parte de identificación
			movwf	K			;K = contador de caracteres en la tabla 
loop:			decf	K,f			;decrementa K
			movfw	K			;transfiere a W
			call	tabla
			subwf	I,w			;regresa de la tabla con contenido de caracter
			btfss	STATUS,2		;si I=caracter, se va a etiqueta "found"
			goto 	loop
found:			movfw	K
			movwf	PORTB			;muestra en leds contenido de offset.
			movlw	D'16'			
			addwf	K,w				;añade 16 localidades a offset
			call	tabla			;trae valor ASCII en tabla
			movwf	PORTB			;despliega en puerto B
again:			goto	again			
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	
tabla			addwf	PCL,f
							;CÓDIGOS RENGLÓN-COLUMNA
			retlw	H'11'			;'0'
			retlw	H'12'			;'1'
			retlw	H'14'			;'2'
			retlw	H'18'			;'3'
			retlw	H'21'			;'4'
			retlw	H'22'			;'5'
			retlw	H'24'			;'6'
			retlw	H'28'			;'7'
			retlw	H'41'			;'8'
			retlw	H'42'			;'9'
			retlw	H'44'			;'A'
			retlw	H'48'			;'B'
			retlw	H'81'			;'C'
			retlw	H'82'			;'D'
			retlw	H'84'			;'E'
			retlw	H'88'			;'F'
							;CODIGOS ASCII
			retlw	H'30'			;'0'
			retlw	H'31'			;'1'
			retlw	H'32'			;'2'
			retlw	H'33'			;'3'
			retlw	H'34'			;'4'
			retlw	H'35'			;'5'
			retlw	H'36'			;'6'
			retlw	H'37'			;'7'
			retlw	H'38'			;'8'
			retlw	H'39'			;'9'
			retlw	H'41'			;'A'
			retlw	H'42'			;'B'
			retlw	H'43'			;'C'
			retlw	H'44'			;'D'
			retlw	H'45'			;'E'
			retlw	H'46'			;'F'
			
			end

			
			
		
	

	

