// Tiago Pitol Mroginski 202020163
/* 1. (3,0 pontos, 30 min.) 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. Um LED L conectado à porta
PB7 deve acender somente se uma, e somente uma, das entradas (PB2, PB1 e PB0)
estiver em nível lógico 0.*/
#define __AVR_ATmega2560__
#define F_CPU 16000000UL
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
// Função para configurar os pinos de entrada e saída
void configura_pinos()
{
DDRB &= ~(1 << DDB2); // Configura PB2 como entrada
PORTB |= (1 << PORTB2); // ativa pull-up
DDRB &= ~(1 << DDB1); // Configura PB1 como entrada
PORTB |= (1 << PORTB1); // ativa pull-up
DDRB &= ~(1 << DDB0); // Configura PB0 como entrada
PORTB |= (1 << PORTB0); // ativa pull-up
DDRB |= (1 << DDB7); // Configura PB7 como saída para controle do LED
PORTB &= ~(1 << PORTB7); // Inicialmente, o LED está desligado
}
int main()
{
configura_pinos();
while (1)
{
// Lê o valor dos pinos PB2, PB1 e PB0
uint8_t pb2 = !(PINB & (1 << PINB2)); // Inverte o valor para 1 se PB2 for 0 (botão pressionado)
uint8_t pb1 = !(PINB & (1 << PINB1)); // Inverte o valor para 1 se PB1 for 0
uint8_t pb0 = !(PINB & (1 << PINB0)); // Inverte o valor para 1 se PB0 for 0
// Soma o número de entradas que estão em nível lógico 0
uint8_t num_de_zeros = pb2 + pb1 + pb0;
// Acende o LED se uma, e apenas uma, das entradas estiver em nível lógico 0
if (num_de_zeros == 2) {
PORTB |= (1 << PORTB7); // Liga o LED
} else {
PORTB &= ~(1 << PORTB7); // Desliga o LED
}
_delay_ms(100); // Pequeno delay para evitar erros
}
return 0;
}