#include <avr/io.h>
#include <avr/interrupt.h>

#define LED_BUILTIN PB5

volatile unsigned long millis_count = 0;

const long interval = 1000;

unsigned long previousMillis = 0;

// Configurando o Timer0 como contador de tempo
void millis_init()
{
    // Configurando o prescaler como 64
    TCCR0B |= (1 << CS01) | (1 << CS00);

    // Habilitando a interrupção de comparação
    TIMSK0 |= (1 << OCIE0A);

    // Configurando a contagem de comparação para contar em milissegundos
    OCR0A = 249;

    // Habilitando as interrupções
    sei();
}

// Interrupção de comparação
ISR(TIMER0_COMPA_vect)
{
    millis_count++;
}

unsigned long millis()
{
    return millis_count;
}

int main()
{
    // Configurando o pino do LED como saída
    DDRB |= (1 << LED_BUILTIN);

    // Define o nível lógico da porta como baixo (0)
    PORTB &= ~(1 << LED_BUILTIN);

    millis_init();

    // while (1) {
    //     unsigned long currentMillis = millis();

    //     if (currentMillis - previousMillis >= interval) {
    //         // Alternando o estado do pino do LED
    //         PORTB ^= (1 << LED_BUILTIN);
    //         previousMillis = currentMillis;
    //     }
    // }

    while (1) {
        // Alternando o estado do pino do LED de acordo com o resultado da expressão
        PORTB = (((millis() / interval) % 2) == 0) ? 
            PORTB & ~(1 << LED_BUILTIN) : PORTB | (1 << LED_BUILTIN);
    }

    return 0;
}