Below is the file 'button.c' from this revision. You can also download the file.

/* button.c */

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

uint8_t bounce_timer;
uint8_t button;

#define BOUNCE_TIMER_RESET 10

void button_init(void)
{
    bounce_timer = 0;
    button = 0;
}

ISR(TIMER2_vect)
{
    uint8_t port = PORTD;
    uint8_t old_button;
    port = (~port >> 4);
    if (bounce_timer)
	bounce_timer--;
    else
	if (port)
	    button = 1 + ctz(port);
	else
	    button = 0;

    if (button != old_button)
	bounce_timer = BOUNCE_TIMER_RESET;
}