;
;	ESCRIBE UN MENSAJE EN UN MODULO LCD DE 2 LINEAS
;	LA INTERFACE ES A 8 BITS EN EL PUERTO B DEL MICROCONTROLADOR
;	CALCULOS DE RETARDO CON OSCILADOR DE 4 MHZ
;	POR: DANILO GARCIA
;
	list p=16f873
#include <p16f873.inc>
;
;PALABRA DE CONFIGURACIÓN:
;
	__CONFIG _BODEN_ON&_CP_OFF&_WRT_ENABLE_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_LVP_OFF
;
;****************************************************************************
; DEFINICIÓN DE MACROS
BANK0	MACRO
	BCF	STATUS,RP0
	BCF	STATUS,RP1
	ENDM
BANK1	MACRO
	BSF	STATUS,RP0
	BCF	STATUS,RP1
	ENDM
;****************************************************************************
;DEFINICIONES RELATIVAS A LA APLICACIÓN

#DEFINE	LCD	PORTB

;DEFINICION DE BITS:
#DEFINE	E	PORTC,5		;DEL LCD
#DEFINE	RS	PORTC,4		;DEL LCD
;===========================================================================
;DEFINICION DE VARIABLES
;
		CBLOCK 0X20
	TEMP		;VAR. AUXILIAR
	CHAR		;ALMACENA CARACTER QUE SE VA A ENVIAR AL LCD
	milis		;variable que multiplica un DELAY de 1mS
	VDEL
		ENDC
;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

	ORG	0
;Vector de Reset del Microcontrolador
	MOVLW	.10
	MOVWF	milis
	CALL	DELAY		;retardo inicial de 10 mS
	GOTO	INICIO
;**************************************************************
;* SEND_CMD - Envia el comando contenido en el registro W     *
;**************************************************************
SEND_CMD
	BCF     RS		; Set LCD in command mode
	MOVWF   CHAR		; Command to be sent is in W
	MOVLW	5
	GOTO	COMM_LCD
;*****************************************************************
;* SEND_CHAR - Envía el caracter contenido en el reg. W al LCD   *
;*****************************************************************
SEND_CHAR
	BSF     RS    		; Set LCD in data mode
	MOVWF   CHAR        	; Character to be sent is in W
	MOVLW	1
COMM_LCD
	MOVWF	milis
	CALL	DELAY
	MOVF    CHAR,W          
	MOVWF   LCD		; Send data to LCD
	BSF     E 		; toggle E for LCD
	BCF     E
	RETURN
;*********************************************************************
;** Rutina de 1 ms multiplicado por milis hasta un máximo de 255 ms **
;*********************************************************************
DELAY		movlw	0xF9
		movwf	VDEL
Delay1		nop
		decfsz	VDEL,F
		goto	Delay1
		decfsz	milis,F
		goto	DELAY
		return
;*********************************************************************
CONFIGLCD	;CONFIGURACIÓN DEL DISPLAY
;*********************************************************************
	BANK1
	CLRF	LCD		;PROGRAMACIÓN SENTIDO DEL PUERTO
	BCF	RS		;PIN RS COMO SALIDA
	BCF	E		;PIN E COMO SALIDA
	BANK0
	MOVLW	0x38  		;function set
	CALL   	SEND_CMD
	MOVLW	0x0C		;display on
	CALL   	SEND_CMD
	MOVLW	0x06  		;entry mode set
	CALL   	SEND_CMD
CLSDISP2
	MOVLW	0x01    	;clear Display
	CALL	SEND_CMD
	RETURN
;*********************************************************************
MENSINI
	MOVLW	86H		;UBICACION DEL CURSOR
	CALL	SEND_CMD
	MOVLW	'M'
	CALL	SEND_CHAR
	MOVLW	'E'
	CALL	SEND_CHAR
	MOVLW	'N'
	CALL	SEND_CHAR
	MOVLW	'S'
	CALL	SEND_CHAR
	MOVLW	'A'
	CALL	SEND_CHAR
	MOVLW	'J'
	CALL	SEND_CHAR
	MOVLW	'E'
	CALL	SEND_CHAR
	MOVLW	' '
	CALL	SEND_CHAR
	MOVLW	'D'
	CALL	SEND_CHAR
	MOVLW	'E'
	CALL	SEND_CHAR
	MOVLW	' '
	CALL	SEND_CHAR
	MOVLW	'2'
	CALL	SEND_CHAR
; SEGUNDA LINEA
	MOVLW	0C6H		;UBICACION DEL CURSOR
	CALL	SEND_CMD
	MOVLW	'L'
	CALL	SEND_CHAR
	MOVLW	'I'
	CALL	SEND_CHAR
	MOVLW	'N'
	CALL	SEND_CHAR
	MOVLW	'E'
	CALL	SEND_CHAR
	MOVLW	'A'
	CALL	SEND_CHAR
	MOVLW	'S'
	CALL	SEND_CHAR
	MOVLW	' '
	CALL	SEND_CHAR
	MOVLW	'@'
	CALL	SEND_CHAR
	MOVLW	' '
	CALL	SEND_CHAR
	MOVLW	'L'
	CALL	SEND_CHAR
	MOVLW	'C'
	CALL	SEND_CHAR
	MOVLW	'D'
	CALL	SEND_CHAR
	RETURN
;*********************************************************************
INICIO		;PROGRAMA PRINCIPAL
	CALL	CONFIGLCD
	CALL	MENSINI
	SLEEP
	NOP
;*********************************************************************
	end
