;
;					EJEMPLO 3.4
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Trainer PLUS
;
;Otra de teclado y LCD.
;
;El ejemplo, similar al anterior, pretende visualizar sobre el LCD, las teclas según se van
;pulsando.
;
;El ejemplo pretende mostrar cómo es posible gobernar dos periféricos distintos conectados
;a la misma puerta (LCD y teclado). Para ello basta reprogramarla dinámicamente en el 
;tiempo según sea necesario.

		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos
                 
Lcd_var		equ	0x0c		;Inicio de las variables para el LCD
Key_var		equ	0x0e		;Inicio de las variables del teclado				
Contador_C	equ	0x14		;Contador de caracteres
Contador_L	equ	0x15		;Contador de líneas
					
		org	0x00		;Vector de reset
		goto	Inicio
		org	0x05		;Salva vector de interrupción
				
		include	"LCD_CXX.INC"	;Incluir rutinas de manejo del LCD
		include	"TECLADO.INC"	;Incluir rutinas de manejo del teclado
							
Inicio:		bsf	STATUS,RP0	;Selecciona página 1 de datos
		movlw	b'00001111'
		movwf	OPTION_REG	;Preescalr de 128 asignado al WDT
		bcf	INTCON,GIE	;Desconectar interrupciones
		bcf	STATUS,RP0	;Selecciona página 0 de datos
		clrwdt			;Refrescar WDT
				
		call	UP_LCD		;Configura Puerta A y B como salidas
		call	LCD_INI		;Rutina de inicialización del LCD
		movlw	b'00001110'
		call	LCD_REG		;LCD en ON, cursor ON
Borra_LCD	movlw	b'00000001'
		call	LCD_REG		;Borra LCD y HOME

Inicia_L	movlw	.2
		movwf	Contador_L	;Inicia contador de líneas
Inicia_C	movlw	.16
		movwf	Contador_C	;Inicia contador de caracteres

Loop:		clrwdt			;Refrescar el WDT
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ?
		goto	Loop		;No, seguir explorando
				
		call	Key_BCD		;Convierte código de tecla a código BCD
		
		movf	Tecla,W
		sublw	.9
		btfss	STATUS,C        ;Es mayor que 9 (A, B,C,D,E,F)?
		goto	Mayor_que_9	;Si
		movf	Tecla,W		;No
		addlw	0x30            ;Ajuste ASCII de los caracteres del 0 al 9
		goto	Visualiza

Mayor_que_9	movf	Tecla,W
		addlw	0x37		;Ajuste ASCII de los caracteres de la A a la F
		
Visualiza	call	LCD_DATO        ;Visualiza sobre el LCD
		
;Es necesario esperar que se libere la tecla pulsada, de lo contrario la visualización
;de esta se repetiría varias veces. Se puede comprobar su efecto si se anulan las 5 
;instrucciones que vienen a continuación.

Tecla_pulsada	call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,F
		btfss	STATUS,Z	;Se ha liberado ??
		goto	Tecla_pulsada	;Todavía no

		decfsz	Contador_C,F	;Se han imprimido 16 caracteres ??
		goto	Loop		;No

		movlw	0xc0
		call	LCD_REG		;Si posiciona cursor en la siguiente línea
		decfsz	Contador_L,F	;Se han imprimido 2 líneas ??
		goto	Inicia_C	;No, se imprimen otros 16 caracteres
		goto	Borra_LCD	;Si, se inicia el LCD
			
		end			;Fin del programa fuente

