Encender LED's con PIC en C

Buen día. Quiero encender dos LEDs con el mismo botón pero cada LED está en un puerto diferente.
El PIC es el 16F877A y el lenguje es C, uso PIC C Compiler.


Esta es la parte del código que me falla, todo lo demás está bien.
PHP:
if(input(pin_a2)==1) {
   output_low(pin_d0);      //led verde
   delay_ms(200);
   output_low(pin_c0);       // led rojo
   delay_ms(200);

 if (input(pin_a2)==1)
     output_high(pin_d0);   //led verde
     delay_ms(200);
     output_high(pin_c0);  //led rojo
     delay_ms(200); }
    
  }
}

Los problemas que se presentan al simularlo en isis y en la vida real, son:

1) cuando oprimo el botón (pin_a2) ==1 se apagan los dos leds, el verde y el rojo pero el rojo se enciende de nuevo; cuando vuelvo a presionarlo el botón (pin_a2)== 1 debo hacerlo varias veces para que el led verde se prenda
El rojo si, con cada pulso apaga y enciende al momento.

En pocas palabras y espero no confundirlos, deseo que ambos se apaguen y prendan a la vez.
 
Prueba con esto y me comentas:

Código:
int1 flag; 						//Bandera
while (true) 						//Hacer siempre
{
	if(input(pin_a2)) 				//Si pin_a2 es presionado...
	{
		output_high(pin_c0);			//Encender pin_c0 
		output_high(pin_d0);			//Encender pin_d0
		flag=1;					//Bandera es 1
		while(flag==1)				//Hacer mientras bandera sea 1
		{
			if(input(pin_a2))		//Si pin_a2 es presionado...
			{
				output_low(pin_c0);	//Apagar pin_c0
				output_low(pin_d0);	//Apagar pin_d0
				flag=0;			//Bandera es 0, para que vuelva a empezar todo
			}
		}
	}
}
 
yo creo que lo que buscas es algo parecido a esto
Código:
void main(void)
  {
output_low(pin_C0); // Pones a 0 la salida C0
output_low(pin_D0); // Pones a 0 la salida D0
 
while(true) // Bucle infinito
     {
 
   if(input(pin_A2))
     {
   delay_ms(250); 
  output_toggle(pin_C0);
  output_toggle(pin_D0);
    }
   }
 }
Cada vez que pulses cambiaran las salidas
 
Está bien así como el código de miglo, pero falta poner un bucle de retención.
De otra forma, siempre estarán cambiando de estado los pines mientras se mantenga RA2 en 1

Poner: while(input(pin_a2)); antes de salir del bloque "if"
Esto simplificaría el código de yorsk2004 evitando la bandera.
 
D@rkbytes disculpael código que sibiste hecho en C como lo prías para Microcode Studio ?.... me podrias ayudar? .... esque necesito hacer un Tres en línea con el Pic16F887 o 16F877A pero para eso necesito enviar datos fijos con pulsadores...Gracias... Feliz tarde
 

Adjuntos

  • 16F84A Toggle.rar
    20.9 KB · Visitas: 20
¿Por qué el LED no se apaga al oprimir el pulsador por tercera vez?
C:
#include <xc.h>
#define _XTAL_FREQ 4000000
#define LED RB4
#define PULSADOR RA1


void main(void) {
    TRISA=0b11111111;
    TRISB=0b00000000;
    PORTB=0;
    
    int x=0;

    while(1){
        if(PULSADOR==1&&x<3){
            x++;
            __delay_ms(500);
        }

        if(PULSADOR==1&&x==3){
            x=0;
            __delay_ms(500);
        }

        switch (x){
            case 0:
                LED=0;
                break;
            case 1:
                LED=1;
                break;
            case 2:
                LED=1;
                __delay_ms(500);
                LED=0;
                __delay_ms(500);
                break;
        }
    }
    return;
}
Me ayudarían mucho respondiéndome, apenas soy nuevo en esto. Gracias.
 
Hola. Espero me puedan ayudar con este problema.
Debería encender un LED cuando se activa un botón, y si se activan ambos botones, se deberían mantener encendidos ambos LED.
El inconveniente es que cuando dejo activados ambos botones, los LED empiezan a encender de manera intercalada.
El código para el PIC16F877A es el siguiente:
C:
#include <htc.h>
#define _XTAL_FREQ 8000000

void main()
{
TRISB = 0X00;
TRISA = 0X00;
TRISE = 0X00;
TRISC = 0XFF;
RA0 = 0;
RE0 = 0;

while(RC1 == 0)
{
RA0 = 1;
__delay_ms(90);
}

while(RC3 == 0)
{
RA2 = 1;
__delay_ms(90);
}
}
Los TRISB y TRISE que están definidos arriba, son para otra parte del código con el que no tengo problema.
 
Hola, digamos que tu código no sería el más eficiente que digamos.
Para empezar, si utilizas más de un WHILE, el programa sólo estará atendiendo a todo lo que ocurre dentro de ese bucle(según la condición), pero NO puede hacer nada de lo que hay fuera.
Debes utilizar un sólo WHILE, y dentro del mismo genera todas las condiciones para tu requerimiento.
 
Última edición:
En lugar de
Código:
while(RC1 == 0)
{
RA0 = 1;
__delay_ms(90);
}
Usa
C:
while(1) //Loop principal de programa después de configurar
{
    if(entrada== 0)
    {
        salida = 1;
    } else {
        salida = 0;
    }

}
Tu código repetitivo va en el while ya que, si no, pues te vas a dar la vuelta a todo el main innecesariamente, la verificación entonces no la haces con while sino con if(si ocurre) y else (si no ocurre). Después de configurar, colocas el while y todo el código que quieras agregar de forma repetitiva debe ir ahí adentro, el delay lo puedes poner al final (dentro del while) para entonces retrasar cada ejecución del bucle.
 
Última edición:
Hola. Espero me puedan ayudar con este problema.
Debería encender un LED cuando se activa un botón, y si se activan ambos botones, se deberían mantener encendidos ambos LED.
El inconveniente es que cuando dejo activados ambos botones, los LED empiezan a encender de manera intercalada.
El código para el PIC16F877A es el siguiente:
C:
#include <htc.h>
#define _XTAL_FREQ 8000000

void main()
{
TRISB = 0X00;
TRISA = 0X00;
TRISE = 0X00;
TRISC = 0XFF;
RA0 = 0;
RE0 = 0;

while(RC1 == 0)
{
RA0 = 1;
__delay_ms(90);
}

while(RC3 == 0)
{
RA2 = 1;
__delay_ms(90);
}
}
Los TRISB y TRISE que están definidos arriba, son para otra parte del código con el que no tengo problema.
Yo me pregunto: por que no estudian programación antes de ponerse a escribir pura verdura en el código??
 
Atrás
Arriba