

;*********************** Registros de control del micro ****************

status		equ		03h
porta		equ		05h
portb		equ		06h
portc		equ		07h
portd		equ		08h
porte		equ		09h

pir1		equ		0ch
rcsta		equ		18h
rcreg		equ		1ah

trisa		equ		85h
trisb		equ		86h
trisc		equ		87h
trisd		equ		88h
trise		equ		89h
txsta		equ		98h
spbrg		equ		99h

;******************** Registro de usuario **********


loops		equ		30h
loops2		equ		31h
mini		equ		32h
mini2		equ		33h	
arriba		equ		35h
abajo		equ		36h
posicion	equ		37h
limpia		equ		40h
vector		equ		41h	
sitio		equ		45h
sitio2		equ		46h
defini		equ		47h
bandera		equ		48h



list p = 16F877

;********************* Inica el programa ********************

		org	00
		goto	inicio

;********************* Rutina de envio de datos ****************

recibe		movf	rcreg,0
pregunta	btfss	pir1,5
		goto	pregunta
		addlw	30h		; ASCII
		movf	rcreg,0
		incf	posicion,1
		return

;********************* Rutina de control de la LCD *********************

lcd		bcf	portc,0		; Inicializar transmisin
		goto	vaya

lcd_esc		bsf	portc,0
vaya		bsf	portc,1		; activo el modo escritura
		movwf	portb		; paso al puerto b
		call	retardo		; pequeo retardo
		bcf	portc,1		; para inicializar la lcd
		call	retardo
		return			; retorna

;**************************** Tabla de posicion de lcd ********************

tabla		movwf	sitio
		call	recibe		; recibo el siguiente dato

		movf	rcreg,0		; guardo el dato en w
		xorlw	"0"		; comparo con 1
		btfss	status,2	; pregunto por el numero
		goto	unouno
		movlw	d'0'		; cargo con uno	
		goto	final_posicion	
	
unouno		movf	rcreg,0		; guardo el dato en w
		xorlw	"1"		; comparo con 1
		btfss	status,2	; pregunto por el numero
		goto	dos21
		movlw	d'1'		; cargo con uno	
		goto	final_posicion		

dos21		movf	rcreg,0		; guardo el dato en w
		xorlw	"2"		; comparo con 2
		btfss	status,2	; pregunto por el numero
		goto	tres3
		movlw	d'2'		; cargo con uno	
		goto	final_posicion	

tres3		movf	rcreg,0		; guardo el dato en w
		xorlw	"3"		; comparo con 3
		btfss	status,2	; pregunto por el numero
		goto	cuatro
		movlw	d'3'		; cargo con uno	
		goto	final_posicion	

cuatro		movf	rcreg,0		; guardo el dato en w
		xorlw	"4"		; comparo con 4
		btfss	status,2	; pregunto por el numero
		goto	cinco
		movlw	d'4'		; cargo con uno	
		goto	final_posicion	

cinco		movf	rcreg,0		; guardo el dato en w
		xorlw	"5"		; comparo con 5
		btfss	status,2	; pregunto por el numero
		goto	seis
		movlw	d'5'		; cargo con uno	
		goto	final_posicion	

seis		movf	rcreg,0		; guardo el dato en w
		xorlw	"6"		; comparo con 6
		btfss	status,2	; pregunto por el numero
		goto	siete
		movlw	d'6'		; cargo con uno	
		goto	final_posicion	

siete		movf	rcreg,0		; guardo el dato en w
		xorlw	"7"		; comparo con 7
		btfss	status,2	; pregunto por el numero
		goto	ocho
		movlw	d'7'		; cargo con uno	
		goto	final_posicion	

ocho		movf	rcreg,0		; guardo el dato en w
		xorlw	"8"		; comparo con 8
		btfss	status,2	; pregunto por el numero
		goto	nueve
		movlw	d'8'		; cargo con uno	
		goto	final_posicion	

nueve		movf	rcreg,0		; guardo el dato en w
		xorlw	"9"		; comparo con 9
		btfss	status,2	; pregunto por el numero
		return
		movlw	d'9'		; cargo con uno	
		goto	final_posicion

final_posicion	movwf	sitio2	
		movf	sitio,0		; paso a w sitio para sumar los valores
		addwf	sitio2,0	; sumo los dos valores
		movwf	defini		; los paso a define
		movlw	d'32'		; cargo con 31 para probar si es mayor a 31
		subwf	defini,0	; hago la resta
		btfsc	status,0	; pregunto por el carry
		return
		incf	bandera,1
		movlw	d'16'		; cargo con 15
		subwf	defini,0	; miro a ver en que posicion est{a arriba o abajo
		btfsc	status,0	; pregunto por el carry
		goto	posicion2
		movlw	b'10000000'
		movwf	arriba
		movf	defini,0	; paso defini a w
		addwf	arriba,1	; sumo a arriba la posicin para bicar en la lcd
		movf	arriba,0
		call	lcd		; mando la instrucin a la lcd										
		return	

posicion2	movlw	b'11000000'	; cargo a w con el valor 
		movwf	arriba		; de la segunda fila
		movlw	d'16'
		subwf	defini,1	; resto 16
		movf	defini,0	; paso a w
		addwf	arriba,1	; paso a arriba
		movf	arriba,0	; paso a w
		call	lcd		; mando el dato a la lcd
		goto	fila2
		return


;******************** Rutina de inicializacin de la lcd *****************

retarms		movlw	d'255'
		movwf	loops

top2		movlw	d'100'		; el numero de milisegundo est
		movwf	loops2		; cargado en el registro loops
top		nop
		nop
		nop
		nop
		nop
		nop
		decfsz	loops2,1	; pregunta si termino un 1ms
		goto	top
		decfsz	loops,1		; pregunta si termino el retardo
		goto	top2
		return


;*********************** Rutina de us para inicializar la lcd ******************


retardo		movlw	d'5'
		movwf	mini
repite		decfsz	mini,1
		goto	repite
		return	


inicio 		bcf	status,6
		bsf	status,5	; banco 1
		movlw	b'11111111'
		movwf	porta
		movwf	portd
		movwf	porte		; configuro los puerto A,D,E como salida
		movlw	b'11111100'
		movwf	portc
		movlw	b'00000000'
		movwf	portb		; Puerto B como salida digtales
		movlw	b'00100100'
		movwf	txsta		; configuro la transmisin 
		movlw	d'103'
		movwf	spbrg		; configuro a 4MHz y 2400 bps

		bcf	status,5	; banco 0
		movlw	b'11011000'
		movwf	rcsta		; Habilitar lqa recepcin y el mdulo serial

		clrf	portb		; limpio el puerto

		call	retarms

		movlw	b'00111000'	; configuro lcd a 8 bloques
		call	lcd
		movlw	b'00001110'	; activo el mdulo lcd
		call	lcd
		movlw	b'00000110'
		call	lcd
		
		

primer_fila	movlw	b'10000000'	; Ubica el puntero en la primera posicin
		call	lcd
		clrf	posicion
		movlw	b'10000000'
		movwf	arriba

vuelve		clrf	vector

		call 	recibe		; Recibe el dato en registro RECREG
		


enter		movf	rcreg,0		; paso el dato de transmisin a w
		xorlw	b'00001101'	; comparo el dato
		btfss	status,2
		goto	titilar		; si no esta va a cursor
		goto	segunda_fila	

titilar		movf	rcreg,0		; CLRT + F
		xorlw	b'00000110'	; comparo
		btfss	status,2
		goto	mostrar_cursor
		movlw	b'00111000'	; configuro lcd a 8 bloques
		call	lcd
		movlw	b'00001101'	; mando el titileo a la LCD
		call	lcd
		clrf	posicion
		goto	vuelve		; vuelve y recibe

mostrar_cursor	movf	rcreg,0		; CRLT +E
		xorlw	b'00000101'	; comparo el cursor
		btfss	status,2	; pregunta si son iguales
		goto	ocultar		; si no son iguales va ocultar cursor
		movlw	b'00001110'
		call	lcd		; mando el dato correspondiente a la LCD
		clrf	posicion
		goto 	vuelve		; vuelve al recibo de datos

ocultar		movf	rcreg,0		; CLTR + D
		xorlw	b'00000100'	; compara con el valor de CRTR + D en ASCII 
		btfss	status,2	; pregunta
		goto	volver_inicio	; si no es verdad vuelve a recibir
		movlw	b'00001100'	; si es verdad
		call	lcd		; oculta el cursor
		clrf	posicion
		goto	vuelve		; vuelve a recibir

volver_inicio	movf	rcreg,0		; CTRL + E
		xorlw	b'00000001'	; compara con el valor CTRL + D en ASCII
		btfss	status,2	; pregunta
		goto	borrar_pantalla	; si no vuelve a recibir
		movlw	b'10000000'	; si se bica en la promera posicin de la LCD
		call	lcd		; manda el dato
		clrf	posicion
		clrf	arriba
		goto	primer_fila

borrar_pantalla	movf	rcreg,0		; CTRL + L
		xorlw	b'00001100'	; compara con el valor CTRL + L en ASCII
		btfss	status,2	; pregunta
		goto	backspace	; Si no va a escribir va a escribir 
sigue		movlw	" "
		call	lcd_esc
		incf	vector,1
		movlw	50h
		xorwf	vector,0
		btfss	status,2
		goto	sigue
		movlw	b'00000001'	; Ubica el puntero en la primera posicin
		call	lcd
		clrf	posicion	; limpio las variable
		clrf	arriba		; limpio las variables
		goto	primer_fila

backspace	
		movf	rcreg,0		; CTRL + H  BACKSPACE
		xorlw	b'00001000'	; comparo con el que recibi
		btfss	status,2	; pregunta
		goto	posicion_lcd		
		decf	arriba,1
		movf	arriba,0
		incf	arriba,1
		call	lcd
		movlw	" "
		call	lcd_esc		
		decf	arriba,1
		movf	arriba,0
		call	lcd

		
		clrf	posicion
		movf	arriba,0
		xorlw	b'01111111'
		btfss	status,2
		goto	vuelve
		movlw	b'10000000'
		movwf	arriba
		call	lcd
		clrf	posicion
		goto	vuelve

posicion_lcd	movf	rcreg,0		; CTRL + P
		xorlw	b'00010000'	; comparo
		btfss	status,2	; pregunto por la operacin lgica
		goto	escribe		; si no va al siguiente paso
		call	recibe		; si es verdad espera prximo el carcter

		movf	rcreg,0		; guardo el dato en w
		xorlw	"0"		; comparo con 1
		btfss	status,2	; pregunto por el numero
		goto	uno
		movlw	d'0'		; cargo con uno	
		call	tabla
		goto	vuelve
	
uno		movf	rcreg,0		; paso a w el carcter transmitido
		xorlw	"1"		; compara con uno
		btfss	status,2	; pregunta
		goto	dos
		movlw	d'10'
		call	tabla
		goto	vuelve
		
dos		movf	rcreg,0		; paso a w el carcter transmitido
		xorlw	"2"		; compara con uno
		btfss	status,2	; pregunta
		goto	tres
		movlw	d'20'
		call	tabla
		goto	vuelve
		
tres		movf	rcreg,0		; paso a w el carcter transmitido
		xorlw	"3"		; compara con uno
		btfss	status,2	; pregunta
		goto	sepaso
		movlw	d'30'
		call	tabla
		goto	vuelve
		

escribe		movf	rcreg,0		; Paso el respectivo caracter a W
		call	lcd_esc		; si no es ningun valor
		incf	posicion,1
		decf	posicion,1
		movf	posicion,0
		addwf	arriba,1
		clrf	posicion
		goto	vuelve		; escribe el valor en la LCD

sepaso		call	recibe
		clrf	posicion
		goto	vuelve


segunda_fila	clrf	posicion	; limpio la posicion
		movlw	b'11000000'	; me bico en la segunda fila
		call	lcd		; configuro la LCD
		movlw	b'11000000'
		movwf	arriba 
		
fila2		clrf	vector
		
		call	recibe		; pregunto si hay dato

enter2		movf	rcreg,0		; paso el dato de transmisin a w
		xorlw	b'00001101'	; comparo el dato
		btfss	status,2
		goto	titilar2	; si no esta va a cursor
		goto	primer_fila	; si presionan enter va a la primera fila	

titilar2	movf	rcreg,0		; CLRT + F
		xorlw	b'00000110'	; comparo
		btfss	status,2
		goto	mostrar_cursor2
		movlw	b'00111000'	; configuro lcd a 8 bloques
		call	lcd
		movlw	b'00001101'	; mando el titileo a la LCD
		call	lcd
		clrf	posicion
		goto	fila2		; vuelve y recibe

mostrar_cursor2	movf	rcreg,0		; CRLT +E
		xorlw	b'00000101'	; comparo el cursor
		btfss	status,2	; pregunta si son iguales
		goto	ocultar2	; si no son iguales va ocultar cursor
		movlw	b'00001110'
		call	lcd		; mando el dato correspondiente a la LCD
		clrf	posicion
		goto	fila2		; vuelve al recibo de datos

ocultar2	movf	rcreg,0		; CLTR + D
		xorlw	b'00000100'	; compara con el valor de CRTR + D en ASCII 
		btfss	status,2	; pregunta
		goto	volver_inicio2	; si no es verdad vuelve a recibir
		movlw	b'00001100'	; si es verdad
		call	lcd		; oculta el cursor
		clrf	posicion
		goto	fila2		; vuelve a recibir

volver_inicio2	movf	rcreg,0		; CTRL + E
		xorlw	b'00000001'	; compara con el valor CTRL + D en ASCII
		btfss	status,2	; pregunta
		goto	borrar_pantal	; si no vuelve a recibir
		clrf	arriba
		clrf	posicion
		goto	primer_fila	; regreso a la primer fila

borrar_pantal	movf	rcreg,0		; CTRL + L
		xorlw	b'00001100'	; compara con el valor CTRL + L en ASCII
		btfss	status,2	; pregunta
		goto	backspace_fila2	; Si no va a escribir va a escribir 
sigue2		movlw	" "
		call	lcd_esc
		incf	vector,1
		movlw	50h
		xorwf	vector,0
		btfss	status,2
		goto	sigue2
		movlw	b'00000001'	; Ubica el puntero en la primera posicin
		call	lcd
		clrf	posicion	; limpio las variable
		clrf	arriba		; limpio las variables
		goto	primer_fila	

backspace_fila2	
		movf	rcreg,0		; CTRL + H  BACKSPACE
		xorlw	b'00001000'	; comparo con el que recibi
		btfss	status,2	; pregunta
		goto	posicion_lcd2		
		decf	arriba,1
		movf	arriba,0
		incf	arriba,1
		call	lcd
		movlw	" "
		call	lcd_esc		
		decf	arriba,1
		movf	arriba,0
		call	lcd

		
		clrf	posicion
		movf	arriba,0
		xorlw	b'10111111'
		btfss	status,2
		goto	fila2
		movlw	b'11000000'
		movwf	arriba
		call	lcd
		clrf	posicion
		goto	fila2

posicion_lcd2	movf	rcreg,0		; CTRL + P
		xorlw	b'00010000'	; comparo
		btfss	status,2	; pregunto por la operacin lgica
		goto	escr_segunda	; si no va al siguiente paso
		call	recibe		; si es verdad espera prximo el carcter

		movf	rcreg,0		; guardo el dato en w
		xorlw	"0"		; comparo con 1
		btfss	status,2	; pregunto por el numero
		goto	uno2
		movlw	d'0'		; cargo con uno	
		call	tabla
		goto	fila2
	
uno2		movf	rcreg,0		; paso a w el carcter transmitido
		xorlw	"1"		; compara con uno
		btfss	status,2	; pregunta
		goto	dos2
		movlw	d'10'
		call	tabla
		goto	fila2
		
dos2		movf	rcreg,0		; paso a w el carcter transmitido
		xorlw	"2"		; compara con uno
		btfss	status,2	; pregunta
		goto	tres2
		movlw	d'20'
		call	tabla
		goto	vuelve
		
tres2		movf	rcreg,0		; paso a w el carcter transmitido
		xorlw	"3"		; compara con uno
		btfss	status,2	; pregunta
		goto	sepaso2
		movlw	d'30'
		call	tabla
		goto	fila2

escr_segunda	movf	rcreg,0		; paso el dato transmitido a W
		call	lcd_esc		; mando el dato a la LCD
		incf	posicion,1
		decf	posicion,1
		movf	posicion,0
		addwf	arriba,1
		clrf	posicion
		goto	fila2		; regresa a la fila 2

sepaso2		call	recibe
		clrf	posicion
		goto	fila2
		end
		






















		
		








