;
;					EJEMPLO 3.2
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Trainer PLUS
;
;Introducción al manejo del teclado.
;
;Haciendo uso de las rutinas incluidas en el fichero TECLADO.INC, se trata de leer el tecla-
;do y, visualizar sobre el display de la puerta B el número de la tecla pulsada. La 
;visualización se mantiene estable durante dos segundos hasta una nueva pulsación.
;
;Se trata de un ejemplo en el que la Puerta B se reconfigura dinámicamente. Inicialmente es
;configurada como salida para presentación del resultado. Posteriormente, la rutina de 
;exploración del teclado reconfigura RB0-RB3 como entradas y RB4-RB7 como salidas.

		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos
                 
Key_var		equ   	0x0c		;Inicio de las variables de manejo del teclado
Delay_Cont	equ	0x12		;Variable para la temporización

		org	0x00		;Vector de Reset
		goto	Inicio
		org	0x05		;Salva vector de interrupción

		include	"TECLADO.INC"	;Incluye rutinas de manejo del teclado

;*********************************************************************************
;Delay_var: Esta rutina de propósito general realiza una temporización variable
;entre 50 mS y 12.8". Se emplea un preescaler de 256 y al TMR0 se le carga con 195. 
;La velocidad de trabajo es de 4Mhz y por tanto el TMR0 se incrementa cada uS. De 
;esta forma, el TMR0 debe contar 195 eventos que, con un preescaler de 256 hace una
;intervalo total de 50000 uS/50 mS (195 * 256). El valor 195 hay que expresarlo
;en Hex. (c3) y como el TMR0 es ascendente habrá que cargar su complemento (3C hex.)
;Dicho intervalo de 50 mS se repite tantes veces como indique la variable "Delay_cont",
;es por ello que el delay mínimo es de 50 mS ("Delay_cont=1) y el máxima de 12.8" 
;(Delay_cont=255).

Delay_var:	bcf	INTCON,T0IF	;Desconecta el flag de rebosamiento
		movlw	0x3c		;Complemento hex. de 195
		movwf	TMR0		;carga el TMR0
Intervalo	clrwdt			;Refrescar el WDT
		btfss	INTCON,T0IF	;Rebasamiento del TMR0 ??
		goto	Intervalo	;Todavía no		
		decfsz	Delay_Cont,F	;Decrementa contador de intervalos
		goto	Delay_var	;Repite el intervalo de 50 mS
		return	

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida				
		movlw	b'00000111'
		movwf	OPTION_REG	;Preescaler de 256 para el TMR0
		bcf	STATUS,RP0	;Selecciona banco 0	
		
Loop		clrwdt			;Refresco del WDT
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop		;No

		call	Key_BCD		;Si, convierte a código BCD

		movf	Tecla,W
		call	BCD_7seg	;Convierte a código 7 segmentos

		movwf	PORTB		;Lo visualiza sobre el display de la Puerta B
		movlw	.40
		movwf	Delay_Cont
		call	Delay_var	;Temporiza 2 segundos
		clrf	PORTB		;Desactiva visualización
		goto	Loop
	
		end			;Fin del programa fuente

