Cambiar de estado con un pulsador en el 16F84A

Hola:

En el código de abajo he logrado con un interruptor cambiar de estado. Me gustaría hacer lo mismo pero con un pulsador, es decir, pulso un pulsador (no botón) que pasa de estado 0 y cuando lo suelto vuelve a 1.

Los PORTB, 6 y el 7 sólo son Led para ver como actúan.

Código:
	__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC	; Configuración para el
															; grabador.
	LIST	P=16F84A			; Procesador.
	INCLUDE <P16F84A.INC>		; Definición de los operandos utilizados.

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0					; El programa comienza en la dirección 0 de memoria de
Inicio							; programa.
		bsf		STATUS,RP0			; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
		clrf	PORTB				; Las líneas del Puerto B se configuran como salidas.
		movlw	b'11111111'
		movwf	PORTA				; Las líneas del Puerto A se configuran como entradas.
		bcf		STATUS,RP0			; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
		clrf	PORTB
		clrf	PORTA

Principal
	btfss	PORTA,0				; ¿Bit 0 del PORTA es "1"?
	goto	hola
	bcf		PORTB,6
	bsf		PORTB,7
	goto	Principal
hola
	bsf		PORTB,6
	bcf		PORTB,7
	goto 	Principal			; Crea un bucle cerrado.
        End

Un cordial saludos.
 
De esta manera, cuando la entrada RA0 cambia a "1" checa si RB6 =0, entonces lo cambia a 1, si RB6 = 1 entonces lo cambia a 0.
Despues espera a que cambie la entrada RA0 a "0" para que regrese al inicio y espere otro cambio a "1".

Es necesario agregar un retardo despues de que detecta que RA0=1 para evitar rebotes.

Espero que esto sea lo que necesites.
Saludos.


Código:
       LIST   P=16F84A         ; Procesador.
       INCLUDE <P16F84A.INC>      ; Definición de los operandos utilizados.
       __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC   ; Configuración para el
                                                 ; grabador.
    ; ZONA DE CÓDIGOS ********************************************************************


       ORG    0               ; El programa comienza en la dirección 0 de memoria de
Inicio                     ; programa.
        bsf       STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
        clrf        PORTB            ; Las líneas del Puerto B se configuran como salidas.
        movlw  b'11111111'
        movwf  PORTA            ; Las líneas del Puerto A se configuran como entradas.
        bcf        STATUS,RP0         ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
        clrf        PORTB
        clrf        PORTA
        bsf	   PORTB,7		; Condición inicial RB6=0, RB7=1

Principal
	btfss     PORTA,0            ; ¿Bit 0 del PORTA es "1"?
       	goto   	 Principal	
	btfss	  PORTB,6		; ¿ Bit 6 de PORTB es "1"?
	goto	 RB6_OFF		;
RB6_ON	bcf	PORTB,6		; Si RB6=1 entonces RB6=0
	bsf	   PORTB,7		;   y RB7=1
	goto	 CONTINUA
RB6_OFF	bsf	PORTB,6		; Si RB6=0 entonces RB6=1
	bcf	   PORTB,7		; y RB7=0
CONTINUA
	btfsc	  PORTA,0		; Espera a que se libere el botón 
	goto	 CONTINUA	; para volver a empezar
       	goto     Principal         ; Crea un bucle cerrado.
       	end
 
Atrás
Arriba