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);
}
}
}