The power supply and the sensor input portion schematic:

Connectors for LCD and ISP

The controller portion, ATMEGA8

The source code is provided below in the READ MORE LINK, otherwise the project page would have gone a bit too long, for ALL the files related to the project, use this link: http://zaidpirwani.com/1246/tachtastic-avr-tachometer-2/

The Code: [ALL OF IT]

// Tachtastic 2.0
// By The iTeam
// ATmega8 - 8MHz Internal
// Sensor - INT0 at PD.2
// T0 Overflow Interrupt
// 16x2 LCD at PB0-6 in 4-bit Mode
// START/Stop/Exit BTN at PD.3
// Menu/Select BTN at PD.5
// Next BTN at PD.7
// Prev BTN at PD.6
// COUNT#######TIME - LCD FORMAT
// -RPM-#######-Hz- - LCD FORMAT
#include <stdlib.h>
 #include <avr/io.h>
 #include <avr/interrupt.h>
 #include <util/delay.h>
 #include "lcd.h"
 // For Simplifying Bitvise Operations
#define CLEAR(port,pin) PORT ## port &= ~(1<<pin)
 #define SET(port,pin) PORT ## port |= (1<<pin)
 #define TOGGLE(port,pin) PORT ## port ^= (1<<pin)
 #define READ(port,pin) PIN ## port & (1<<pin)
 #define BITVAL(n) (1<<(n))
 #define DB_DELAY 10 // Debounce Delay - in ms
#define START 3
 #define MENU 5
 #define NEXT 7
 #define PREV 6
 void init_all();
void print_title();
void print_int(unsigned char x, unsigned char y, unsigned int temp);
void count_rev();
void comp_volt();
// Global Variables
unsigned long
 inc = 0,
 cnt = 0,
 cnt1 = 0,
 cnt2 = 0,
 cnt3 = 0,
 time = 0,
 count = 0,
 temp = 0,
 countpr= 1;
// Counts Per Revolution
unsigned char
 menu_index = 0, // 1:Count/Rev, 2:Comp V
status = 0, // 0:Normal, 1:Measuring, 2: Menu, 3: Setting
reset = 0,
 compvolt = 0;
// Boolean - 0: NOT in 1, 1:Comp V Setting
char tempstr[4];
int main(void) {
	init_all();
	print_title();
	while(1) {
		if(~READ(D,START) && status==0) {
			// START/STOP/EXIT Button - PortD.3 - Status: Normal
			_delay_ms(DB_DELAY);
			lcd_clrscr();
			inc = 0;
			cnt = 0;
			cnt1 = 0;
			cnt2 = 0;
			cnt3 = 0;
			time = 0;
			count = 0;
			status = 1;
			reset = 0;
			sei();
			while(~READ(D,START)) ;
			_delay_ms(DB_DELAY);
		} else if(~READ(D,START) && status==1) {
			// START/STOP/EXIT Button - PortD.3 - Status: Measuring
			_delay_ms(DB_DELAY);
			while(~READ(D,START)) ;
			_delay_ms(DB_DELAY);
			cli();
			status = 0;
			reset = 1;
		} else if(~READ(D,START) && status==2) {
			// START/STOP/EXIT Button - PortD.3 - Status: Menu
			_delay_ms(DB_DELAY);
			cli();
			status = 0;
			print_title();
			while(~READ(D,START)) ;
			_delay_ms(DB_DELAY);
		}
		if(~READ(D,MENU) && status==0 && reset==0) {
			// MENU/SELECT Button - PD.5 - Status: Normal
			_delay_ms(DB_DELAY);
			lcd_clrscr();
			lcd_gotoxy(0,0);
			lcd_puts("> Counts / Rev");
			lcd_gotoxy(0,1);
			lcd_puts(" Comparator V");
			menu_index = 1;
			status = 2;
			while(~READ(D,MENU)) ;
			_delay_ms(DB_DELAY);
		} else if(~READ(D,MENU) && status==0 && reset==1) {
			// MENU/SELECT Button - PD.5 - Status: Normal-BLANK
			_delay_ms(DB_DELAY);
			cli();
			status = 0;
			reset = 0;
			print_title();
			while(~READ(D,MENU)) ;
			_delay_ms(DB_DELAY);
		} else if(~READ(D,MENU) && status==2) {
			// MENU/SELECT Button - PD.5 - Status: Menu
			_delay_ms(DB_DELAY);
			status = 3;
			switch(menu_index) {
				case 1:
				 // Counts / Revolutions
				count_rev();
				break;
				case 2:
				 // Comparator Voltage
				compvolt = 1;
				comp_volt();
				break;
			}
			while(~READ(D,MENU)) ;
			_delay_ms(DB_DELAY);
		} else if(~READ(D,MENU) && status==3) {
			// MENU/SELECT Button - PortD.5 - Status: In Setting
			_delay_ms(DB_DELAY);
			lcd_clrscr();
			lcd_gotoxy(0,0);
			if(menu_index==1) {
				lcd_puts("> Counts / Rev");
				lcd_gotoxy(0,1);
				lcd_puts(" Comparator V");
			} else {
				lcd_puts(" Counts / Rev");
				lcd_gotoxy(0,1);
				lcd_puts("> Comparator V");
				compvolt = 0;
			}
			status = 2;
			compvolt = 0;
			temp = 0;
			ADCSRA = 0b10000000;
			while(~READ(D,MENU)) ;
			_delay_ms(DB_DELAY);
		}
		if(~READ(D,NEXT) && status==2) {
			// Next Button - PortD.7 - Status: In-Menu
			_delay_ms(DB_DELAY);
			while(~READ(D,NEXT)) ;
			_delay_ms(DB_DELAY);
			lcd_clrscr();
			lcd_gotoxy(0,0);
			if(menu_index==1) {
				lcd_puts(" Counts / Rev");
				lcd_gotoxy(0,1);
				lcd_puts("> Comparator V");
				menu_index = 2;
				status = 2;
			} else if(menu_index==2) {
				lcd_puts("> Counts / Rev");
				lcd_gotoxy(0,1);
				lcd_puts(" Comparator V");
				menu_index = 1;
				status = 2;
			}
		} else if(~READ(D,NEXT) && status==3 && menu_index==1) {
			// Next Button - PortD.7 - Status: In-Setting
			_delay_ms(DB_DELAY);
			countpr++;
			count_rev();
			while(~READ(D,NEXT)) ;
			_delay_ms(DB_DELAY);
		}
		if(~READ(D,PREV) && status==2) {
			// Prev Button - PortD.6 - Status: In-Menu
			_delay_ms(DB_DELAY);
			while(~READ(D,PREV)) ;
			_delay_ms(DB_DELAY);
			lcd_clrscr();
			lcd_gotoxy(0,0);
			if(menu_index==1) {
				lcd_puts(" Counts / Rev");
				lcd_gotoxy(0,1);
				lcd_puts("> Comparator V");
				menu_index = 2;
				status = 2;
			} else if(menu_index==2) {
				lcd_puts("> Counts / Rev");
				lcd_gotoxy(0,1);
				lcd_puts(" Comparator V");
				menu_index = 1;
				status = 2;
			}
		} else if(~READ(D,PREV) && status==3 && menu_index==1) {
			// Prev Button - PortD.6 - Status: In-Setting
			_delay_ms(DB_DELAY);
			if(countpr>1)
			 countpr--;
			count_rev();
			while(~READ(D,PREV)) ;
			_delay_ms(DB_DELAY);
		}
		if(compvolt) {
			// Show Voltage on LCD
			unsigned char adcval=0;
			ADCSRA = 0b11000111;
			while(ADCSRA & BITVAL(ADSC)) ;
			ADCSRA |= BITVAL(ADIF);
			adcval = (ADCH*50)/255;
			temp++;
			if(temp>5000) {
				lcd_gotoxy(3,1);
				itoa(adcval/10,tempstr,10);
				lcd_puts(tempstr);
				lcd_puts(".");
				itoa(adcval%10,tempstr,10);
				lcd_puts(tempstr);
				lcd_puts(" Volts ");
				temp = 0;
			}
		}
	}
	return(0);
}
void comp_volt() {
	lcd_clrscr();
	lcd_gotoxy(0,0);
	lcd_puts(" Comp. Voltage ");
}
void count_rev() {
	lcd_clrscr();
	lcd_gotoxy(0,0);
	lcd_puts(" Counts / Rev ");
	lcd_gotoxy(2,1);
	lcd_puts("-");
	lcd_gotoxy(6,1);
	itoa(countpr,tempstr,10);
	lcd_puts(tempstr);
	lcd_gotoxy(11,1);
	lcd_puts("+");
}
void print_int(unsigned char x, unsigned char y, unsigned int temp) {
	char tempstr[4];
	if(temp) {
		itoa(temp,tempstr,10);
		lcd_gotoxy(x,y);
		lcd_puts(tempstr);
	} else {
		lcd_gotoxy(x,y);
		lcd_puts(" ");
	}
}
void print_title() {
	lcd_init(LCD_DISP_ON);
	lcd_clrscr();
	_delay_ms(500);
	lcd_puts(" Tach-Tastic");
	_delay_ms(500);
	lcd_gotoxy(0,1);
	lcd_puts("iTeam IIEE");
}
void init_all() {
	GICR = 0b01000000;
	// INT0: On
	MCUCR = 0b00000011;
	// Mode: Rising Edge
	TCCR0 = 0b00000101;
	// TC0 Init - Mode: Normal
	TCNT0 = 0b00000000;
	// Clock source: System Clock/1024
	TIMSK = 0b00000001;
	// OC0 output: Disconnected
	ADMUX = 0b00100000;
	// ADC00 at PC.0
	ADCSRA = 0b00000111;
	// ADC Disabled
	cli();
	// Disbale all Interrupts
	DDRB = 0xFF;
	// PortB Output
	DDRD = 0x00;
	// PortC Input
	PORTD = 0xFF;
	// Pulled Up
}
ISR(INT0_vect) // INT0 Routine {
	cnt++;
	count++;
	print_int(0,0,count);
}
ISR(TIMER0_OVF_vect) // Timer0 Overflow Routine {
	inc++;
	if(inc>30) {
		time++;
		cnt3 = cnt2;
		cnt2 = cnt1;
		cnt1 = cnt/countpr;
		print_int(12,0,time);
		print_int(0,1,((cnt1+cnt2+cnt3)/3)*60);
		print_int(12,1,(cnt1+cnt2+cnt3)/3);
		inc = 0;
		cnt = 0;
	}
}