;
;					EJEMPLO 3.7
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Trainer PLUS. Comunicación serie gestionada por software.
;
;Haciendo uso de las rutinas incluidas en el fichero RS232LOW.INC, se trata de utilizar el
;canal RS232 de la Trainer PLUS para comunicar vía serie con diferentes periféricos. En los
;ejemplos aquí propuestos se utilizará un PC para que, con el software TERMINAL.EXE, actue
;como un simple terminal de comunicaciones. El usuario deberá preparar los cables de comuni-
;cación entre la Trainer PLUS y el PC, teniendo en cuenta de cruzar la señal de Transmisión
;(TxD) con la de recepción (RxD) y viceversa.
;
;Este ejemplo es similar al anterior. Propone esperar a recibir un carácter desde el ter-
;minal para, inmediatamente, retransmitirlo al mismo a modo de ECO y visualizarlo sobre la
;pantalla LCD de la uPIC Trainer.

		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

CLKIN		equ	.4000000	;Frecuencia de trabajo
BAUDIOS		equ	.9600		;Velocidad de comunicación
T_MODO		equ	1		;Transmite primero bit LSB
R_MODO		equ	1		;Recibir primero bit LSB
T_Nbit		equ	8		;Transmite caracteres de 8 bits
R_Nbit		equ	8		;Recibe caracteres de 8 bits
Sbit		equ	2		;Transmite 2 bits de stop
                 
Lcd_var		equ	0x0c		;Inicio de las variables para rutinas LCD
Rs232_var	equ	0x0e		;Inicio de las variables para rutinas RS232
Lineas		equ	0x13		;Contador de líneas
Caracteres	equ	0x14		;Contador de caracteres
					
		org	0x00		;Vector de reset
		goto	Inicio
		org	0x05		;Salvar el vector de interrupción	
					
		include	"RS232LOW.INC"	;Incluir rutinas de comunicación
		include "LCD_CXX.INC"	;Incluir rutinas LCD							

Inicio:		bsf	STATUS,RP0	;Selecciona página 1 de datos
		movlw	b'10001111'	;Preescaler de 128 para el WDT. Pull_Up Off
		movwf	OPTION_REG	
		movlw	b'11101111'
		movwf	TRISB		;RB5 entrada y RB4 salida
		bcf	STATUS,RP0	;Selecciona página 0 de datos	

		call	UP_LCD		;Inicia E/S para el módulo LCD
		call	LCD_INI		;Inicialización del módulo LCD
		movlw	b'00001111'
		call	LCD_REG		;LCD on, Cursor On y Blink On

LCD_HOME	movlw	b'00000001'
		call	LCD_REG		;Borra LCD y Home
		movlw	.16
		movwf	Caracteres	;Inicia contador de caracteres
		movlw	.2
		movwf	Lineas		;Inicia contador de líneas
				
Loop		clrwdt
		bsf	STATUS,RP0	;Selecciona página 1
		movlw	b'11101111'
		movwf	TRISB		;RB5 entrada y RB4 salida
		bcf	STATUS,RP0

		bsf	Txd_pin		;Línea de transmisión a "1"
		bsf	Rxd_pin		;Línea de recepción a "1"

		call	RxD		;Espera a recibir un carácter
		movf	Rxdreg,W	;Lee el carácter recibido
		movwf	Txdreg
		call	TxD		;Retransmite carácter recibido (ECO)
		call	UP_LCD		;Reconfigura E/S para el LCD
		movlw	.13
		subwf	Rxdreg,W	;Mira si carácter recibido es CR
		btfsc	STATUS,Z	;No
		goto	LCD_HOME	;Si, borra LCD
		movf	Rxdreg,W
		call	LCD_DATO	;Visualiza carácter en el LCD

		decfsz	Caracteres,F	;Decrementa contador de caracteres
		goto	Loop

		movlw	.16
		movwf	Caracteres	;Inicia contador de caracteres
		movlw	0xc0
		call	LCD_REG		;Selecciona segunda línea del LCD
		decfsz	Lineas,F	;Se han completado 2 líneas ??
		goto	Loop		;No		
		goto	LCD_HOME	;Si, borrar pantalla

		end			;Fin del programa fuente

