;
;rs232_4.asm
;Este ejemplo utiliza el programa terminal para comandar el encendido de los 
;leds conectados a las salidas RB0, RB1, RB2 y RB3 via RS232
;Pulsando la tecla A se voltea (invierte el estado) de la salida RB0, 
;la tecla B invierte la salida RB1, la tecla C invierte RB2 y la tecla D
;invierte RB3. 

;IMPORTANTE: el led conectado en RB4 permanece encendido ya que 
;se utiliza como linea Txd para la comunicación serie. 

;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


		org	0x00
		goto 	INICIO
		org	0x05
				
		include	"rs232.inc"	;Rutinas de comunicación RS232

INICIO		bsf	STATUS,RP0    	;Selecciona página 1
		movlw	b'00100000'	;RB5 entrada, las demás salidas
		movwf	TRISB		;RB5=RxD y RB4=TxD
		bcf	STATUS,RP0	;Seleccionar página 0
		clrf	PORTB		;borra salidas		

;Prepara lineas comunicación serie

		bsf	Txd_pin		;Línea de transmisión a "1"
		bsf	Rxd_pin		;Línea de recepción a "1"

;Programa principal

BUCLE		call	RxD		;espera recibir un carácter
		movlw	'A'
		subwf	Rxdreg,W
		btfsc	STATUS,Z	;es A ?
		goto	ES_A
		movlw	'B'
		subwf	Rxdreg,W
		btfsc	STATUS,Z	;es B ?
		goto	ES_B
		movlw	'C'
		subwf	Rxdreg,W
		btfsc	STATUS,Z	;es C ?
		goto	ES_C
		movlw	'D'		
		subwf	Rxdreg,W
		btfsc	STATUS,Z	;es D ?	
		goto	ES_D
		goto	BUCLE

ES_A		movlw	b'00000001'	;mediante la función xor (or exclusiva)..
		xorwf	PORTB,F		;..voltea (bascula) RB0
		goto	BUCLE		;vuelve a esperar otro carácter
ES_B		movlw	b'00000010'
		xorwf	PORTB,F		;voltea RB1
		goto	BUCLE
ES_C		movlw	b'00000100'
		xorwf	PORTB,F		;voltea RB2
		goto	BUCLE
ES_D		movlw	b'00001000'
		xorwf	PORTB,F		;voltea RB3
		goto	BUCLE
			
		end