#define __AVR_ATmega2560__
#define F_CPU 16000000UL
#include <stdint.h>
#include <avr/io.h>
/* Um dip switch com 8 chaves tem as entradas 1, 2 e 3 conectadas
as portas PB2 (terminal 51) e PB1 (terminal 52) e PB0 (terminal 53) da placa de
desenvolvimento ATmega 2560, respectivamente. Considere as chaves ideais. Um
LED L em PB7 (terminal 13) deve acender se PB2 e PB1 estiverem ligadas e apagar
se PB1 e PB0 estiverem ligadas. O LED não deve mudar de estado para outras
combinações das chaves*/
#define led_pin PB7
#define botao1 PB2
#define botao2 PB1
#define botao3 PB0
int main(void) {
// Configura o pino do LED como saída e inicializa desligado
DDRB |= (1 << led_pin); // Configura PB7 como saída
PORTB &= ~(1 << led_pin); // Inicialmente, LED apagado
// Configura os botões como entrada com pull-up ativado
DDRB &= ~(1 << botao1); // Configura PB2 como entrada
DDRB &= ~(1 << botao2); // Configura PB1 como entrada
DDRB &= ~(1 << botao3); // Configura PB0 como entrada
//adicionamos pull-up a essas portas
PORTB = PORTB | (1 << PORTB0);
PORTB = PORTB | (1 << PORTB1);
PORTB = PORTB | (1 << PORTB2);
int b1, b2, b3;
while (1) {
// Leitura dos botões (0 significa que o botão está pressionado)
b1 = !(PINB & (1 << botao1));
b2 = !(PINB & (1 << botao2));
b3 = !(PINB & (1 << botao3));
// Condição para ligar o LED: PB2 e PB1 pressionados
if (b1 && b2) {
PORTB |= (1 << led_pin); // Liga o LED
}
// Condição para desligar o LED: PB1 e PB0 pressionados
if (b2 && b3) {
PORTB &= ~(1 << led_pin); // Desliga o LED
}
}
return 0;
}