#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h" // Inclui o cabeçalho USART para as funções de comunicação
int main(void) {
// Configuração do dip switch como entrada
DDRB &= ~((1 << PB0) | (1 << PB1) | (1 << PB2)); // Configura PB0, PB1 e PB2 como entradas
PORTB |= (1 << PB0) | (1 << PB1) | (1 << PB2); // Habilita resistores de pull-up internos
// Configuração do LED como saída
DDRB |= (1 << PB7); // Configura PB7 como saída para o LED
// Configuração da USART
USART0_configura(); // Configura a USART0 com taxa de 57600 BAUD
uint8_t led_state = 0; // Estado atual do LED
uint8_t previous_led_state = 0; // Estado anterior do LED para detecção de mudança
while (1) {
// Leitura das entradas do dip switch
uint8_t pb0 = PINB & (1 << PB0);
uint8_t pb1 = PINB & (1 << PB1);
uint8_t pb2 = PINB & (1 << PB2);
// Verificação da condição para acender o LED:
// O LED acende apenas se exatamente uma das entradas estiver em nível baixo (0)
if ((!pb0 && pb1 && pb2) || (pb0 && !pb1 && pb2) || (pb0 && pb1 && !pb2)) {
PORTB |= (1 << PB7); // Acende o LED
led_state = 1;
} else {
PORTB &= ~(1 << PB7); // Apaga o LED
led_state = 0;
}
// Se o estado do LED mudou, envia o novo estado pela USART
if (led_state != previous_led_state) {
if (led_state) {
USART0_transmite_string_RAM("LED ON\n"); // Transmite "LED ON" se o LED acender
} else {
USART0_transmite_string_RAM("LED OFF\n"); // Transmite "LED OFF" se o LED apagar
}
previous_led_state = led_state; // Atualiza o estado anterior
}
}
return 0;
}