;SISTEMA DE GOBIERNO DESDE ORDENADOR Desde el teclado de un ordenador se desea comandar
;el movimiento de una estructura mavil, segun la siguiente tabla:
;
;      TECLA (Por ejemplo)       MOVIMIENTO
;      -------------------       ----------
;              t                 Adelante
;              b                 Atrás
;              a                 Izquierda
;              l                 Derecha
;            Espacio             Parada
;
;El programa debe permitir modificar facilmente en posteriores revisiones en el harware de
;la salida, Es decir, para activar las salidas conviene utilizar el direccionamiento por bit
;en lugar de por byte(utilizar instrucciones "bsf" y "bcf", en lugar de "mov")
;
;ZONA DE DATOS***********************************************************************************
;
		LIST    p=16f84A
		#INCLUDE <P16f84A.INC>

 __config _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC

		CBLOCK 0x0c
		TeclaPulsada						;va a guardar el contenido de la tecla pulsada.
		MensajeApuntado						;Va a guardar la dirección del mensaje apuntado.
		ENDC

#DEFINE SalidaAdelante			PORTB,3				;Define dómde se situan las salidas.
#DEFINE SalidaAtras			PORTB,2
#DEFINE SalidaIzquierda			PORTB,1
#DEFINE SalidaDerecha			PORTB,0

TeclaAdelante	EQU	't'						;Código de las teclas utilizadas
TeclaAtras	EQU	'b'
TeclaIzquierda	EQU	'a'
TeclaDerecha	EQU	'l'
TeclaParada	EQU	' '						;Código de la tecla espaciadora, (hay un espacio,
									;tener cuidado al teclear el programa).
;ZONA DE cÓDIGOS*************************************************************************
		
		ORG	0
Inicio
		;call		LCD_Inicializa
		call		RS232_Inicializa
		bsf		STATUS,RP0					;Configura como salida las 4 lineas del 
		bcf		SalidaAdelante					;puerto B respetando la configuracion del
		bcf		SalidaAtras					;resto de las líneas.
		bcf		SalidaIzquierda
		bcf		SalidaDerecha
		bcf		STATUS,RP0
		call		Parado						;En principio todas las salidas deben estar 
Principal									;apagadas.
		call		RS232_LeeDato					;Espera a recibir un carácter.
		call		TesteaTeclado
		goto		Principal

;"Mensajes"------------------------------------------------------
;
Mensajes
		addwf	PCL,F
MensajeParado
		DT"Sistema PARADO",0x00
MensajeAdelante
		DT"Marcha ADELANTE",0x00
MensajeAtras
		DT"Marcha ATRAS",0x00
MensajeIzquierda
		DT"Hacia IZQUIERDA",0x00
MensajeDerecha
		DT"Hacia DERECHA",0x00

;Subrutina"TesteaTeclado"----------------------------------------------
;
;Testea el teclado y actúa en consecuencia.

TesteaTeclado
		      	movwf   TeclaPulsada      ;Guarda el contenido de la tecla pulsada
      			xorlw   TeclaAdelante      ;¿Es la tecla de movimiento hacia adelante?
      			btfsc   STATUS,Z
      			goto   Adelante      ;Si, se desea movimiento hacia adelante
;
      			movwf   TeclaPulsada            ;movf   TeclaPulsada,w      ;Recupera el contenido de la tecla pulsada
      			xorlw   TeclaAtras      ;¿Es la tecla de movimiento hacia atras?
      			btfsc   STATUS,Z
      			goto   Atras         ;Sí, se decea movimiento hacia atras
;
      			movwf   TeclaPulsada      ;Recupera el contenido de la tecla pulsada
      			xorlw   TeclaIzquierda      ;¿Es la tecla del movimiento hacia la Izquierda
      			btfsc   STATUS,Z
      			goto   Izquierda      ;Sí, se decea movimiento hacia atras
;
      			movwf   TeclaPulsada      ;Recupera el contenido de la tecla pulsada
      			xorlw   TeclaDerecha      ;¿Es la tecla del movimiento hacia la Derecha?
      			btfsc   STATUS,Z
      			goto   Derecha         ;Sí, se decea movimiento hacia la derecha
;
      			;movwf   TeclaPulsada      ;Recupera el contenido de la tecla pulsada
      			;xorlw   TeclaParada      ;¿Es la tecla de parada?
      			;btfss   STATUS,Z

		goto	FIN			;No es ninguna tecla de movimiento sale
Parado
		bcf	SalidaAdelante		;Como se a pulsado la tecla de parada se
		bcf	SalidaAtras		;desactivan todas las salidas
		bcf	SalidaIzquierda
		bcf	SalidaDerecha
		movlw	MensajeParado
		goto  Visualiza
Adelante
		bcf	SalidaAtras
		bsf	SalidaAdelante
		bcf	SalidaIzquierda
		bcf	SalidaDerecha
		movlw	MensajeAdelante
		goto  Visualiza
Atras
		bcf	SalidaAdelante
		bsf	SalidaAtras
		bcf	SalidaIzquierda
		bcf	SalidaDerecha
		movlw	MensajeAtras
		goto  Visualiza
Izquierda
		bcf	SalidaAdelante
		bcf	SalidaAtras
		bsf	SalidaIzquierda
		bcf	SalidaDerecha
		movlw	MensajeIzquierda
		goto  Visualiza
Derecha
		bcf	SalidaAdelante
		bcf	SalidaAtras
		bcf	SalidaIzquierda
		bsf	SalidaDerecha
		movlw	MensajeDerecha

;Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
;el monitor del ordenador.

Visualiza
;		movwf	MensajeApuntado		;Guarda la posición del mensaje.
;		call	LCD_Borra		;Borra la pantalla del modulo LCD.
;		movf	MensajeApuntado,W	;Visualiza el mensaje en la pantalla
;		call	LCD_Mensaje		;del visualizador LCD.
;		call	RS232_LineasBlanco	;Borra la pantalla del modulo LCD.
;		movf	MensajeApuntado,W	
;		call	RS232_Mensaje		;Lo visualiza en el hiperTerminal
;		call	RS232_LineasBlanco
FIN	return
	
		INCLUDE <RS232.INC>
		INCLUDE <RS232MEN.INC>
		;INCLUDE <LCD_4BIT.INC>
		;INCLUDE <LCD_MENS_INC>
		INCLUDE <RETARDOS.INC>

		END