;======= PEDRO =============================================

;-------- INCUBADORA UTILIZANDO EL PIC 16F877A DE 20MHz ----------------

	LIST P=16F877A
	INCLUDE <P16F877A.INC>

;-------- RENOMBRAMIENTO DE REGISTROS ----------------------------------

VALORCONVERSION	EQU	0X29

CONTA01 EQU 0X30
CONTA02 EQU 0X31
CONTA03 EQU 0X32

PROGRAMACION	equ	0x33		;Comando para la LCD
CARACTER	equ	0x34		;Caracter para la LCD	

TINCUBACION	EQU	0x35
TMAX		EQU	0x36
TMIN		EQU	0x37

HINCUBACION	EQU	0x38
H3DIAS		EQU	0x39
HNACIDOS	EQU	0x40
HUMEDAD		EQU	0x41

sincbit		EQU	0x43		;contador envio de bits
Wdata		EQU	0x44		;variable de intercambio de datos
CMData		EQU	0x45		;variable de comandos
RXmsb		EQU	0x46		;registros de recepcion de datos
RXlsb		EQU	0x47
RH		EQU	0x48		;Porcentaje de Humedad Relativa

ACCaLO  	equ     0x49		;Variables de calculos
ACCaHI  	equ     0x50
ACCbLO  	equ     0x51
ACCbHI  	equ     0x52
ACCcLO  	equ     0x53
ACCcHI  	equ     0x54
ACCdLO  	equ     0x55
ACCdHI  	equ     0x56
temp    	equ     0x57
Flags		equ	0x58

uni		EQU	0x59
dec  		EQU	0x60
cen		EQU	0x61



;------------ Directivas para la LCD -----------------------------------
		#define	ELCD	PORTD,7	; E de LCD  LO DEFINE EN RD7
		#define	WRRS	PORTD,6	; RS de LCD LO DEFINE EN RD6


;-------------- DIRECTRICES GENERALES ----------------------------------

	ORG 	0X000
	GOTO 	INICIO
	ORG	0X004


;================ COMIENZO DEL PROGRAMA  ===============================

INICIO 		BCF 	STATUS,5	;BANCO 0
		BCF	STATUS,6
		BCF	INTCON,7	;PROHIBE LAS INTERRUPCIONES

	;configuración de las puertas
		BSF 	STATUS,5	;BANCO 1
		MOVLW	b'00101001'	;PONE TODAS LAS PUERTA A COMO ENTRADA
		MOVWF	TRISA
		MOVLW	b'00000000'	;PONE TODAS LAS PUERTA B COMO SALIDA
		MOVWF	TRISB
		MOVLW	b'00001000'	;PONE TODAS LAS PUERTA C COMO SALIDA
		MOVWF	TRISC
		MOVLW	b'00000111'	;PONE TODAS LAS PUERTA E COMO SALIDA
		MOVWF	TRISE
		MOVLW	b'00001111'	;PONE TODAS LAS PUERTA D COMO SALIDA
		MOVWF	TRISD

		BCF	STATUS,5	;BANCO 0
		CLRF	PORTA
		CLRF	PORTB
		CLRF	PORTC
		CLRF	PORTD

 		clrf 	uni
		clrf 	dec  
 		clrf 	cen


	;CONFIGURACIÓN DE LA LCD
		CALL	RETA980		;RETARDO PARA QUE SE ESTABILICE LA PANTALLA
		CALL	RETA980
		CALL	RETA980
		CALL	RETA980

		MOVLW	b'00111000'	;BUS 8 BITS y  ACTIVO 2 LINEAS
		CALL	COMANDO		
				
		MOVLW	b'00001111'	;ENCENDEMOS LA PANTALLA, EL CURSOR Y EL INTERMITENTE
		CALL	COMANDO		
					
		MOVLW	b'00000001'	;BORRA LA PANTALLA
		CALL	COMANDO	
	
		MOVLW	b'00000001'	;COLOCAMOS CURSOR EN LA LCD EN LA DIRECCIÓN 00, ESCRIBIRA A PARTIR DE AHI
		CALL	COMANDO

		BCF	STATUS,5	;BANCO 0
		
	
	;CONFIGURACION DE LA CONVERSIÓN A/D  Nota(hay que indicar el canal con el adcon0 antes de llamar subrutina)
		
		BSF	STATUS,5	;BANCO 1
		MOVLW	b'00001110'
		MOVWF	ADCON1		;CONFIGURACION DE LA CONVERSION A/D PARA 2 PUERTAS D Y 2 ANALOGICA			

		BCF	STATUS,5	;BANCO 0	
		MOVLW	b'10000000'	;FRECUENCIA OSC/2, DESACT LA CONVERSION, MODULO A/D ACTIVADO	
		MOVWF	ADCON0
		
		BSF	STATUS,5	;BANCO 1
		CLRF	ADRESL		;ELIMINAR POSIBLES VALORES
		CLRF	ADRESH

	;CONFIGURACION SENSOR SHT11
		bsf	STATUS,5
		bSf	PORTA,2		; SHT11_CLK es salida
		bsf	PORTA,1		; SHT11_DATA es entrada
		bcf	STATUS,5

		CALL	sht11_Reset	;Resetea el sensor sht11
		CALL	sht11_Set14bits

	;CONFIGURACIÓN DE LOS PARAMETROS POR DEFECTO
		BCF 	STATUS,5	;BANCO 0
		MOVLW	b'00100101'	;PONE LA TEMPERATURA A 37,5ºC
		MOVWF	TINCUBACION

		MOVLW	b'00110010'	;PONE LA HUMEDAD DE INCUBACION A 50%
		MOVWF	HINCUBACION
		MOVWF	HUMEDAD
		MOVLW	b'01001011'	;PONE LA HUMEDAD DE 3DIAS A 75%
		MOVWF	H3DIAS
		MOVLW	b'00101000'	;PONE LA HUMEDAD DE NACIDOS A 40%
		MOVWF	HNACIDOS
		CLRF	RH


	;APAGAMOS LCD
		MOVLW	b'00001100'	;APAGAR LA PANTALLA
		CALL	COMANDO	


;================= COMIENZO DEL PROGRAMA UTIL ========================================
		
;------------------ BUCLE CONTROL DE ESPERA ---------------------------------------
PRINCIPAL	MOVLW	b'00001100'	;APAGAR LA PANTALLA
		CALL	COMANDO	
		;goto	MENUPRINCIPAL

	PRIN1	BCF	STATUS,0
		BTFSC	PORTA,3		;COMPRUEBA SI EL INTERRUCTOR DE LA LCD ESTA APAGADO
		GOTO	MENUPRINCIPAL

		BCF	STATUS,0
		CALL	sht11_Humedad	;TOMA LA HUMEDAD Y LA COMPARA PARA ACTUAR EN CONSECUENCIA
		MOVLW	HUMEDAD
		SUBLW	D'5'
		SUBLW	RH
		BTFSC	STATUS,0
		GOTO	ONHUMEDAD
		MOVLW	RH
		SUBLW	D'5'
		SUBLW	HUMEDAD
		BTFSC	STATUS,0
		GOTO	OFFHUMEDAD
		

		GOTO	PRIN1



;-------------------- MENUS DE LA PANTALLA --------------------------------------------

MENUPRINCIPAL		BCF	STATUS,0
			MOVF	HUMEDAD,W	;CUBIERTE EL N BINARIO DE LA HUMEDAD EN ascii
			CALL	LCDCONVERSOR

			MOVLW	b'00001111'	;ENCENDEMOS LA PANTALLA, EL CURSOR Y EL INTERMITENTE
			CALL	COMANDO
			CALL	TEXTOPRINCIPAL
			
	MP1		BCF	STATUS,0
			BTFSS	PORTA,3		;COMPRUEBA SI EL INTERRUCTOR DE LA LCD ESTA APAGADO
			GOTO	PRINCIPAL

			CALL	sht11_Humedad	;TOMA LA HUMEDAD Y LA COMPARA PARA ACTUAR EN CONSECUENCIA
			MOVF	HUMEDAD,W
			SUBLW	D'5'
			SUBLW	RH
			BTFSC	STATUS,0
			GOTO	ONHUMEDAD
			MOVLW	RH
			SUBLW	D'5'
			SUBLW	HUMEDAD
			BTFSC	STATUS,0
			GOTO	OFFHUMEDAD

			MOVF	RH,W		;ESCRIBIMOS EN LA LCD LA RH
			CALL	LCDCONVERSOR
			CALL	RETA980
			MOVLW	b'11000101'
			CALL	COMANDO

			MOVF	dec,W		;ESCRIBE LA HUMEDAD RELATIVA RH
			CALL 	LETRA
			MOVF	uni,W
			CALL 	LETRA
			MOVLW	0x25
			CALL	LETRA


			GOTO	MP1


;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

;================== SUBRUTINAS DE LOS ACTUADORES =========================================

;------------------- ENCIENDE EL HUMIDIFICADOR ---------------------------------------
ONHUMEDAD	BCF	STATUS,5	;ENCIENDE EL HUMIDIFICADOR
		BSF	PORTC,4

		RETURN

;------------------- APAGA EL HUMIDIFICADOR ---------------------------------------
OFFHUMEDAD	BCF	STATUS,5	;APAGA EL HUMIDIFICADOR
		BCF	PORTC,4

		RETURN



;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

;============ SUBRUTINA DE CONVERSION DE A/D  =========================================

CONVERSION		CALL	RETA20		;LLAMA AL RETARDO DE 20MICRO SEGUNDOS
			BCF	STATUS,5	;BANCO 0
			CLRF	VALORCONVERSION
			BSF 	ADCON0,2	;COMIENZO DE LA CONVERSION A/D

	CONVERTIR	BTFSC	ADCON0,2	;LEEMOS EL BIT bit GO/DONE HASTA QUE ESTE A UNO
			GOTO 	CONVERTIR

			BCF	STATUS,5
			MOVF	ADRESH,W
			MOVWF	VALORCONVERSION
			
			RETURN	




;======================= Subrutina sensor sht11 ======================================

;--------------------- LECTURA HUMEDAR -----------------------------------------------
sht11_Humedad	movlw	b'00000101'
		call	SHT11_CMD	;Envio: Lectura de humedad
		call	waitACK		;espera que llegue ACK desde el sensor
		call	adqtime		;espera que pase el tiempo de adquisicion
		BCF	STATUS,5
		bsf	PORTA,1
		call	read
		call	CalcRH		;Calcula %RH y ajusta linealidad
					;retorna variable RH COMO dato		
		return

;--------------------- LECTURA temperatura ------------------------------------------
sht11_Tempera				;	LECTURA TEMPERATURA 2 bytes
		movlw	b'00000011'
		call	SHT11_CMD	;	Envio: Lectura de Temperatura
		call	waitACK		;	espera que llegue ACK desde el sensor
		call	adqtime		;	espera que pase el tiempo de adquisicion
		call	read

		call	CalcRH		;	Calcula %RH y ajusta linealidad, vuelve con el valor en RH

		return	

	
;------------------- SUBRUTINAS DE CONFIGURACION DEL SHT11 ---------------------------		
sht11_Set14bits				;configura el sensor para trabajar en modo 8 bits
		movlw	b'00000110'	
		call	SHT11_CMD	;	Envio: Escritura de registro interno
		call	waitACK		;	espera que llegue ACK desde el sensor
		bcf	STATUS,5
		movlw	b'00000000'	;	pone un 1 en el bit 0 de status... (12 bit RH, 14 bit °T)
		call	SHT11_CMD	;	Envio: modificacion de status
		call	waitACK		;	espera que llegue ACK desde el sensor					
		return
		
sht11_Reset	;Resetea el sensor sht11
		movlw	b'00011110'
		call	SHT11_CMD	;Envio: Lectura en config interna
		call	waitACK		;espera que llegue ACK desde el sensor
		call	RETA1700	;espera de 11mS al menos despues de esta instruccion
		return


;///////////////////////////////////////////////////////////////////////////
;--------------------- Manda comando AL SHT11 ------------------------------
SHT11_CMD	movwf	CMData		;guarda el comando en variable
	
		bsf	STATUS,5	;banco 1 
		bcf	TRISA,2		;puertos como salida
		bcf	TRISA,1

		bcf	STATUS,5	;banco 0 
		bSf	PORTA,1		;DATA a 1 (por defecto)
		bSf	PORTA,2		;CLK

		nop			;espera un poco
		nop

		bcf	PORTA,1		;DATA	(pulso bajo)
		NOP
		bcf	PORTA,2		;CLK
		nop
		bsf	PORTA,2		;CLK
		bsf	PORTA,1		;DATA (por defecto alto)
		NOP
		bcf	PORTA,2		;CLK

		bcf	STATUS,C	;borra carry
		clrf	sincbit
		
cont_send	rlf	CMData,F	;rota a la izquierda, bit alto en carry
		btfsc	STATUS,C	;comprueba si es 1 o 0
		goto	uno

cero		bcf	PORTA,2		;SCK  falling edge -_
		bcf	PORTA,1		;DATA change
		bsf	PORTA,2		;SCK  rising edge  _-
		goto	sht11_compTX	;salta

uno		bcf	PORTA,2		;SCK  falling edge -_
		bsf	PORTA,1		;DATA change
		bsf	PORTA,2		;SCK  rising edge  _-

;Comprobacion para 8 rotaciones, una por bit del comando.
sht11_compTX    movlw 	0x08		;comprobacion 8 bits
                subwf   sincbit,W       ;Compara 
                btfsc   STATUS,Z        ;Es el ultimo?             
                return			;Si,
                incf    sincbit,f       ;Incrementa numero de sincbit
                goto    cont_send	;Vuelve a escribir


;///////////////////////////////////////////////////////////////////////////
;---------------- Espera la llegada de ACK desde el sensor -----------------
waitACK		bsf	STATUS,5	;banco 1
		bsf	TRISA,1		;pone DATA port,0 como entrada
		bcf	STATUS,5	;banco 0
		
ACKrx		bcf	PORTA,2		;SCK  falling edge
		NOP
		bsf	PORTA,2		;SCK  rising edge
		btfsc	PORTA,1		;comprueba data
		RETLW	.1
		bcf	PORTA,2		;SCK  falling edge estado bajo por defecto
		CLRW

		return

;ack desde SHT11 detectado y llegada de datos			
adqtime		btfsc	PORTA,1		;comprueba data
		goto	adqtime		;NO, bucle

		return



;///////////////////////////////////////////////////////////////////////////
;------------- LECTURA DE DATOS DESDE EL SHT11 (Byte alto) ----------------------

read			movlw 	0x08
			MOVWF	sincbit

	high_byte	rlf	RXlsb,F
			bcf	RXlsb,0
			bsf	PORTA,2

			btfsc	PORTA,1
			bsf	RXlsb,0

			bcf	PORTA,2

			decfsz	sincbit,F
			goto	high_byte

		
			bsf	STATUS,5		; register page 1
			bcf	TRISA,1			; SHT11_DATA es salida
			bcf	STATUS,5		; register page 0

			bcf	PORTA,1
			nop
			bsf	PORTA,2
			nop
			bcf	PORTA,2
	
			bsf	STATUS,5		; register page 1
			bsf	TRISA,1			; SHT11_DATA es entrada
			bcf	STATUS,5		; register page 0

			movlw	0X08
			movwf	sincbit

	low_byte	rlf	RXmsb,F
			bcf	RXmsb,0
			bsf	PORTA,2
			btfsc	PORTA,1
			bsf	RXmsb,0

			bcf	PORTA,2

			decfsz	sincbit,F
			goto	low_byte

			bsf	STATUS,5		; register page 1
			bCf	TRISA,1			; SHT11_DATA es salida
			bcf	STATUS,5		; register page

			bSf	PORTA,1
			nop
			bsf	PORTA,2
			NOP
			BCF	PORTA,2
	
			bsf	STATUS,5		; register page 1
			bsf	TRISA,1			; SHT11_DATA es entrada
			bcf	STATUS,5		; register page 0

			return






;///////////////////////////////////////////////////////////////////////////
;--------------- TRANSFORMA LA HUMEDAD EN UN VALOR ENTENDIBLE ---------------

CalcRH		;RH% calculos de linealidad. (a*RH%+b)/256
		bcf	STATUS,5	;banco 0
		movlw	0x00		;0		;MultiplicLO
		movwf	ACCaHI
		movf	RXlsb,W	      	;lectura 8 bits	;MultiplicHI
		movwf	ACCaLO
		
		
		movlw	b'01101100'		
		subwf	RXlsb,W
		btfsc	STATUS,C
		goto	calcA2
		
;-------------- Si lectura menor o igual a 107...
calcA1		movlw	b'10001111'	;A		;ResultLLO
		movwf	ACCbLO
		movlw	0x00		;A		;ResultHHI
		movwf	ACCbHI
		
		call	D_mpyS 		;multiplica (A*RH)
					;el resultado esta en ACCcHI,ACCcLO		
					;resta 512 del resultado
					;comprueba si el dato es mayor de 512
					;si fuera menor.. pone como resultado 512
					;si es mayor.. resta 2 a MSB que equivale a 512
					;del dato de 16bits		
		movlw	0x03		;resta 2
		subwf	ACCcHI,W	
		btfss	STATUS,C
		goto 	menord2		;mayor de 2


					;si es mayor de 512.. resta 512 al resultado
					;y luego comprueba que el resultado no sea menor de 512
mayord2		movlw	0x02
		subwf	ACCcHI,F	;resta 512 al dato alto 

		movlw	0x03		;si el resultado es 
		subwf	ACCcHI,W	;menor de 512...
		btfss	STATUS,C
		goto 	menord2		;mayor de 2
		goto	calccont	;si es mayor continua


					;si es menor de 2 pone como resultado 512
menord2		movlw	0x02
		movwf	ACCcHI		;resultado=512
		clrf	ACCcLO
		goto	calccont	;continua con los calculos

		goto	calccont
		
;-------------- Si lectura mayor o igual a 108...
calcA2		movlw	b'01101111'	;A		;ResultLLO
		movwf	ACCbLO
		movlw	0x00		;A		;ResultHHI
		movwf	ACCbHI
		
		call	D_mpyS 		;multiplica (A*RH)
		
		;suma 2893 al resultado
		;suma 11 a MSB (mas acarrero de LSB) y 77 a LSB
		
		;MSB=ACCcHI  LSB=ACCcLO para 16bits de resolucion
		
		movlw	b'00001011'
		addwf	ACCcHI		;suma 11 a MSB
		
		movlw	b'01001101'	;suma 77 a LSB y si hay acarreo
		addwf	ACCcLO		;se lo suma a LSB
		
		btfsc	STATUS,C	;comprueba el acarreo
		incf	ACCcHI		;suma el acarreo a MSB
					;no hay acarreo y salta
		


calccont	;continua con el calculo de %RH	
		;ahora divide el resultado de 16bits / 256

		;El resultado completo de 32 bits = ( ACCbHI,ACCbLO,ACCcHI,ACCcLO )

		;el resutlado despues de rotar 8 bits es el mismo que 
		;el byte (ACCcHI) correspondiente al byte 2 menos significativo
		
		
		movf	ACCcHI,W
		movwf	RH		;RH = Relative Humidity
		
		return			;retorna con el resultado calculado
		
;=================================================================================
;*******************************************************************
;                    Double Precision Multiplication
;
;*******************************************************************;
;   Multiplication : ACCb(16 bits) * ACCa(16 bits) -> ACCb,ACCc ( 32 bits )
;      (a) Load the 1st operand in location ACCaLO & ACCaHI ( 16 bits )
;      (b) Load the 2nd operand in location ACCbLO & ACCbHI ( 16 bits )
;      (c) CALL D_mpy
;      (d) The 32 bit result is in location ( ACCbHI,ACCbLO,ACCcHI,ACCcLO )
;
;               Double Precision Multiply ( 16x16 -> 32 )
;         ( ACCb*ACCa -> ACCb,ACCc ) : 32 bit output with high word
;  in ACCb ( ACCbHI,ACCbLO ) and low word in ACCc ( ACCcHI,ACCcLO ).
;*******************************************************************
;*******************************************************************

D_mpyS                           	;results in ACCb(16 msb's) and ACCc(16 lsb's)
		call    setupmult
		bcf	STATUS,C
mloop   
		rrf     ACCdHI,F       	;rotate d right
		rrf     ACCdLO,F
		btfss   STATUS,C    	;need to add?
		goto    No_add
		movf    ACCaLO,W        ; Addition ( ACCb + ACCa -> ACCb )
		addwf   ACCbLO,F       	;add lsb
		btfsc   STATUS,C    	;add in carry
 		incf    ACCbHI,F
		movf    ACCaHI,W
		addwf   ACCbHI,F       	;add msb

No_add		rrf     ACCbHI,F
		rrf     ACCbLO,F
		rrf     ACCcHI,F
		rrf     ACCcLO,F
		decfsz  temp,F        	 ;loop until all bits checked
		goto    mloop
		goto	end1


;         Double Precision Addition ( ACCb + ACCa -> ACCb )
;
D_add  	        bcf	Flags,C		;Clear temp Carry bit
		movf    ACCaLO,W        ; Addition ( ACCb + ACCa -> ACCb )
		addwf   ACCbLO,F       	;add lsb
		btfsc   STATUS,C    	;add in carry
 		incf    ACCbHI,F
		btfsc	STATUS,C
		bsf	Flags,C	
		movf    ACCaHI,W
		addwf   ACCbHI,F        ;add msb
		btfsc	Flags,C
		bsf	STATUS,C
		return

;*******************************************************************
setupmult  	movlw   .16             ; for 16 shifts
		movwf   temp
		movf    ACCbHI,W        ;move ACCb to ACCd
		movwf   ACCdHI
		movf    ACCbLO,W
		movwf   ACCdLO
		clrf    ACCbHI
		clrf    ACCbLO
		return
;****************************************************************

end1	return


;=========== SUBRUTINAS PARA LA LCD =============================
 
;---------- ESCRITURA  COMANDO ---------------------------------
COMANDO	BCF	WRRS		;PONEMOS A  0 BIT RS DE LA LCD
	BSF	ELCD		;PONEMOS A  1 BIT E DE LA LCD

	BCF	STATUS,5	;BANCO 0
	MOVWF	PORTB		;LO SACA POR EL BUS DE DATO
	CALL	RETA1700	
	BCF	ELCD		;PONEMOS A  0 BIT E DE LA LCD
	CALL	RETA40

	RETURN		

;--------- ESCRITURA LETRAS -----------------------------------
LETRA	BSF	WRRS		;PONEMOS A  1 BIT RS DE LA LCD
	BSF	ELCD		;PONEMOS A  1 BIT E DE LA LCD

	BCF	STATUS,5	;BANCO 0
	MOVWF	PORTB		;LO SACA POR EL BUS DE DATOS
	CALL	RETA1700

	BCF	ELCD		;PONEMOS A  0 BIT E DE LA LCD

	RETURN		


;============ SUBRUTINA DE TEXTOS =======================================================
;----------------------------------------------------------------------------------------
TEXTO1	MOVLW	0X01		;BARRA LA PANTALLA Y COLOCA EL CURSOR EN LA POSICION 00
	CALL	COMANDO
	MOVLW	b'00001000'	;POSICION 0
	CALL	COMANDO

	MOVLW	'E'
	CALL 	LETRA	;1
	MOVLW	'S'
	CALL 	LETRA	;2
	MOVLW	'P'
	CALL 	LETRA	;3
	MOVLW	'E'
	CALL 	LETRA	;4
	MOVLW	'R'
	CALL 	LETRA	;5
	MOVLW	'A'
	CALL 	LETRA

	CALL 	RETA40
	MOVLW	b'00000000'	;POSICION CURSOR DIRECCION 00
	CALL	COMANDO

		RETURN

;-----------------------------------------------------------------------------------
TEXTOPRINCIPAL	MOVLW	0X01		;BARRA LA PANTALLA Y COLOCA EL CURSOR EN LA POSICION 00
		CALL	COMANDO
		MOVLW	b'00001000'	;POSICION 0
		CALL	COMANDO

		MOVLW	'F'
		CALL 	LETRA	;1
		MOVLW	'I'
		CALL 	LETRA	;2
		MOVLW	'J'
		CALL 	LETRA	;3
		MOVLW	'A'
		CALL 	LETRA

		MOVLW	0X14		;MUEVE EL CURSOR UNA POSICION A LA DERECHA
		CALL	COMANDO


		MOVF	dec,W		;ESCRIBE LA HUMEDAD FIJADA
		CALL 	LETRA
		MOVF	uni,W
		CALL 	LETRA
		MOVLW	0x25
		CALL	LETRA

	;ESCRIBIR EL RESTO DE TEXTO DE LAS OTRAS VARIABLES&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

		
		MOVLW	b'11000000'	;POSICION 40
		CALL	COMANDO

		MOVLW	'R'
		CALL 	LETRA
		MOVLW	'E'
		CALL 	LETRA
		MOVLW	'A'
		CALL 	LETRA
		MOVLW	'L'
		CALL 	LETRA

		RETURN



;=================== RUTINA DE CONVERSION DE BINARIO A BCD y luego a ascii ==========================
; ****** Convertir un BYTE(registro cualquiera) en BCD(cen,dec,uni) ******
; se guarda en cen,dec,uni las cifras respectivas en BCD de BYTE 0..255

LCDCONVERSOR	clrf 	uni
		clrf 	dec  
 		clrf 	cen
		movwf 	temp 		; muevo mi Dato a convertir a Temp
		goto 	Uni  

    BCD2 	decfsz 	temp,F 		; decremento Temp....
 		goto 	Uni
 		goto	ascii
 	
	Uni	incf  	uni,F 		; mientras "Temp" decrementa, "uni" crece uno a uno
		movf 	uni,W
 		sublw 	d'10'
 		btfss 	STATUS,Z 	; Pregunto si "uni" llego a 10
 		goto 	BCD2	 	; no sigo la misma secuencia
 		clrf 	uni   		; si entonces uni=0, luego debo i++ a dec
 
	Dec	incf  	dec,F
 		movf 	dec,W
 		sublw 	d'10'
 		btfss 	STATUS,Z 	; Pregunto si "dec" llego a 10
 		goto 	BCD2	 	; no sigo la misma secuencia
 		clrf 	dec  		; si entonces dec=0, luego debo i++ a dec

	Cen	incf  	cen,F 		; no hace falta verificar si desborda 10
 		goto 	BCD2	


;Conversion bcd a ASCII
    
	ascii   movlw   0x30
   		addwf   dec,f
    
   		movlw   0x30
   		addwf   uni,f
   
   		movlw   0x30
   		addwf   cen,f   

  		RETURN

;================== RETORDOS ===========================================

;------------ 980000 MICROSEGUNDOS=4900 000 ----------------------------

RETA980		MOVLW	0x5F
  		MOVWF	CONTA01		;GUARDAMOS VALOR EN CONTA01
	
		MOVLW	0xAF
		MOVWF	CONTA02		;GUARDAMOS VALOR EN CONTA02

		MOVLW	0x0B
		MOVWF	CONTA03		;GUARDAMOS VALOR EN CONTA03

TRES980		DECFSZ	CONTA03,1	;DECREMENTAMOS CONTA01, SI ES CERO SALTA
		GOTO	TRES980		;VUELVE A RECARGAR CONTA01

DOS980		DECFSZ	CONTA02,1	;DECREMENTAMOS CONTA02, SI ES CERO SALTA 	
		GOTO	DOS980		;VOLVEMOS A RECARGAR CONTA02

UNO980		DECFSZ	CONTA01,1	;DECREMENTAMOS CONTA03, SI ES CERO SALTA 	
		GOTO	UNO980		;VOLVEMOS A RECARGAR CONTA03
		RETURN


;--------------  1700 MICROSEGUNDOS= 8500 INSTRUCIONES --------------------------

RETA1700	MOVLW	0xA3
  		MOVWF	CONTA01		;GUARDAMOS VALOR EN CONTA01
	
		MOVLW	0x07		
		MOVWF	CONTA02		;GUARDAMOS VALOR EN CONTA02
	

DOS1700		DECFSZ	CONTA02,1	;DECREMENTAMOS CONTA02, SI ES CERO SALTA 	
		GOTO	DOS1700		;VOLVEMOS A RECARGAR CONTA01

UNO1700		DECFSZ	CONTA01,1	;DECREMENTAMOS CONTA01, SI ES CERO SALTA 	
		GOTO	UNO1700		;VOLVEMOS A RECARGAR CONTA01

		RETURN

;--------------- 40 MICROSEGUNDOS =200 INSTRUCIONES ---------------------------------

RETA40		MOVLW	0x42
  		MOVWF	CONTA01		;GUARDAMOS VALOR EN CONTA01
	

UNO40		DECFSZ	CONTA01,1	;DECREMENTAMOS CONTA03, SI ES CERO SALTA 	
		GOTO	UNO40		;VOLVEMOS A RECARGAR CONTA03
		RETURN


;---------------  RETARDO 20MICROS=100 INSTRUCIONES  --------------------------------

RETA20		MOVLW	0x21
  		MOVWF	CONTA01		;GUARDAMOS VALOR EN CONTA01

BUCLE01		DECFSZ	CONTA01,1 	;Decrementa CONTA01
		GOTO	BUCLE01		;Si no es cero repetimos ciclo
		RETURN


END
		
