; ARCHIVO LCD 16 X 1V3F628.ASM
; CODIGO FUENTE PARA EL MICROCONTROLADOR EDUPIC-16F628 

; ESCRIBE EN EL LCD DE UN SOLO RENGLON EL MENSAJE "EDUPIC 16F628"
; 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 EN 16 POSICIONES.
; SE UTILIZAN 16 LOCALIDADES EN RAM
; DE LA DIRECCION 30H A LA 3FH COMO BUFFER DE ESCRITURA AL LCD.
; VERSION PARA OSCILADOR CRISTAL 4 MHZ

; CPU configuration
; 	(It's a 16F628, 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 16f628
	include	  <p16f628.inc>
	__config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF 


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'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
buffer		equ H'30'		;localidad de inicio del buffer de escritura
counter		equ H'24'		;localidad para cuenta descendente de 16 localidades
inibuff		equ H'30'
endbuff		equ H'40'


org		0
		movlw	H'07'
		movwf	CMCON
lcd		movlw	H'00'	
		bsf		STATUS,RP0	;BANCO 1
		clrf	VRCON
        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		
		call	filbuf		;llena el buffer en memoria
loop	call	primer		;escribe primer renglón
		call 	segund		;escribe segundo renglón
		call 	scroll		;realiza scroll de memoria
		call	delay3		
		goto	loop
scroll	movlw	buffer+D'15'
		movwf	FSR
		movlw	D'16'
		movwf	counter
malla8	movfw	INDF
		incf	FSR
		movwf	INDF
		decf	FSR
		decf	FSR
		decfsz	counter
		goto	malla8
		movfw	endbuff		;mueve el último al primero
		movwf	inibuff
		return
filbuf	movlw	buffer		;inicializa W con inicio de buffer
		movwf	FSR			;prepara direccionamiento indirecto
		movlw	D'16'		;prepara cuenta de contador
		movwf	counter
weer	movfw	counter
		call	tabla		;trae cada uno de los caracteres
		movwf	INDF		;colócalo en buffer
		incf	FSR
		decfsz	counter
		goto	weer
		return
primer	movlw	renglon1
		call	puco		;envía comando de renglón 1	
		movlw	D'8'
		movwf	valor
		movlw	buffer+D'15'
		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	buffer+D'7'
		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'		;50 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	addwf	PCL,f
		retlw	' '
		retlw	'E'
		retlw	'D
		retlw	'U'
		retlw	'P'
		retlw	'I'
		retlw	'C'
		retlw	' '
		retlw	'1'
		retlw	'6'
		retlw	'F'
		retlw	'6'
		retlw	'2'
		retlw	'8'
		retlw	'.'
		retlw	'.'
		retlw	'.'
		end
		


