;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
		goto		Parado						;En principio todas las salidas deben estar 
												;apagadas.
Principal	
  		call		RS232_LeeDato					;Espera a recibir un carácter.
		movwf		TeclaPulsada
		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
		      	movlw   TeclaAdelante      ;Guarda el contenido de la tecla adelante
      			subwf   TeclaPulsada,0      ;¿Es la tecla de movimiento hacia adelante?
      			btfsc   STATUS,Z
      			goto    Adelante      ;Si, se desea movimiento hacia adelante
;
      			movlw   TeclaAtras      ;Guarda el contenido de la tecla atras
      			subwf   TeclaPulsada,0      ;¿Es la tecla de movimiento hacia atras?
      			btfsc   STATUS,Z
      			goto    Atras         ;Sí, se decea movimiento hacia atras
;
      			movlw   TeclaIzquierda    ;Guarda el contenido de la tecla Izquierda
      			subwf   TeclaPulsada,0      ;¿Es la tecla de movimiento hacia Izquierda?
      			btfsc   STATUS,Z
      			goto    Izquierda      ;Sí, se decea movimiento hacia Izquierda
;
      			movlw   TeclaDerecha      ;Guarda el contenido de la tecla Derecha
      			subwf   TeclaPulsada,0      ;¿Es la tecla de movimiento hacia Derecha?
      			btfsc   STATUS,Z
      			goto    Derecha         ;Sí, se decea movimiento hacia la derecha
;
      			movlw   TeclaParada      ;Guarda el contenido de la tecla Parado
      			subwf   TeclaPulsada,0      ;¿Es la tecla de movimiento hacia parado?
      			btfsc   STATUS,Z
      			goto    Parado         ;Sí, se decea movimiento hacia la Parado

				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	goto Principal
	
		#INCLUDE <RS232.INC>
		#INCLUDE <RS232MEN.INC>
		;#INCLUDE <LCD_4BIT.INC>
		;#INCLUDE <LCD_MENS_INC>
		#INCLUDE <RETARDOS.INC>

		END