So I've been asked by some folks for the code I used. It's messy and I'm a little embarrassed to show it. I barely finished on time, and I have not gone back to clean out crap I had in there. You have no idea how many times I pressed F7 to rebuild... I must have tripped over every mistake there is to make. Anyways, I used Peter Fleury's LCD library here:
http://homepage.hispeed.ch/peterfleury/avr-software.htmlHere's my code:

/*
* Test1.c
*
* Created: 8/8/2012 5:31:25 PM
* Author: Travis
*/
#ifndef F_CPU
#define F_CPU 1000000UL
#endif
#include <avr/io.h>
#include <avr/delay.h>
#include <string.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#include <avr/interrupt.h>
/*
** constant definitions
*/
static const PROGMEM unsigned char copyRightChar[] =
{
0x07, 0x08, 0x13, 0x14, 0x14, 0x13, 0x08, 0x07,
0x00, 0x10, 0x08, 0x08, 0x08, 0x08, 0x10, 0x00
};
volatile uint16_t T1Ovs0, T1Ovs2; //Counts overflows
volatile uint16_t SCapt1, SCapt2, SCapt3; //Variables holding three Scale timestamps
volatile uint16_t TCapt1, TCapt2, TCapt3; //Variables holding three Scale timestamps
volatile uint8_t SFlag, TFlag; //Counts number of captures
volatile uint16_t SPeriod1, SPeriod2, SPeriod3, SAvgPeriod; //period result holders
volatile uint16_t TPeriod1, TPeriod2, TPeriod3, TAvgPeriod; //period result holders
volatile uint8_t Flag; //capture Flag
volatile uint8_t ScaleSet, TempoSet, PtbEnableSet, ExecuteSet, ExecuteLatch;
volatile unsigned int i = 0;
volatile unsigned int j = 0;
volatile unsigned int k = 0;
volatile unsigned int choice = 1;
volatile uint32_t CountDown = 108;
int main(void)
{
char s[sizeof("4294967295")]; // ASCII space for 32 bit number
char buffer[5];
char s_str_out[sizeof("12345678")] = "S:";
char t_str_out[sizeof("12345678")] = "T:";
char c_str_out[sizeof("12345678")] = "";
// Enable Global Interrupts
sei();
DDRB = 0b1100000; // set PB0, PB1, PB2 and PB3 to input. PB4 is LCD RW
PORTB |= (1 << PORTB0); // set pull up
PORTB |= (1 << PORTB1);
PORTB |= (1 << PORTB2);
PORTB |= (1 << PORTB3);
// PB0 Scale, pin 14
// PB1 Tempo, pin15
// PB2 PtbEnable, pin 16
// PB3 Execute, pin 17
// PB4 LCDRW, pin 18
PCICR |= (1 << PCIE0); // set PCIE0 to enable PCMSK0 scan
PCMSK0 |= (1 << PCINT0); // set PCINT0 to trigger an interrupt on state change
PCMSK0 |= (1 << PCINT1); //Trigger on change of PCINT0 (PB1, Tempo)
// PCMSK0 |= _BV(PCINT3); //Trigger on change of PCINT0 (PB3, Execute)
ScaleSet = 0;
TempoSet = 0;
PtbEnableSet = 0;
ExecuteSet = 0;
ExecuteLatch = 0;
SCapt1 = 0;
SCapt2 = 0;
SCapt3 = 0;
SPeriod1 = 0;
SPeriod2 = 0;
SPeriod3 = 0;
SAvgPeriod = 0;
TFlag = 0;
TCapt1 = 0;
TCapt2 = 0;
TCapt3 = 0;
TPeriod1 = 0;
TPeriod2 = 0;
TPeriod3 = 0;
TAvgPeriod = 0;
TFlag = 0;
TCNT0 = 0;
TCNT2 = 0;
if(bit_is_set(PINB,0))
{
ScaleSet = 1;
}
if(bit_is_set(PINB,1))
{
TempoSet = 1;
}
if(bit_is_set(PINB,2))
{
PtbEnableSet = 1;
}
if(bit_is_set(PINB,3))
{
ExecuteSet = 1;
}
//set timers
TCCR0B |= ((1 << CS00 ) | (1 << CS02 ) ); // Set up timer0 at Fcpu /1024
TCCR2B |= ((1 << CS22 ) | (1 << CS21 ) | (1 << CS20 )); // Set up timer1 at Fcpu /1024
TIMSK0 |= (1 << TOIE1 ); // Enable overflow interrupt
TIMSK2 |= (1 << TOIE1 ); // Enable overflow interrupt
DDRD = 0b00000011;
//start lcd
lcd_init(LCD_DISP_ON);
lcd_clrscr();
for(i=0; i<4; i++)
{
lcd_gotoxy(0,0);
lcd_puts(" ECHO\n");
lcd_puts(" STATION");
_delay_ms(500);
lcd_clrscr();
_delay_ms(300);
}
lcd_gotoxy(0,0);
lcd_puts(" THE DELAY INITIATIVE ");
for(i=0; i<30; i++)
{
lcd_command(LCD_MOVE_DISP_LEFT);
_delay_ms(350);
}
if(bit_is_set(PINB,2))
{
lcd_clrscr();
for(i=0; i<4; i++)
{
lcd_gotoxy(0,0);
lcd_puts("PUSH THE");
lcd_gotoxy(0,1);
lcd_puts(" BUTTON ");
_delay_ms(500);
lcd_clrscr();
_delay_ms(300);
}
}
while(1)
{
// PB2 PtbEnable, pin 16
if(bit_is_set(PINB,2)) PtbEnableSet = 1;
if(bit_is_clear(PINB,2)) PtbEnableSet = 0;
PORTD = 0b00000001;
_delay_ms ( 500 );
PORTD = 0b00000000;
_delay_ms ( 500 );
// if(bit_is_set(PINB,0)) j = 1;
// if(bit_is_clear(PINB,0)) j = 0;
// if(bit_is_set(PINB,1)) k = 1;
// if(bit_is_clear(PINB,1)) k = 0;
if(PtbEnableSet)
{
if(!ExecuteLatch)
{
if(CountDown>0)
{
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts(" T MINUS");
lcd_gotoxy(0,1);
if (CountDown<10)
{
strcpy(c_str_out," ");
}
else if (CountDown<100)
{
strcpy(c_str_out," ");
}
else
{
strcpy(c_str_out," ");
}
itoa(CountDown, buffer, 10);
strcat(c_str_out,buffer);
strcat(c_str_out," Sec");
lcd_puts(c_str_out);
}
else
{
lcd_clrscr();
lcd_gotoxy(0,0);
if (choice=1)
{
lcd_puts("BOOM!!! U R DEAD ");
}
else if (choice =2)
{
lcd_puts("ITS THE END OF THE WORLD AS WE KNOW IT ");
}
else if (choice =3)
{
lcd_puts("HE’S DEAD JIM ");
}
else if (choice =4)
{
lcd_puts("THERE WAS SUPPOSED TO BE AN EARTH SHATTERING KABOOM ");
}
else if (choice =5)
{
lcd_puts("ITS MADE FROM PEOPLE ");
}
else if (choice =6)
{
lcd_puts("NUKE IT FROM ORBIT ");
}
else if (choice =7)
{
lcd_puts("CONTAINMENT BREACH ");
}
else if (choice =8)
{
lcd_puts("ITS COMING FROM INSIDE THE HOUSE ");
}
else if (choice =9)
{
lcd_puts("YOU WILL BE ASSIMULATED ");
}
else if (choice =10)
{
lcd_puts("MCGRUBBER!!! ");
}
else if (choice =11)
{
lcd_puts("YOU MANIACS! YOU BLEW IT UP! AH, DAMN YOU! GOD DAMN YOU ALL TO HELL! ");
}
else if (choice =12)
{
lcd_puts("ZOMBIE APOCALYPSE ");
}
// figure out how to use strlen here
for(i=0; i<70; i++)
{
lcd_command(LCD_MOVE_DISP_LEFT);
_delay_ms(350);
}
_delay_ms(5000);
CountDown=109;
choice++;
if (choice > 12)
{
choice=1;
}
}
CountDown--;
}
else
{
CountDown = 108;
}
}
else
{
lcd_clrscr();
lcd_gotoxy(0,0);
if(TPeriod1<10){
strcpy(t_str_out,"T: ");
}
else if(TPeriod1<100)
{
strcpy(t_str_out,"T: ");
}
else if(TPeriod1<1000)
{
strcpy(t_str_out,"T: ");
}
else
{
strcpy(t_str_out,"T:");
}
itoa(TPeriod1, buffer, 10);
strcat(t_str_out,buffer);
strcat(t_str_out,"ms");
lcd_puts(t_str_out);
lcd_gotoxy(0,1);
if(SPeriod1<10){
strcpy(s_str_out,"S: ");
}
else if(SPeriod1<100)
{
strcpy(s_str_out,"S: ");
}
else if(SPeriod1<1000)
{
strcpy(s_str_out,"S: ");
}
else
{
strcpy(s_str_out,"S:");
}
itoa(SPeriod1, buffer, 10);
strcat(s_str_out,buffer);
strcat(s_str_out,"ms");
lcd_puts(s_str_out);
}
}
}
ISR(PCINT0_vect)
{
if(bit_is_clear(PINB,0) && ScaleSet)
{
// Scale Pin Falling Edge
// if(SFlag<3) SFlag++;
// SCapt3=SCapt2; // 2nd oldest timestamp
// SCapt2=SCapt1; // 1st oldest timestamp
SCapt1=TCNT0; // newest captured timestamp
// SPeriod3=SPeriod2; // 2nd oldest period
// SPeriod2=SPeriod1; // 1st oldest period
// if(SFlag>2)
// {
SPeriod1=(uint16_t)(((uint32_t)(SCapt1)+ ((uint32_t)T1Ovs0*255))); //newest period
// SAvgPeriod=(uint8_t)(((uint32_t)(SCapt1)+ (uint32_t)(SCapt2)+ (uint32_t)(SCapt3))/ 0x11L);
// }
T1Ovs0=0; //reset overflows
ScaleSet = 0;
TCNT0 = 0;
}
if(bit_is_clear(PINB,1) &&TempoSet)
{
// Tempo Pin Falling Edge
// if(TFlag<3) TFlag++;
// TCapt3=TCapt2; // 2nd oldest timestamp
// TCapt2=TCapt1; // 1st oldest timestamp
TCapt1=TCNT2; // newest captured timestamp
// TPeriod3=TPeriod2; // 2nd oldest period
// TPeriod2=TPeriod1; // 1st oldest period
// if(TFlag>2)
// {
TPeriod1=(uint16_t)(((uint32_t)(TCapt1)+ ((uint32_t)T1Ovs2*255))); //newest period
// TAvgPeriod=(uint8_t)(((uint32_t)(TCapt1)+ (uint32_t)(TCapt2)+ (uint32_t)(TCapt3))/ 0x11L);
// }
T1Ovs2=0; //reset overflows
TempoSet = 0;
TCNT2=0;
}
if(bit_is_set(PINB,3))
{
ExecuteSet=1;
}
if(bit_is_clear(PINB,3)&&!ExecuteLatch)
{
// Execute Latch
ExecuteLatch = 1;
if(PtbEnableSet)
{
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("EXECUTE!");
lcd_gotoxy(0,1);
lcd_puts(" ");
}
}
if(bit_is_set(PINB,0))
{
// Scale Pin set
ScaleSet = 1;
}
if(bit_is_set(PINB,1))
{
// Tempo Pin set
TempoSet = 1;
}
if(bit_is_set(PINB,3))
{
// Remove Execute Latch
ExecuteLatch = 0;
}
}
ISR ( TIMER0_OVF_vect )
{
T1Ovs0++;
TCNT0=0;
}
ISR ( TIMER2_OVF_vect )
{
T1Ovs2++;
TCNT2=0;
}