; DESARROLLO DE UN PLC BASADO EN EL MICROCONTROLADOR PIC16F84A.
; PROGRAMA DE ENTRENAMIENTO NO. 1: DEFINICION DE UNA FUNCION LOGICA.

; El procedimiento lógico de este programa nos permite establecer
; el funcionamiento de una estación de botones. Una seńal activa una
; salida y otra seńal la apaga.

; Historia del programa:

; Noviembre 6, 1999: versión inicial para procesador PIC16C84
;                    realizada a partir de la versión equivalente
;                    para PLCZ80.
; Septiembre 12, 2013: procesador cambiado a PIC16F84A.

	PROCESSOR 16F84A
	#INCLUDE <P16F84A.INC>
	__CONFIG  _RC_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

; Parámetros.

PACFG	EQU 01FH		; Set PORTA<4:0>=inputs.
PBCFG	EQU 0H			; Set PORTB<7:0>=outputs.

MKON	EQU 01H			; Bit para activar PB<0>.
MKOFF	EQU 02H			; Bit para activar PB<0>.

; Programa.
; Nota: Al inicializarse el PIC PB ya está configurado como salidas.
;       Lo reprogramamos porque podemos configurarlo de cualquier
;       manera que queramos vía PBCFG y nos interesa ir creando el
;       hábito.

	ORG 0
	GOTO INIT

INIT	BSF STATUS, RP0		; Cambie a BANK-1.
	MOVLW PACFG		; Programe PA.
	MOVWF TRISA
	MOVLW PBCFG		; Programe PB.
	MOVWF TRISB
	BCF STATUS, RP0		; Cambie a BANK-0.

; Aqui leemos las entradas.

ENTRADA	MOVF PORTA, W		; Lea el puerto A.
	ANDLW MKON+MKOFF	; Enmascare todo menos MKON y MKOFF.
	BTFSC STATUS, Z		; Si todo es cero siga leyendo.
	GOTO ENTRADA

; Proceso lógico.

	ANDLW MKON		; Enmascare MKOFF.
	BTFSC STATUS, Z		; Si el resultado es cero entonces
	GOTO OFFMK		; MKOFF era válido. Vaya a apagar.
	GOTO ONMK		; MKON es válido. Vaya a encender.

; Este es el control de las salidas.
; Nota: en OFFMK utilizamos MOVLW con MOVWF en lugar de CLRF PORTB
;       para irnos preparando para la implementación del PLC.

ONMK	MOVLW 01H		; Active PB<0>.
	MOVWF PORTB
	GOTO ENTRADA		; Vaya a repetir ciclo.

OFFMK	MOVLW 0H		; Apague PB<0>.
	MOVWF PORTB
	GOTO ENTRADA		; Vaya a repetir ciclo.

	END
