Encender y apagar un LED con un solo pulsador

Buenas tardes:

Estoy intentando encender y apagar un LED con sólo pulsador, pero la verdad es que no entiendo porqué no funciona.

El estado del LED encendido lo marco en el byte FLAG_Set en su bit nº 1.

Si está a 1 está ON, si está a 0 está OFF.

Pero no se queda.

A ver si alguien me puede echar una mano.

Un saludo.

Adjunto fichero *.DSN para Proteus, y asm.

Código:
; *************************************************
; Botón que enciende un LED
; 
; *************************************************

	LIST		P=16F84A	; Le decimos el tipo de procesador a utilizar
	INCLUDE		<P16F84A.INC>	; Include del pic16f84A

	; Configuramos proteccion de codigo a off, perro guardian a off, power reset a on, y cristal on.
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

;-----------------------------
; Registros donde guardar datos.
; Comienzan a guardarse en la posición 0x0C, la primera de la RAM disponible para el usuario
;-----------------------------
	CBLOCK 0x0C
		Flag_Set; El bit 1 del este byte se pone a 1 cuando el LED está encendido y a 0 cuando está apagado.
	ENDC

#Define	BSet	PORTB,1

;-----------------------------
; Zona de codigos
;-----------------------------
	org	0
Inicio

;-------------------------------------------
;      Configuramos puertos
;-------------------------------------------
	bsf	STATUS,RP0		; Acceso al banco 1 (Para configurar los puertos)
	clrf	PORTA			; Configuramos el PORTA como salida

	bsf	BSet			; Configuramos el botón BSet como entrada
	bcf	OPTION_REG, NOT_RBPU	; Utilizamos las resistencias PULL-UP del PIC
	bcf	STATUS,RP0		; Volvemos al banco 0
	
	clrf	Flag_Set		; Ponemos a 0 todos los bits del byte Flag_Set
	
;---------------------------------------	
Principal	
;---------------------------------------
	btfss	BSet
	call	BotonSet
	goto 	Principal

;---------------------------------------------
; Si Flag_Set está puesto a 1 lo ponemos a cero
; Si Flag_Set está puesto a 0 lo ponemos a 1
;-------------------------------------------

BotonSet
	btfss	Flag_Set,1; Si está encendido se salta la línea y lo apagamos
	call	Encender
	call	Apagar
	return
	
;----------------------------------------
Apagar
;----------------------------------------
	bcf	PORTA,1	
	bcf	Flag_Set,1
	return

;----------------------------------------
Encender
;----------------------------------------
	bsf	PORTA,1
	bsf	Flag_Set,1
	return	
	
	END
 

Adjuntos

  • prueba_led_con_un_solo_pulsador_862.zip
    15.2 KB · Visitas: 193
Hola.
Creo que el problema está aquí:
BotonSet
btfss Flag_Set,1; Si está encendido se salta la línea y lo apagamos
call Encender
call Apagar
return
Porque, sí el flat está en 0, ejecuta Call Encender, después de encender regresa a Botonset y ejecuta call Apagar, se ejecuta apagar.

Creo que ese es el problema.
Chao.
elaficionado.
 
Gracias, el aficionado,

Me has puesto sobre la pista, logicamente tenía que sacarlo
del código de botón set,

al final a quedado así:

Código:
BotonSet
	btfss	Flag_Set,1 ; Comprobamos si está encendido, si lo está salta a Apagar
	goto	Encender
Apagar
	call	TestA                ; Apago ...
	goto	PulsadorLibre ; ... y lo saco fuera
Encender
	call	TestD
PulsadorLibre	
	btfss	BSet
	goto	PulsadorLibre
	return

Un saludo.
 
Atrás
Arriba