#include <avr/io.h>
#include <util/delay.h>

#define LED PA7
#define DELAY 50
#define do_delay() _delay_ms(DELAY);

// Port definition
#define input_port PORTB
#define input_direction DDRB
#define input_pin (1 << PB2)
#define input_pins PINB

// Helpers from Neil
#define output(directions, pin) (directions |= pin) // set port direction for output
#define input(directions, pin) (directions &= (~pin)) // set port direction for input
#define set(port, pin) (port |= pin) // set port pin
#define clear(port, pin) (port &= (~pin)) // clear port pin
#define pin_test(pins, pin) (pins & pin) // test for port pin
#define bit_test(byte, bit) (byte & (1 << bit)) // test for bit set
#define bit_delay_time 102 // bit delay for 9600 with overhead
#define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay
#define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay

// Logic specific to this program
#define button_is_up() 0 != pin_test(input_pins,input_pin)
#define set_led_on() PORTA |= (1 << LED);
#define set_led_off() PORTA &= ~(1 << LED);

int main(void) {
    DDRA |= (1 << LED);
    set_up_oscillator();
    set_up_button();

    while (1) {
        while (button_is_up());
        do_delay();
        set_led_on();
        do_delay();
        set_led_off();
    }
}

void set_up_oscillator(void) {
    CLKPR = (1 << CLKPCE);
    CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
}
void set_up_button(void) {
    set(input_port, input_pin);
    input(input_direction, input_pin);
}