;
;rs232_3.asm
;Este ejemplo envia constantemente el estado de los bits de PORTA 
;al programa terminal del ordenador  

;Ejemplo de comunicación RS232 entre un pic16F84 y ordenador PC  
;La configuración es el estandar 8N1 (8 bits de datos, sin paridad, 
;y 1 bit de stop) y la velocidad de comunicación es de 9600 Bd. 


	list	p=16f84		;modelo de pic utilizado
	include	"p16f84.inc"	;Definición de registros
	__config	_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;palabra de configuración
			
;Constantes de los parámetros para las rutinas de comunicación 

BAUDIOS		equ	.9600     	;Velocidad de comunicación
CLKIN		equ	.4000000	;Frecuencia de trabajo en c/s
T_MODO		equ	1		;transmitir primero el bit LSB
R_MODO		equ	1		;recibe primero el bit LSB
T_Nbit		equ	8		;transmitir datos de 8 bits
R_Nbit		equ	8		;recibe datos de 8 bits
Sbit		equ	1		;un bit de stop
												
;Espacio para el bloque de variables de las rutinas rs232.inc  

Rs232_var	equ	0x0C	;Inicio del bloque de variables reservadas
				;para las rutinas RS232.INC

;Registros para las variables de programa principal

TEMPORAL_0	equ	0x11
TEMPORAL_1	equ	0x12


		org	0x00
		goto 	INICIO
		org	0x05
				
		include	"rs232.inc"	;Rutinas de comunicación RS232
		
;Tablas de mensajes que se enviarán al programa terminal

TABLA_MENSAJES
		movwf	PCL		;mueve puntero hacia una tabla

MENS_RA0		equ	$
		dt	" RA0= ",0x00
MENS_RA1	equ	$
		dt	" RA1= ",0x00
MENS_RA2	equ	$
		dt	" RA2= ",0x00
MENS_RA3	equ	$
		dt	" RA3= ",0x00
MENS_RA4	equ	$
		dt	" RA4= ",0x00

;Subrutina universal de envio de mensajes

MENSAJE		movwf	TEMPORAL_0
MENSAJE_1	movf	TEMPORAL_0,W
		call	TABLA_MENSAJES
		movwf	TEMPORAL_1
		movf	TEMPORAL_1,F
		btfss	STATUS,Z
		goto	NO_ULTIMO
		return
NO_ULTIMO	movwf	Txdreg
		call	TxD
		incf	TEMPORAL_0,F
		goto	MENSAJE_1

;Bucle que comprueba y envia estado de RA0 a RA4

INICIO		bsf	STATUS,RP0    	;Selecciona página 1
		movlw	b'11101111'	;RB5 entrada y RB4 salida
		movwf	TRISB		;
		movlw	0xFF
		movwf	TRISA		;PORTA todo entradas
		bcf	STATUS,RP0	;Seleccionar página 0
		clrf	PORTB		;borra PORTB
			
		bsf	Txd_pin		;Línea de transmisión a "1"
		bsf	Rxd_pin		;Línea de recepción a "1"

_RA0		movlw	MENS_RA0
		call	MENSAJE		;transmite "RA0= "
		btfss	PORTA,0
		goto	RA0_ES_0
		call	ES_1
_RA1		movlw	MENS_RA1
		call	MENSAJE		;transmite " RA1= "
		btfss	PORTA,1
		goto	RA1_ES_0
		call	ES_1	
_RA2		movlw	MENS_RA2
		call	MENSAJE		;transmite " RA2= "
		btfss	PORTA,2
		goto	RA2_ES_0
		call	ES_1							
_RA3		movlw	MENS_RA3
		call	MENSAJE		;transmite " RA3= "
		btfss	PORTA,3
		goto	RA3_ES_0
		call	ES_1
_RA4		movlw	MENS_RA4
		call	MENSAJE		;transmite " RA4= "
		btfss	PORTA,4
		goto	RA4_ES_0
		call	ES_1
SALIDA		movlw	.13
		movwf	Txdreg
		call	TxD		;transmite retorno de carro (CR)
		goto	_RA0

RA0_ES_0	movlw	'0'
		movwf	Txdreg
		call	TxD
		goto	_RA1	
RA1_ES_0	movlw	'0'
		movwf	Txdreg
		call	TxD
		goto	_RA2
RA2_ES_0	movlw	'0'
		movwf	Txdreg
		call	TxD
		goto	_RA3
RA3_ES_0	movlw	'0'
		movwf	Txdreg
		call	TxD
		goto	_RA4
RA4_ES_0	movlw	'0'
		movwf	Txdreg
		call	TxD
		goto	SALIDA

ES_1		movlw	'1'
		movwf	Txdreg
		call	TxD
		return

		end
    