; ARCHIVO LCD 16 X 1.ASM
; CODIGO FUENTE PARA EL MICROCONTROLADOR EDUPIC-16F84 

; ESCRIBE EN EL LCD DE UN SOLO RENGLON UN MENSAJE CON SCROLLING
; EL LCD TIENE 1 SOLO RENGLON DE 16 CARACTERES DIVIDIDOS EN
; DOS SECCIONES QUE SE MANEJAN COMO SI FUESEN DOS RENGLONES
; LOS PRIMEROS 8 CARACTERES FORMAN EL PRIMER RENGLON Y LOS 
; SIGUIENTES 8 FORMAN EL SEGUNDO RENGLON. 
; REALIZA EL SCROLLING CIRCULAR DEL MENSAJE DE 256 CARACTERES.
; LA TABLA DE CARACTERES SE ENCUENTRA EN MEMORIA FLASH, DE LA
; DIRECCION 100H A LA 1FFH
; SE UTILIZAN 16 LOCALIDADES EN RAM
; DE LA DIRECCION 10H A LA 1FH COMO BUFFER DE ESCRITURA AL LCD.
; 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'		;comando limpia display
home		equ	H'03'		;comando posiciona el cursor en inicio
cursor		equ	H'0F'		;comando parpadea cursor
renglon1	equ 	H'80'		;comnado elige primer rengón
renglon2	equ 	H'C0'		;comando elige segundo renglón
J		equ	H'21'		;localidad para subrutina de retardo
K		equ	H'22'		;localidad para subrutina de retardo
valor		equ 	H'23'		;localidad guardar valor offset en tabla
counter		equ 	H'24'		;localidad para cuenta descendente de 16 localidades
offset		equ 	H'25'		;localidad para offset de tabla


		org	0
		movlw	H'1'
		movwf	PCLATH		;preparar PCH en página 1, para manejo de tabla
		movlw	H'00'
		movwf	offset		;inicializa offset de tabla	
		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		
loop		call	filbuf		;llena el buffer en memoria
		call	primer		;escribe primer renglón
		call 	segund		;escribe segundo renglón
		call	delay3		
		goto	loop
filbuf		movlw	H'10'		;inicializa W 
		movwf	FSR			;prepara direccionamiento indirecto
		movlw	D'16'		;prepara cuenta de contador
		movwf	counter
weer		movfw	counter
		addwf	offset,w	;suma w + offset, resultado en w
		call	tabla		;trae cada uno de los caracteres
		movwf	INDF		;colócalo en buffer
		incf	FSR
		decfsz	counter
		goto	weer
		incf	offset
		return
primer		movlw	renglon1
		call	puco		;envía comando de renglón 1	
		movlw	D'8'
		movwf	valor
		movlw	H'1F'
		movwf	FSR
malla1		movfw	INDF
		call 	puda		;escribe caracter en LCD
		decf	FSR
		decfsz	valor,f
		goto	malla1
		return
segund		movlw	renglon2		
		call	puco		;envía comando de renglón 2
		movlw	D'8'
		movwf	valor
		movlw	H'17'
		movwf	FSR
malla2		movfw	INDF
		call 	puda		;escribe caracter en LCD
		decf	FSR
		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'10'		;50 milisegundos
		movwf	K
mallaK		movwf	J
mallaJ		decfsz	J,f
		goto	mallaJ	
		decfsz	K,f
		goto	mallaK
		return
delay2		movlw	D'250'		;100 milisegundos
		movwf	K
mallaM		movwf	J
mallaL		decfsz	J,f
		goto	mallaL	
		decfsz	K,f
		goto	mallaM
		return
delay3		call	delay2
		call	delay2
;		call	delay2
		return
tabla		movwf	PCL		;PCH =01, PCL =w
org		H'100'
		retlw	' '
		retlw	'E'
		retlw	'D'
		retlw	'U'
		retlw	'P'
		retlw	'I'
		retlw	'C'
		retlw	' '
		retlw	'1'
		retlw	'6'
		retlw	'F'
		retlw	'8'
		retlw	'4'
		retlw	'.'
		retlw	'.'
		retlw	'1'
		retlw	'K'
		retlw	' '
		retlw	'M'
		retlw	'E'
		retlw	'M'
		retlw	'O'
		retlw	'R'
		retlw	'I'
		retlw	'A'
		retlw	' '
		retlw	'F'
		retlw	'L'
		retlw	'A'
		retlw	'S'
		retlw	'H'
		retlw	'.'
		retlw	'.'
		retlw	'6'
		retlw	'4'
        	retlw	' ' 
		retlw	'B'
		retlw	'Y'
		retlw	'T'
		retlw	'E'
		retlw	'S'
		retlw	' '
		retlw	'D'
		retlw	'E'
		retlw	' '
		retlw	'R'
		retlw	'A'
		retlw	'M'
		retlw	'.'
		retlw	'.'
		retlw	'6'
		retlw	'8'
		retlw	' '
		retlw	'B'
		retlw	'Y'
		retlw	'T'
		retlw	'E'
		retlw	'S'
		retlw	' '
		retlw	'D'
		retlw	'E'
		retlw	' '
		retlw	'E'
		retlw	'E'
		retlw	'P'
		retlw	'R'
		retlw	'O'
		retlw	'M'
		retlw	'.'
		retlw	'.'
		retlw	'P'
		retlw	'U'
		retlw	'E'
		retlw	'R'
		retlw	'T'
		retlw	'O'
		retlw	'S'
		retlw	' '
		retlw	'P'
		retlw	'A'
		retlw	'R'
		retlw	'A'
		retlw	' '
		retlw	'L'
		retlw	'C'
		retlw	'D'
		retlw	' '
		retlw	'Y'
		retlw	' '
		retlw	'T'
		retlw	'E'
		retlw	'C'
		retlw	'L'
		retlw	'A'
		retlw	'D'
		retlw	'O'
		retlw	'.'
		retlw	'.'
		retlw	'R'
		retlw	'E'
		retlw	'L'
		retlw	'E'
		retlw	'V'
		retlw	'A'
		retlw	'D'
		retlw	'O'
		retlw	'R'
		retlw	' '
		retlw	'D'
		retlw	'E'
		retlw	' '
		retlw	'1'
		retlw	'2'
		retlw	'7'
		retlw	'v'
		retlw	'.'
		retlw	' '
		retlw	'1'
		retlw	' '
		retlw	'a'
		retlw	'm'
		retlw	'p'
		retlw	'.'
		retlw	'.'
		retlw	'8'
		retlw	' '
		retlw	'L'
		retlw	'E'
		retlw	'D'
		retlw	'S'
		retlw	'.'
		retlw	'.'
		retlw	'4'
		retlw	' '
		retlw	'M'
		retlw	'I'
		retlw	'C'
		retlw	'R'
		retlw	'O'
		retlw	'S'
		retlw	'W'
		retlw	'I'
		retlw	'T'
		retlw	'C'
		retlw	'H'
		retlw	'E'
		retlw	'S'
		retlw	'.'
		retlw	'.'
		retlw	'P'
		retlw	'R'
		retlw	'O'
		retlw	'G'
		retlw	'R'
		retlw	'A'
		retlw	'M'
		retlw	'A'
		retlw	'D'
		retlw	'O'
		retlw	'R'
		retlw	' '
		retlw	'D'
		retlw	'E'
		retlw	'L'
		retlw	' '
		retlw	'1'
		retlw	'6'
		retlw	'F'
		retlw	'8'
		retlw	'4'
		retlw	' '
		retlw	'I'
		retlw	'N'
		retlw	'T'
		retlw	'E'
		retlw	'G'
		retlw	'R'
		retlw	'A'
		retlw	'D'
		retlw	'O'
		retlw	'.'
		retlw	'.'
		retlw	'I'
		retlw	'N'
		retlw	'C'
		retlw	'L'
		retlw	'U'
		retlw	'Y'
		retlw	'E'
		retlw	' '
		retlw	'S'
		retlw	'O'
		retlw	'F'
		retlw	'T'
		retlw	'W'
		retlw	'A'
		retlw	'R'
		retlw	'E'
		retlw	' '
		retlw	'M'
		retlw	'P'
		retlw	'L'
		retlw	'A'
		retlw	'B'
		retlw	' '
		retlw	'C'
		retlw	'O'
		retlw	'N'
		retlw	' '
		retlw	'E'
		retlw	'N'
		retlw	'S'
		retlw	'A'
		retlw	'M'
		retlw	'B'
		retlw	'L'
		retlw	'A'
		retlw	'D'
		retlw	'O'
		retlw	'R'
		retlw	','
		retlw	' '
		retlw	'S'
		retlw	'I'
		retlw	'M'
		retlw	'U'
		retlw	'L'
		retlw	'A'
		retlw	'D'
		retlw	'O'
		retlw	'R'
		retlw	' '
		retlw	'Y'
		retlw	' '
		retlw	'P'
		retlw	'R'
		retlw	'O'
		retlw	'G'
		retlw	'R'
		retlw	'A'
		retlw	'M'
		retlw	'A'
		retlw	'D'
		retlw	'O'
		retlw	'R'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		end


