# Encender y apagar un led con pulsador en ccs



## johanfer12 (Dic 9, 2011)

buenas tardes:

Estoy empezando a estudiar programacion de pics en c y decidi hacer un sencillo programa para empezar, encender y apagar un led con un pulsador, lo simulo en proteus y efectivamende el led enciende pero al soltar el switch el led se queda encendido y no se apaga, aca esta el codigo por si alguien me puede por favor decir si ve algun error o alguna sugerencia 


```
#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#use delay(clock=4000000)
#use fast_io(A)
#define LED pin_b2
void main()
{
set_tris_a(0b11111111);
set_tris_b(0b00000000);
while(true){
if(input(pin_a1)==0)
  output_low(LED);
if(input(pin_a1)==1)
  output_high(LED);
}
}
```


----------



## gcgiron (Dic 9, 2011)

```
#include <16F877A.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 )   // Reloj  de 4 MHz
#BYTE TRISB = 0x86            // TRISB en 86h.
#BYTE PORTB = 0x06            // PORTB en 06h.
#BYTE OPTION_REG = 0x81      //OPTION_REG en 81h.
void main() {
   bit_clear(OPTION_REG,7);      // Habilitación Pull-up
   bit_set(TRISB,0);            //B0 como entrada
   bit_clear(TRISB,1);         // B1 como salida
   bit_clear(PORTB,1);         // apaga LED
   while (1) {
   if (bit_test(portb,0) == 1 )  //Si RB0 es 1 apaga el LED
      bit_clear(portb,1);                        
   else
      bit_set(portb,1);         //Si RB0=0 enciende el LED
   }
}
```
 
Revisa este código.





johanfer12 dijo:


> buenas tardes:
> 
> Estoy empezando a estudiar programacion de pics en c y decidi hacer un sencillo programa para empezar, encender y apagar un led con un pulsador, lo simulo en proteus y efectivamende el led enciende pero al soltar el switch el led se queda encendido y no se apaga, aca esta el codigo por si alguien me puede por favor decir si ve algun error o alguna sugerencia
> 
> ...


 
Lo simule en Proteus y esta bien, el LED esta conectado a RB2 y el pulsador esta conectado a RA1, dejas arriba el pulsador a VDC y abajo la resistencia de 10KΩ a tierra.

Saludos.


----------



## johanfer12 (Dic 10, 2011)

Si, el error estaba en mi montaje en proteus, muchas gracias por la ayuda


----------



## gcgiron (Dic 10, 2011)

johanfer12 dijo:


> Si, el error estaba en mi montaje en proteus, muchas gracias por la ayuda


 
Para eso estamos para servirnos y ayudarnos mutuamente.


----------



## marcon (Sep 2, 2012)

una pregunta y si quisiera agregarle un retardo para q*ue* después de encendido dure unos 3 seg así ?¿?¿


----------



## electroconico (Sep 2, 2012)

usa delay_ms(3000);

el valor es equivalente a milisegundos!


----------



## marcon (Sep 5, 2012)

gracias por la respuesta me fue muy util


----------



## ilcapo (Abr 17, 2014)

hola gente del foro tengo un problemita en CCS, el programa tendria que apagar y prender un led con un pulsador pero no me funciona y no encuentro el porque, aca se los dejo haber si alguien encuentra el error, gracias 

#include <16f88.h>              
#FUSES   XT,NOWDT
#USE delay (clock =4000000)    //frecuencia del cristal 4 Mhz 
#USE standard_io(A)            
#USE standard_io(B)           
#BYTE PORTA = 0x05      
#BYTE PORTB = 0x06            

void main()                        
 {   

     while(TRUE)                       
     { if (bit_test(PORTA,0)==1)      //testeo la entrada RA0 pulsador
        bit_set(PORTB,0);         // enciendo el led en RB0 
      else
        bit_clear(PORTB,0);         // apago el led en RB0 
     }

 }


----------



## Gudino Roberto duberlin (Abr 17, 2014)

Hola Amigo, bueno, simplemente el PIC no  funciona o tiene funcionamiento errático?
Los fuses están correctos?. Recuerda que el pin MCLR, debe estar en alto para que funcione. Los condensadores que acompañan al Xtal, son correctos en valor?


----------



## ByAxel (Abr 17, 2014)

ilcapo dijo:


> hola gente del foro tengo un problemita en CCS, el programa tendria que apagar y prender un led con un pulsador pero no me funciona y no encuentro el porque, aca se los dejo haber si alguien encuentra el error, gracias
> 
> #USE standard_io(A)
> #USE standard_io(B)
> ...


Si bien es cierto que el CCS configura varias cosas automáticamente, como desactivar el ADC y hacer toos digitales (según el caso) y otros... no configura los registros TRISx de los puertos cuando se accede directamente por medio del registro PORTx declarados con #byte.... asi que falta: set_tris_a(1); y set_tris_b(0);.

Saludos


----------



## ilcapo (Abr 17, 2014)

gracias por las respuestas,,, bueno faltaba lo que dijo  By Axel con eso ya solucione el problema,,,  mi error fue pensar que usando  STANDARD_IO  los TRIS se configuraban automaticamente, mejor no usar nada y configurar todo  ja


----------



## papirrin (Abr 17, 2014)

if (bit_test(PORTA,0)==1) //testeo la entrada RA0 pulsador
{output_toggle(pin_b0); //cambia estado de led
delay_ms(200);//antirrebote}


y declara el tris XD


----------



## D@rkbytes (Abr 17, 2014)

papirrin dijo:


> if (bit_test(PORTA,0)==1) //testeo la entrada RA0 pulsador
> {output_toggle(pin_b0); //cambia estado de led
> delay_ms(200);//antirrebote}
> 
> ...


Mejor así:

```
#include <16f88.h>
#fuses   nobrownout
#use     delay (internal = 4MHz)

void main (void)
{
   output_low (pin_b0);
   
   while (true)
   {
      while (!input (pin_a0))
      {
         output_toggle (pin_b0);
         
      while (!input (pin_a0));
      }
   }
}
```
Fuses necesarios para trabajar con el oscilador interno a 4MHz.
No se declara TRIS ni ANSEL y funciona sin usar un retardo antirrebote.

Así como dices se repetirá el ciclo cada 200Ms mientras se mantenga RA0 en 1
Aquí se usa una pull-up y solo existe un ciclo aunque RA0 se mantenga en 1.

Lo interesante sería hacer una función como Button en PICBasic. 

Saludos.


----------



## papirrin (Abr 17, 2014)

si conozco la tecnica que mencionas,muy efectiva, puse el delay porque es lo mas "comun", 
y si estaria interesante hacer una funcion(libreria) igual al button


----------



## flpVL (Oct 16, 2014)

Hola! Primer post! a ver si tengo suerte y me pueden echar una mano.
Estoy trabajando en un proyecto en base a programación en PIC y la verdad no me manejo mucho... y en la primera parte debo hacer lo siguiente:
Mediante 6 botones de activación momentánea en el puerto A, debo activar una serie de 6 LEDs a la salida en el puerto B.
La idea es que al activar el boton 1, se encienda el LED1
Si Activo el botón 2, se desactiva el LED 1 y se activa el LED 2
Si Activo cualquier otro botón.. por ejemplo el 5, se desactiva el Led encendido anteriormente y se activa el LED 5.
Este es el código que estoy usando


```
#include <16f877A.h>
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)

void main(){
int SwitchA, SwitchB, SwitchC,SwitchD,SwitchE,SwitchF,a,b,c,d,e,f;
a=0;
b=0;
c=0;
d=0;
e=0;
f=0;
SwitchA=input(PIN_A0);
SwitchB=input(PIN_A1);
SwitchC=input(PIN_A2);
SwitchD=input(PIN_A3);
SwitchE=input(PIN_A4);
SwitchF=input(PIN_A5);
for(;;){

if (SwitchA==1){
a=1;
b=0;
c=0;
d=0;
e=0;
f=0;
while(a){
output_high(PIN_B0)&&output_low(PIN_B1)&&output_low(PIN_B2)&&output_low(PIN_B3)&&output_low(PIN_B4)&&output_low(PIN_B5);
}
}
if (SwitchB==1){
a=0;
b=1;
c=0;
d=0;
e=0;
f=0;
while(b){
output_high(PIN_B1)&&output_low(PIN_B0)&&output_low(PIN_B2)&&output_low(PIN_B3)&&output_low(PIN_B4)&&output_low(PIN_B5);
}
}
if (SwitchC==1){
a=0;
b=0;
c=1;
d=0;
e=0;
f=0;
while(c){
output_high(PIN_B2)&&output_low(PIN_B0)&&output_low(PIN_B1)&&output_low(PIN_B3)&&output_low(PIN_B4)&&output_low(PIN_B5);
}
}
if (SwitchD==1){
a=0;
b=0;
c=0;
d=1;
e=0;
f=0;
while(d){
output_high(PIN_B3)&&output_low(PIN_B0)&&output_low(PIN_B1)&&output_low(PIN_B2)&&output_low(PIN_B4)&&output_low(PIN_B5);
}
}
if (SwitchE==1){
a=0;
b=0;
c=0;
d=0;
e=1;
f=0;
while(e){
output_high(PIN_B4)&&output_low(PIN_B0)&&output_low(PIN_B1)&&output_low(PIN_B2)&&output_low(PIN_B3)&&output_low(PIN_B5);
}
}
if (SwitchF==1){
a=0;
b=0;
c=0;
d=0;
e=0;
f=1;
while(f){
output_high(PIN_B5)&&output_low(PIN_B1)&&output_low(PIN_B2)&&output_low(PIN_B3)&&output_low(PIN_B4)&&output_low(PIN_B0);
}
}
}
}
```
cuando echo a correr el simulador debo dejar presionado el boton... darle al MCLR y enciende el LEd.... pero no es la idea..
lo hice con if-else... pero no logro dejar enclavada la luz... Cualquier ayuda bienvenida!
saludos


----------



## TRILO-BYTE (Oct 16, 2014)

te estas complicando la vida

tan facil que es puerto A = B
no?

usa el index del CCS y veras que dice lo siguiente del input

*data = input_b();*

y tenemos de la salida

*output_b (value);*

entonces hacemos esto

while(1);
{
output_b (input_a());

//retardo de unos cuantos mili segundos
delay_ms(100);
}


----------



## manuleaniz (Ago 8, 2016)

Buenas tardes,soy nuevo en esto de programar pic y tengo un gran problema en un programa. Que se donde está pero no logro resolverlo.
Yo necesito que apretando un pulsador se prenda un led(lo mismo con dos leds distintos) y presionando de vuelta se apague.
Hasta ahi todo bien, pero cuando le agrego un pulsador más, hace una secuencia y se prende el primero, luego el segundo y para apagar el primero tiene que estar prendido el segundo led. 

Adjunto el programa en CCS y simulación en proteus.

Agradeceria cualquier recomendación. ...


----------



## roberttorres (Ago 8, 2016)

manuleaniz dijo:


> Buenas tardes,soy nuevo en esto de programar pic y tengo un gran problema en un programa. Que se donde está pero no logro resolverlo.
> Yo necesito que apretando un pulsador se prenda un led(lo mismo con dos leds distintos) y presionando de vuelta se apague.
> Hasta ahi todo bien, pero cuando le agrego un pulsador más, hace una secuencia y se prende el primero, luego el segundo y para apagar el primero tiene que estar prendido el segundo led.
> 
> ...



Buenas
EL error que veo es en tu simulación, no estas poniendo las resistencias Pull_up a tus botones, tambien es innecesario leer los pines del puerto B.
Prueba con este codigo:

```
#include <16f628a.h>
#fuses XT                                    
#fuses PUT                                 
#fuses BROWNOUT                  
#use standard_io(a)
#use delay(clock=4000000)   

void main()
{
set_tris_a(1111);
set_tris_b(00000000);
output_b(0x00);

while (true){ 

if(input(pin_A0)==0){ //presionando boton//  
output_toggle(pin_b0);
while(input(pin_A0)==0);}


if(input(pin_A1)==0){//presionando boton//
output_toggle(pin_b1);
while(input(pin_A1)==0);} 

}
}
```


----------



## manuleaniz (Ago 8, 2016)

Hola roberttorres, gracias por responder, me hace exactamente la misma secuencia


----------



## roberttorres (Ago 8, 2016)

manuleaniz dijo:


> Hola roberttorres, gracias por responder, me hace exactamente la misma secuencia



Eso pasa porque no estas poniendo la resistencia Pull_up en tu simulación:


----------



## manuleaniz (Ago 8, 2016)

Pensé que era un problema de soft robert, muchas gracias!


----------

