# Encender y apagar un LED con un solo pulsador



## thevenin (Jun 30, 2008)

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.


```
; *************************************************
; 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
```


----------



## elaficionado (Jun 30, 2008)

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.


----------



## thevenin (Jun 30, 2008)

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í:


```
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.


----------

