;lcd_ej_4.asm Programa de ejemplo que envia varios mensajes a la pantalla LCD
; ---www.pictronic.com --- info@pictronic.com

	list		p=16F84		;modelo de PIC
	include		"P16F84.inc"		;libreria de definiciones para el 16F84
	__config	_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;palabra de configuración	

;declaramos los tres registros que utilizan las subrutinas de "lcd_db4.inc"

CONT0	equ	0x0C	
CONT1	equ	0x0D
LCD_TEMP	equ	0x0E

;variables para el programa principal

CONTA_0	equ	0x0F		;registro para la rutina de retardo
CONTA_1	equ	0x10		;   "           "     "     "      "      "
CONTA_2	equ	0x11		;   "           "     "     "      "      "
TEMP_1	equ	0x12		;registro temporal para el envio 
TEMP_2	equ	0x13		;     "            "           "    "      "

		org		0x00
		goto		INICIO
		org		0x05

		include		"lcd_db4.inc"		;incluye las subrutinas de control LCD

;Tablas de mensajes. Cada mensaje corresponde a una línea del LCD (16 carac. max.)

TABLA_MENS
		movwf		PCL		;dirige el programa hacia el inicio del mensaje

MENS_0	equ		$
		dt		"El sistema se ha",0x00
MENS_1	equ		$
		dt		"activado O.K.", 0x00		
MENS_2	equ		$
		dt		"El sistema acaba",0x00
MENS_3	equ		$
		dt		"de desactivarse", 0x00

;subrutina de retardo para mantener un tiempo cada mensaje

RETARDO	movlw		d'15'
	movwf		CONTA_2
RET	decfsz		CONTA_0,F
	goto		RET
	decfsz		CONTA_1,F
	goto		RET
	decfsz		CONTA_2,F
	goto		RET
	return	

			
;subrutina "universal" que envia la tabla del mensaje correspondiente 
;a la posición de inicio que esté en W

MENSAJE		movwf		TEMP_1
MENSAJE_1	movf		TEMP_1,W
		call		TABLA_MENS
		movwf		TEMP_2
		movf		TEMP_2,W
		btfss		STATUS,Z
		goto		SIGUE
		return
SIGUE		call		LCD_DATO
		incf		TEMP_1,F
		goto		MENSAJE_1	

;inicio del programa principal y del LCD

INICIO	call		LCD_UP		;configura TRISB para el LCD
	call		LCD_INI		;inicia el LCD
	movlw		0x0C		;comando apaga cursor
	call		LCD_REG

;Bucle que llama a la rutina de envio de mensajes cargando en W el valor de la posición de inicio de ;la tabla correspondiente. Después de mostrar cada mensaje llama a un retardo.

BUCLE	movlw		0x01
	call		LCD_REG
	movlw		MENS_0
	call		MENSAJE
	movlw		0xC0		;primera posicion segunda linea
	call		LCD_REG
	movlw		MENS_1
	call		MENSAJE
	call		RETARDO	
	movlw		0x01		;borra LCD y home
	call		LCD_REG		
	movlw		MENS_2
	call		MENSAJE
	movlw		0xC0		;primera posicion segunda linea
	call		LCD_REG
	movlw		MENS_3
	call		MENSAJE
	call		RETARDO
	goto		BUCLE

	end
