;
;					EJEMPLO 3.3
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Trainer PLUS
;
;El teclado y el LCD.
;
;Haciendo uso de las rutinas incluidas en los ficheros TECLADO.INC y LCD_CXX.INC, se trata 
;de leer el teclado y, visualizar sobre el módulo LCD el código hex. de la tecla pulsada.
;
;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				
Temporal_1	equ	0x13		;Variable temporal nº 1
Temporal_2	equ	0x14		;Variable temporal nº 2
				
		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

Tabla_Mensajes:	movwf	PCL		;Desplazamiento sobre la tabla

Mens_0		equ	$		;Mens_0 apunta al primer carácter
		dt	"Se ha pulsado: ",0x00

;*************************************************************************************
;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio está  indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00

Mensaje         movwf   Temporal_1      ;Salva posición de la tabla
Mensaje_1       movf    Temporal_1,W    ;Recupera posición de la tabla
                call    Tabla_Mensajes  ;Busca caracter de salida
                movwf   Temporal_2      ;Guarda el caracter
                movf    Temporal_2,F
                btfss   STATUS,Z        ;Mira si es el último
                goto    No_es_ultimo
                return
No_es_ultimo    call    LCD_DATO        ;Visualiza en el LCD
                incf    Temporal_1,F    ;Siguiente caracter
                goto    Mensaje_1
							
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'00001100'
		call	LCD_REG		;LCD en ON
		movlw	b'00000001'
		call	LCD_REG		;Borra LCD y HOME

;Salida del mensaje "Tecla pulsada:"
				
		movlw	Mens_0
		call	Mensaje		;Visualiza el mensaje
				
;Bucle principal

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
		movlw	0x8f
		call	LCD_REG		;Posiciona el cursor del LCD
		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
		call	LCD_DATO	;Visualizar sobre el LCD
		goto 	Loop												

Mayor_que_9	movf	Tecla,W
		addlw	0x37		;Ajuste ASCII de los caracteres de la A a la F
		call	LCD_DATO        ;Visualiza sobre el LCD
		goto	Loop

		end			;Fin del programa fuente

