<br />
;************************************ Meta_Control.asm **************************************
<br />
;
<br />
; ===================================================================
<br />
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
<br />
; E. Palacios, F. Remiro y L. López. www.pic16f84a.org
<br />
; Editorial Ra-Ma. <!-- w --><a href="http://www.ra-ma.es" target="_blank">www.ra-ma.es</a><!-- w -->
<br />
; ===================================================================
<br />
;
<br />
; SISTEMA DE GOBIERNO DESDE ORDENADOR: Desde el teclado de un ordenador se desea comandar
<br />
; el movimiento de una estructura móvil, según la siguiente tabla:
<br />
;
<br />
; TECLA (Por ejemplo) MOVIMIENTO
<br />
; ------------------- ----------
<br />
; t Adelante
<br />
; b Atrás
<br />
; a Izquierda
<br />
; l Derecha
<br />
; Espacio Parada
<br />
;
<br />
; La pulsación de cualquiera de estas teclas activa el estado de las salidas correspondiente
<br />
; RB3 (Adelante), RB2 (Atrás), RB1 (Izquierda), RB0 (Derecha) y apaga el resto.
<br />
;
<br />
; El movimiento que se está realizando aparece reflejado en un mensaje en el visualizador LCD
<br />
; del sistema y también en la pantalla del ordenador.
<br />
;
<br />
; El programa debe permitir modificar facilmente en posteriores revisiones en el hardware de
<br />
; la salida. Es decir, para activar las salidas conviene utilizar el direccionamiento por bit
<br />
; en lugar de por byte (utilizar instrucciones "bsf" y "bcf", en lugar de "mov..").
<br />
;
<br />
; ZONA DE DATOS **********************************************************************
<br />
<br />
<br />
include <P16F84A.INC>
<br />
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
<br />
<br />
CBLOCK 0x0C
<br />
TeclaPulsada ; Va a guardar el contenido de la tecla pulsada.
<br />
MensajeApuntado ; Va a guarda la dirección del mensaje apuntado.
<br />
Relay_1
<br />
Relay_2
<br />
Relay_3
<br />
Relay_4
<br />
ENDC
<br />
<br />
#DEFINE SalidaR1 PORTB,3 ; Define dónde se sitúan las salidas.
<br />
#DEFINE SalidaR2 PORTB,2
<br />
#DEFINE SalidaR3 PORTB,1
<br />
#DEFINE SalidaR4 PORTB,0
<br />
<br />
<br />
TECLA_RELE_1_ON EQU 'q' ; Código de las teclas utilizadas.
<br />
TECLA_RELE_1_OFF EQU 'a'
<br />
TECLA_RELE_2_ON EQU 'w'
<br />
TECLA_RELE_2_OFF EQU 's'
<br />
TECLA_RELE_3_ON EQU 'e'
<br />
TECLA_RELE_3_OFF EQU 'd'
<br />
TECLA_RELE_4_ON EQU 'r'
<br />
TECLA_RELE_4_OFF EQU 'f'
<br />
TECLA_INICIO EQU 'z'
<br />
TECLA_PARADA EQU ' '
<br />
TECLA_INFO EQU 'i' ; Código de la tecla espaciadora, (hay un espacio,
<br />
; tened cuidado al teclear el programa).
<br />
ENTER EQU 0x0A ; Código de tecla "Enter" o "Retorno de Carro".
<br />
CAMBIO_LINEA EQU 0x0D ; Código para el cambio de línea.
<br />
<br />
ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM
<br />
; de datos.
<br />
DE 0x00, 0x00, 0x00, 0x00
<br />
<br />
; ZONA DE CÓDIGOS ********************************************************************
<br />
<br />
ORG 0
<br />
Inicio
<br />
call LCD_Inicializa
<br />
call RS232_Inicializa
<br />
bsf STATUS,RP0 ; Configura como salidas las 4 líneas del
<br />
bcf SalidaR1 ; del Puerto B respetando la configuración del
<br />
bcf SalidaR2 ; resto de las líneas.
<br />
bcf SalidaR3
<br />
bcf SalidaR4
<br />
bcf STATUS,RP0
<br />
call Parado ; En principio todas las salidas deben estar
<br />
Principal ; apagadas.
<br />
call RS232_LeeDato ; Espera a recibir un carácter.
<br />
call TesteaTeclado
<br />
goto Principal
<br />
<br />
; "Mensajes" ----------------------------------------------------------------------------
<br />
;
<br />
Mensajes
<br />
addwf PCL,F
<br />
MensajeParado
<br />
DT "Sistema PARADO", 0x00
<br />
Mensaje_R1_ON
<br />
DT "RELE 1 ON", 0x00
<br />
Mensaje_R1_OFF
<br />
DT "RELE 1 OFF", 0x00
<br />
Mensaje_R2_ON
<br />
DT "RELE 2 ON", 0x00
<br />
Mensaje_R2_OFF
<br />
DT "RELE 2 OFF", 0x00
<br />
Mensaje_R3_ON
<br />
DT "RELE 3 ON", 0x00
<br />
Mensaje_R3_OFF
<br />
DT "RELE 3 OFF", 0x00
<br />
Mensaje_R4_ON
<br />
DT "RELE 4 ON", 0x00
<br />
Mensaje_R4_OFF
<br />
DT "RELE 4 OFF", 0x00
<br />
Mensaje_Info
<br />
; DT 0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xBB
<br />
; DT ENTER, CAMBIO_LINEA
<br />
DT 0xBA, " FirmWare v1.00 ", 0xBA
<br />
DT ENTER, CAMBIO_LINEA
<br />
DT 0xBA, " PIC16F84A ", 0xBA
<br />
DT ENTER, CAMBIO_LINEA
<br />
DT 0xBA, " 4 MHz ", 0xBA
<br />
; DT ENTER, CAMBIO_LINEA
<br />
; DT 0xCC, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xB9
<br />
DT ENTER, CAMBIO_LINEA
<br />
DT " <!-- e --><a href="mailto:metaconta@gmail.com">metaconta@gmail.com</a><!-- e -->", 0x00
<br />
Mensaje_Activar
<br />
DT "Todos activos", 0x00
<br />
<br />
; Subrutina "TesteaTeclado" -------------------------------------------------------------
<br />
;
<br />
; Testea el teclado y actúa en consecuencia.
<br />
<br />
TesteaTeclado
<br />
movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada.
<br />
xorlw TECLA_RELE_1_ON ; ¿Es la tecla del movimiento hacia adelante?
<br />
btfsc STATUS,Z
<br />
goto R1_ON ; Sí, se desea movimiento hacia adelante.
<br />
;
<br />
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
<br />
xorlw TECLA_RELE_1_OFF ; ¿Es la tecla del movimiento hacia atrás?
<br />
btfsc STATUS,Z
<br />
goto R1_OFF ; Sí, se desea movimiento hacia atrás.
<br />
;
<br />
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
<br />
xorlw TECLA_RELE_2_ON ; ¿Es la tecla del movimiento hacia la izquierda?
<br />
btfsc STATUS,Z
<br />
goto R2_ON ; Sí, se desea movimiento hacia la izquierda.
<br />
;
<br />
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
<br />
xorlw TECLA_RELE_2_OFF ; ¿Es tecla del movimiento hacia la derecha?
<br />
btfsc STATUS,Z
<br />
goto R2_OFF ; Sí, se desea movimiento hacia la derecha.
<br />
;
<br />
movf TeclaPulsada,W
<br />
xorlw TECLA_RELE_3_ON
<br />
btfsc STATUS,Z
<br />
goto R3_ON
<br />
;
<br />
movf TeclaPulsada,W
<br />
xorlw TECLA_RELE_3_OFF
<br />
btfsc STATUS,Z
<br />
goto R3_OFF
<br />
;
<br />
movf TeclaPulsada,W
<br />
xorlw TECLA_RELE_4_ON
<br />
btfsc STATUS,Z
<br />
goto R4_ON
<br />
;
<br />
movf TeclaPulsada,W
<br />
xorlw TECLA_RELE_4_OFF
<br />
btfsc STATUS,Z
<br />
goto R4_OFF
<br />
;
<br />
movf TeclaPulsada,W
<br />
xorlw TECLA_INICIO
<br />
btfsc STATUS,Z
<br />
goto Activar
<br />
;
<br />
movf TeclaPulsada,W
<br />
xorlw TECLA_INFO
<br />
btfsc STATUS,Z
<br />
goto Info
<br />
;
<br />
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
<br />
xorlw TECLA_PARADA ; ¿Es la tecla de parada?.
<br />
btfss STATUS,Z
<br />
goto Fin ; No es ninguna tecla de movimiento. Sale.
<br />
Parado
<br />
bcf SalidaR1 ; Como se ha pulsado la tecla de parada se
<br />
bcf SalidaR2 ; desactivan todas las salidas.
<br />
bcf SalidaR3
<br />
bcf SalidaR4
<br />
movlw MensajeParado
<br />
goto Visualiza
<br />
R1_ON
<br />
bsf SalidaR1
<br />
movlw Mensaje_R1_ON
<br />
goto Visualiza
<br />
R1_OFF
<br />
bcf SalidaR1
<br />
movlw Mensaje_R1_OFF
<br />
goto Visualiza
<br />
R2_ON
<br />
bsf SalidaR2
<br />
movlw Mensaje_R2_ON
<br />
goto Visualiza
<br />
R2_OFF
<br />
bcf SalidaR2
<br />
movlw Mensaje_R2_OFF
<br />
goto Visualiza
<br />
R3_ON
<br />
bsf SalidaR3
<br />
movlw Mensaje_R3_ON
<br />
goto Visualiza
<br />
R3_OFF
<br />
bcf SalidaR3
<br />
movlw Mensaje_R3_OFF
<br />
goto Visualiza
<br />
R4_ON
<br />
bsf SalidaR4
<br />
movlw Mensaje_R4_ON
<br />
goto Visualiza
<br />
R4_OFF
<br />
bcf SalidaR4
<br />
movlw Mensaje_R4_OFF
<br />
goto Visualiza
<br />
Activar
<br />
bsf SalidaR1 ; Como se ha pulsado la tecla de parada se
<br />
bsf SalidaR2 ; desactivan todas las salidas.
<br />
bsf SalidaR3
<br />
bsf SalidaR4
<br />
movlw Mensaje_Activar
<br />
goto Visualiza
<br />
Info
<br />
movlw Mensaje_Info
<br />
<br />
; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
<br />
; el monitor del ordenador.
<br />
<br />
Visualiza
<br />
movwf MensajeApuntado ; Guarda la posición del mensaje.
<br />
call LCD_Borra ; Borra la pantalla del modulo LCD.
<br />
movf MensajeApuntado,W ; Visualiza el mensaje en la pantalla
<br />
call LCD_Mensaje ; del visualizador LCD.
<br />
call RS232_LineasBlanco ; Borra la pantalla del ordenador.
<br />
movf MensajeApuntado,W
<br />
call RS232_Mensaje ; Lo visualiza en el HyperTerminal.
<br />
call RS232_LineasBlanco
<br />
Fin return
<br />
<br />
include <RS232.INC>
<br />
include <RS232MEN.INC>
<br />
include <LCD_4BIT.INC>
<br />
include <LCD_MENS.INC>
<br />
include <RETARDOS.INC>
<br />
include <EEPROM.INC>
<br />
<br />