Interruptor de interfaz y LED

-1

Estoy tratando de escribir un programa en el que estoy interconectando un interruptor y un LED. Quiero un programa para que cuando presione el interruptor, se encienda el LED y cuando vuelva a presionar, el LED se apague. Ahora mismo he creado un programa en el que cuando presiono el interruptor, el LED se enciende y luego se apaga.

void main()
{
    DDRA=0x01;  // Interfacing LED at PORTA.0
    DDRB=0xFE; // Interfacing Switch at PORTB.0
    PORTB=0xFF;

    while(1)
    {
        if(PINB==0xFE)
        {
            PORTA=0x01;
        }
        else
        {
            PORTA=0x00;
        }
    }
}
    
pregunta anna carolina

1 respuesta

2

Supongo que estás tratando con un botón y no con un interruptor. Por lo tanto, Pin0 en PORTB (PB0) permanece BAJO mientras presiona el botón, se cumple el if statement y se encenderá su LED. Pero una vez que sueltes el botón, PB0 volverá a ALTO y se ejecutará else branch , por lo que tu LED se apagará inmediatamente.

Necesita una variable adicional, que cambia solo en el botón empuja y permanece sin cambios en el botón versiones . Entonces puedes controlar el LED con esta variable.

Ejemplo:

void main()
{
    DDRA |= (1<<PA0);               // Set first PIN on PORTA as output (LED)
    DDRB &= ~(1<<PB0);              // Set first PIN on PORTB as input  (BUTTON)

    uint8_t status = 0;

    while(1)
    {
        if(!(PINB & (1<<PB0)))      // check if first PIN on PORTB is not HIGH, button pushed
        {
            status = !status;     
        }

        if(status)
        {
            PORTA |= (1<<PA0);    // Set first PIN on PORTA
        }
        else
        {
            PORTA &= ~(1<<PA0);   // Clear first PIN on PORTA
        }
    }
}

Además, eche un vistazo a este pregunta sobre operaciones de bits. Muy útil cuando desea cambiar solo un bit en un puerto y dejar el resto sin cambios.

Una idea más simple es alternar el pin del controlador LED en las pulsaciones de los botones. Para hacerlo, el operador XOR: ^ podría usarse de la siguiente manera PORTA ^= (1<<PA0) . Esto significa que XOR 1 (ALTO) con el valor actual del PIN.

  • Si el LED está encendido, el valor actual del PIN es 1 (ALTO), lo que XOR con otro 1 . El resultado será 1 XOR 1 = 0 , por lo que el LED se apagará.
  • Ahora, cuando el LED está apagado, el valor actual del PIN es 0 (LOW), el cual XOR con 1 otra vez. El resultado será 0 XOR 1 = 1 , por lo que el LED se encenderá.

Ejemplo:

void main()
{
    DDRA |= (1<<PA0);               // Set first PIN on PORTA as output (LED)
    DDRB &= ~(1<<PB0);              // Set first PIN on PORTB as input  (BUTTON)

    while(1)
    {
        if(!(PINB & (1<<PB0)))      // check if first PIN on PORTB is not HIGH, button pushed
        {
            PORTA ^= (1<<PA0);     
        }
    }
}
    
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas