;
;					EJEMPLO 2.22
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación y/o MicroPIC Trainer
;
;El manejo de la pantalla LCD, más mensajes todavía.
;
;Este ejemplo pretende introducirnos en el manejo de la pantalla LCD, para la visualización
;de diferentes mensajes.
;
;Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de señales de control hacia 
;el LCD. Al estar conectadas con sendos interruptores en la MicroPIC Trainer, estos deben
;estar a nivel lógico "1" permanentemente.

		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos
                    		
Lcd_var		equ	0x0c		;Variables (2) de las rutinas de manejo del LCD
Delay_Cont	equ	0x0e		;Variable para la temporización
Temporal_1	equ	0x0f		;Variable temporal
Temporal_2	equ	0x10		;Variable temporal

		org	0x00		;Vector de Reset
		goto	Inicio
		org	0x05		;Salva vector de interrupción

		include	"LCD_Cxx.inc"	;Incluye las rutinas de manejo del LCD

;******************************************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter a visualizar

Tabla_Mensajes	movwf	PCL		;Calcula el desplazamiento sobre la tabla

;***********************************************************************************
;La directiva dt genera tantas intsrucciones retlw como bytes o caracteres contenga

Mens_0		equ	$		;Mens_0 apunta al primer carácter del mensaje 0
		dt	"Microsystems",0x00

Mens_1		equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"Engineering",0x00

Mens_2		equ	$		;Mens_2 apunta al primer carácter del mensaje 2
		dt	"Gral. Concha 39",0x00

Mens_3		equ	$		;Mens_3 apunta al primer carácter del mensaje 3
		dt	"48012 Bilbao",0x00

;*********************************************************************************
;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	

;*************************************************************************************
;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	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00011000'		
		movwf	TRISA		;RA0-RA2 salidas, RA3-RA4 entradas				
		movlw	b'00000111'
		movwf	OPTION_REG	;Preescaler de 256 para el TMR0
		bcf	STATUS,RP0	;Selecciona banco 0	
		
		call	LCD_INI		;Secuencia de inicio del LCD
		movlw	b'00001100'
		call	LCD_REG		;Envía instrucción: LCD ON, Cursor OFF y blink OFF

Loop		movlw	b'00000001'
		call	LCD_REG		;Borra LCD y Home (colocar cursor en 1ª posición)
		movlw	Mens_0
		call	Mensaje		;Visualiza el mensaje 0
		movlw	b'11000101'
		call	LCD_REG		;Coloca cursor en 2ª fila del LCD
		movlw	Mens_1
		call	Mensaje		;Visualiza mensaje 1
		movlw	.40
		movwf	Delay_Cont
		call	Delay_var	;Temporiza 4 segundos
		movlw	b'00000001'
		call	LCD_REG		;Borra LCD y Home (colocar cursor en 1ª posición)
		movlw	Mens_2
		call	Mensaje		;Visualiza el mensaje 2
		movlw	b'11000010'
		call	LCD_REG		;Coloca cursor en 2ª fila del LCD
		movlw	Mens_3
		call	Mensaje		;Visualiza el mensaje 3
		movlw	.40
		movwf	Delay_Cont
		call	Delay_var	;Temporiza 4 segundos
		goto	Loop

		end			;Fin del programa fuente

