#include <p18f452.h>
#include <delays.h>
#include <adc.h>
#include <math.h>

#define gravity_ss 512
#define display_divider 20

//PORTD - 0bBGCDHAEF
#define one 	0b10100000
#define two 	0b11010110
#define three 	0b11110100
#define four 	0b11100001
#define five 	0b01110101
#define six 	0b01110111
#define seven 	0b10100100
#define eight 	0b11110111
#define nine 	0b11110101
#define zero 	0b10110111
#define blank   0b00000000

void update_char_display(int *char_disp)
{
	int i=0;
	int all_digits[11] = {zero, one, two, three, four, five, six, seven, eight, nine};
	for(i=0;i<3;i++)
	{

		switch(i)
		{
		case 0 :	PORTB = all_digits[char_disp[i]] + 0b1000;
			break;
		case 1 :	PORTD = all_digits[char_disp[i]];
			break;
		case 2 :	PORTC = all_digits[char_disp[i]];
			break;
		default :
			break;
		}
	}

}

void main(void)
{

int char_disp[3];

int current_result, past_result = 0;
int g_val, temp = 0;

int i=0;

TRISA = 0xFF;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
				//Turn All Displays Off Initially
PORTB = blank;		//PORTB -> Display 1
PORTC = blank;		//PORTC -> Display 2
PORTD = blank;		//PORTD -> Display 3

					//Initialize A/D Converter
OpenADC( ADC_FOSC_32 
		& ADC_RIGHT_JUST 
		& ADC_8ANA_0REF, 
		ADC_CH0 & ADC_INT_OFF );

while(1){

update_char_display(char_disp);
Delay1KTCYx(250);


Delay10TCYx(5);
ConvertADC();
while( BusyADC() );
	current_result = ReadADC();

temp = current_result - past_result;

	if( temp > 2 || temp < -2 )
	{
	past_result = current_result;
	g_val = current_result - gravity_ss;
	g_val = g_val << 5;
	g_val = g_val / display_divider;

	if(g_val < 0)
		g_val = g_val * -1;

	i = 2;
	}
	while(i!= 255)
	{
		char_disp[i]=g_val%10;
		g_val = g_val/10;
		i--;
	}

}



}