; ARCHIVO LCD2.ASM
; CODIGO FUENTE PARA EL MICROCONTROLADOR EDUPIC-16F84 

; ESCRIBE EN EL LCD EL MENSAJE "EDUPIC 16F84", "PUNTO FLOTANTE"
; VERSION PARA OSCILADOR CRISTAL 4 MHZ

; CPU configuration
; 	(It's a 16F84, XT OSCILADOR
; 	watchdog timer off, power-up timer on)
;PA1 se usa como señal de control RS comando=0, datos=1
;PA2 se usa como señal de control EN pulso de 50 ms.
;PB0..PB7 se usan como señales de datos.

	processor 16f84
	include	  <p16f84.inc>
	__config  _XT_OSC & _WDT_OFF & _PWRTE_ON


eight		equ	H'38'		;comando interfaz 8 bits, dos renglones
clear		equ	H'01'		;limpia display
home		equ	H'03'		;posiciona el cursor en inicio
cursor		equ	H'0F'		;parpadea cursor
renglon1	equ 	H'80'		;elige primer rengón
renglon2	equ 	H'C0'		;elige segundo renglón
J		equ	H'1F'		;localidad para subrutina de retardo
K		equ	H'1E'		;localidad para subrutina de retardo
valor		equ 	H'1D'		;localidad guardar valor offset en tabla


org		0
lcd:		movlw	H'00'	
		bsf	STATUS,RP0	;BANCO 1
        	movwf	TRISB		;bits de puerto B, salidas
		movwf	TRISA		;bits de puerto A, salidas
		bcf	STATUS,RP0	;BANCO 0	  
		call 	comand		;incializa LCD. envía 4 comandos
		movlw	D'15'		;16 caracteres
		movwf	valor
		call	primer		;escribe primer renglón
		movlw	D'15'
		movwf 	valor
		call 	segund		;escribe segundo renglón
loop:		goto	loop
primer:		movlw	renglon1
		call	puco		;envía comando de renglón 1	
malla1:		movfw	valor
		call 	tabla1		;regresa con dato de tabla en W.
		call 	puda		;escribe caracter en LCD
		decfsz	valor,f
		goto	malla1
		return
segund:		movlw	renglon2		
		call	puco		;envía comando de renglón 2
malla2:		movfw	valor
		call 	tabla2		;regresa con dato de tabla en W.
		call 	puda		;escribe caracter en LCD
		decfsz	valor,f
		goto	malla2
		return	
comand:		movlw	eight		;envía 4 comandos
		call 	puco
		movlw	clear
		call 	puco
		movlw	home
		call 	puco
		movlw	cursor
		call 	puco
		return
puco:		movwf	PORTB		;escribe comando en puertoB
		call 	delay		;50 milisegundos
		movlw	H'04'		;RS=0, EN=1
		movwf	PORTA
		call 	delay
		movlw	H'00'		;RS=0, EN=0
		movwf	PORTA
		call 	delay
		movlw	H'04'
		movwf	PORTA
		call 	delay
		return
puda:		movwf	PORTB		;escribe dato en puertoB
		call 	delay		;50 milisegundos
		movlw	H'06'		;RS=1, EN=1
		movwf	PORTA
		call 	delay
		movlw	H'02'		;RS=1, EN=0
		movwf	PORTA
		call 	delay
		movlw	H'06'
		movwf	PORTA
		call 	delay
		return
delay:		movlw	D'100'		;50 milisegundos
		movwf	K
mallaK:		movwf	J
mallaJ:		decfsz	J,f
		goto	mallaJ	
		decfsz	K,f
		goto	mallaK
		return
tabla1:		addwf	PCL,f
		retlw	' '
		retlw	' '
		retlw	'4'
		retlw	'8'
		retlw	'F'
		retlw	'6'
		retlw	'1'
		retlw	' '
		retlw	'C'
		retlw	'I'
		retlw	'P'
		retlw	'U'
		retlw	'D'
		retlw	'E'
		retlw	' '
		retlw	' '
tabla2:	addwf	PCL,f
		retlw	' '
		retlw	'E'
		retlw	'T'
		retlw	'N'
		retlw	'A'
		retlw	'T'
		retlw	'O'
		retlw	'L'
		retlw	'F'
		retlw	' '
		retlw	'O'
		retlw	'T'
		retlw	'N'
		retlw	'U'
		retlw	'P'
		retlw	' '
		end
		


