// prova 2024/1 q1
#define __AVR_ATmega2560__ // Define o microcontrolador utilizado como ATmega2560
#define F_CPU 16000000UL // Define a frequência do clock do sistema como 16 MHz
#include <stdint.h> // Inclui a biblioteca para definições de tipos de dados padrão
#include <avr/io.h> // Inclui a biblioteca para manipulação de registradores de I/O do AVR
// Função para configurar os pinos do microcontrolador
void configura_pinos()
{
// Configura PB2 como entrada e ativa o resistor de pull-up
DDRB &= ~(1 << DDB2); // Limpa o bit DDB2 no registrador DDRB, configurando PB2 como entrada
PORTB |= (1 << PORTB2); // Define o bit PORTB2 em PORTB, ativando o resistor de pull-up para PB2
// Configura PB1 como entrada e ativa o resistor de pull-up
DDRB &= ~(1 << DDB1); // Limpa o bit DDB1 no registrador DDRB, configurando PB1 como entrada
PORTB |= (1 << PORTB1); // Define o bit PORTB1 em PORTB, ativando o resistor de pull-up para PB1
// Configura PB0 como entrada e ativa o resistor de pull-up
DDRB &= ~(1 << DDB0); // Limpa o bit DDB0 no registrador DDRB, configurando PB0 como entrada
PORTB |= (1 << PORTB0); // Define o bit PORTB0 em PORTB, ativando o resistor de pull-up para PB0
// Configura PB7 como saída e define seu estado inicial como desligado
DDRB |= (1 << DDB7); // Define o bit DDB7 no registrador DDRB, configurando PB7 como saída
PORTB &= ~(1 << PORTB7); // Limpa o bit PORTB7 em PORTB, garantindo que o LED (conectado a PB7) comece desligado
}
// Função principal
int main()
{
configura_pinos(); // Chama a função de configuração dos pinos
while (1) // Loop infinito
{
// Lê o estado dos switches conectados aos pinos PB0, PB1 e PB2
uint8_t chave_0 = PINB & (1 << PINB0); // Lê o estado de PB0 e armazena em chave_0 (0 se chave fechada)
uint8_t chave_1 = PINB & (1 << PINB1); // Lê o estado de PB1 e armazena em chave_1 (0 se chave fechada)
uint8_t chave_2 = PINB & (1 << PINB2); // Lê o estado de PB2 e armazena em chave_2 (0 se chave fechada)
// Verifica o estado dos switches para controle do LED
// Se PB1 e PB0 estiverem ambas ligadas (fechadas), apaga o LED
if (!chave_1 && !chave_0)
{
PORTB &= ~(1 << PORTB7); // Limpa o bit PORTB7, apagando o LED
}
if (!chave_2 && !chave_0)
{
PORTB &= ~(1 << PORTB7); // Limpa o bit PORTB7, apagando o LED
}
// Senão, se PB2 e PB1 estiverem ambas ligadas (fechadas), acende o LED
else if (!chave_2 && !chave_1)
{
PORTB |= (1 << PORTB7); // Define o bit PORTB7, acendendo o LED
}
// Outras combinações de switches não alteram o estado do LED
}
return 0; // Código nunca atinge esta linha, pois o loop é infinito
}