;***************************** Librería "RS232.INC" *************************************


		CBLOCK
		RS232_ContadorBits
		RS232_Dato
		ENDC

		#DEFINE  RS232_Entrada	PORTD,0		; Línea por la que se reciben los datos.
		#DEFINE  RS232_Salida	PORTD,1		; Línea por la que se envían los datos.
;
; Subrutina "RS232_Inicializa" -------------------------------------------------------------
;
; Configura las líneas de salida y entrada del microcontrolador.
RS232_Inicializa
		bsf	STATUS,RP0
		bsf	RS232_Entrada		; Esta línea se configura como entrada.
		bcf	RS232_Salida		; Esta línea se configura como salida.
		bcf	STATUS,RP0
		return

; Subrutina "RS232_LeeDato" -------------------------------------------------------------

;
; Salida: En el registro de trabajo W el byte leído.

RS232_LeeDato
		movlw	d'8'			; Número de bits a recibir.
		movwf	RS232_ContadorBits
RS232_EsperaBitStart
		btfsc	RS232_Entrada 		; Lee la entrada y espera a que sea "0".
		goto	RS232_EsperaBitStart	; No, pues espera el nivel bajo.
		call 	Retardo_100micros		; El primer bit debe leerlo un tiempo igual a una
		call 	Retardo_50micros 		; vez y media el periodo de transmisión.
RS232_LeeBit
		bcf	STATUS,C		; Ahora lee el pin. En principio supone que es 0.
		btfsc	RS232_Entrada		; ¿Realmente es cero?
		bsf	STATUS,C		; No, pues cambia a "1".
		rrf	RS232_Dato,F		; Introduce el bit en el registro de lectura.
		call	Retardo_100micros		; Los siguientes bits los lee un periodo más tarde.
		decfsz 	RS232_ContadorBits,F	; Comprueba que es el último bit.
		goto	RS232_LeeBit		; Si no es el último bit pasa a leer el siguiente.
		call	Retardo_200micros		; Espera un tiempo igual al los 2 bits de Stop.
		movf	RS232_Dato,W		; El resultado en el registro W.
		return	

; Subrutinas "RS232_EnviaDato" y "RS232_EnviaNúmero" -------------------------------------

;
; Entrada:	En (W) el dato a enviar.

RS232_EnviaNumero			; Envía el código ASCII de un número.
		addlw	'0'			; Lo pasa a código ASCII sumándole el ASCII del 0.
RS232_EnviaDato
		movwf	RS232_Dato		; Guarda el contenido del byte a transmitir.
		movlw	d'8'			; Este es el número de bits a transmitir.
		movwf	RS232_ContadorBits
		bcf	RS232_Salida		; Bit de Start.
		call	Retardo_100micros
RS232_EnviaBit				; Comienza a enviar datos.
		rrf	RS232_Dato,F		; Lleva el bit que se quiere enviar al Carry para
		btfss	STATUS,C		; deducir su valor. ¿Es un "1" el bit a transmitir?
		goto	RS232_EnviaCero		; No, pues envía un "0".
RS232_EnviaUno
		bsf	RS232_Salida		; Transmite un "1".
		goto	RS232_FinEnviaBit
RS232_EnviaCero
		bcf	RS232_Salida		; Transmite un "0".
RS232_FinEnviaBit
		call	Retardo_100micros		; Este es el tiempo que estará en alto o bajo.
		decfsz 	RS232_ContadorBits,F	; Comprueba que es el último bit.
		goto	RS232_EnviaBit		; Como no es el último bit repite la operación.
		bsf	RS232_Salida		; Envía dos bits de Stop.
		call	Retardo_200micros
		return
	
