#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h"
#include "FinalProject.h"
#include "MotorDriver.h"

//Globals
int LWheelDir;		//1 = Forward  0 = Reverse
int RWheelDir;		//1 = Forward  0 = Reverse
int LSpeed;			//0 to 120 in increments of 30  (0,30,60,90,120)
int RSpeed; 		//0 to 120 in increments of 30	(0,30,60,90,120)

char name[21] = "Target Acquisition";

char LPI[6] = "LPI= ";		//Text for Left Pyro
char RPI[6] = "RPI= ";		//Text for Right Pyro
char LIR[6] = "LIR= ";		//Text for Left IR
char RIR[6] = "RIR= ";		//Text for Right IR
char LSO[6] = "LSO= ";		//Text for Left Sonar
char RSO[6] = "RSO= ";		//Text for Right Sonar

char LeftPyro[4];	//Sensor string output
char RightPyro[4];	//Sensor string output
char LeftIR[4];		//Sensor string output
char RightIR[4];	//Sensor string output
char LeftSonar[4];	//Sensor string output
char RightSonar[4];	//Sensor string output

int LeftPyroData;	//Sensor data used for behavior
int RightPyroData;	//Sensor data used for behavior
int LeftIRData;		//Sensor data used for behavior
int RightIRData;	//Sensor data used for behavior
int LeftSonarData;	//Sensor data used for behavior
int RightSonarData;	//Sensor data used for behavior

int BumpData;		//Sensor data use for the bump switch

int LeftPyroArray[10] = {0,0,0,0,0,0,0,0,0,0};		//10 point averaging filter
int RightPyroArray[10] = {0,0,0,0,0,0,0,0,0,0};		//10 point averaging filter
int LeftSonarArray[10] = {0,0,0,0,0,0,0,0,0,0};		//10 point averaging filter
int RightSonarArray[10] = {0,0,0,0,0,0,0,0,0,0};	//10 point averaging filter

int Behavior0;		//Variable used to determine behavior = All sensors clear
int Behavior1;		//Variable used to determine behavior = Both sonar or both IR detect directly ahead
int Behavior2;		//Variable used to determine behavior = Left sonar or IR detect => turn right
int Behavior3;		//Variable used to determine behavior = Right sonar or IR detect => turn left
int Behavior4;		//Variable used to determine behavior = Left and Right Pyro Sensors detect heat
int Behavior5;		//Variable used to determine behavior

int ADdata;			//Used to stablize UART data
int ADhigh;			//Used to read UART data
int TempPyroLeft;	//Used to calculate average pyro data
int TempPyroRight;	//Used to calculate average pyro data
int TempSonarLeft;	//Used to calculate average sonar data
int TempSonarRight;	//Used to calculate average sonar data
int t;				//Used for for-loops and delays
int q;				//Used for for-loops and delays
int s;				//Used for sensor arrays = Sonar
int p;				//Used for sensor arrays = Pyro
int r;				//Used for initial behavior delay
int z;				//Used for pyro behavior loop
unsigned int tempC;			//Used for bumper routine


int main(void)
{
	DDRA = 0xFF;  //PortA is all outputs.  Used for the LCD.
	DDRB = 0xFF;  //PortB is all outputs.  Used for the reset pin. 
	DDRF = 0x00;  //PortF is all inputs.   Used for the A/D converter.
	PORTB = 0x00; //Initialize to 0
	PORTF = 0x00; //Initialize to 0

	s = 0;				//Initialize sensor array variable
	TempSonarLeft = 0;	//Initialize sensor temp value
	TempSonarRight = 0; //Initialize sensor temp value
	LWheelDir = 1;		//Initialize left direction variable
	RWheelDir = 1;		//Initialzie right direction variable
	LSpeed = 0;			//Initialize left speed variable
	RSpeed = 0;			//Initialize right speed variable

	AD_Init();			//Turns on AD converter

	USART_Init();		//Turns on UART
	_delay_ms(15);

	LCD_init();			//Turns on LCD

	Oblit_Powerup();	//Runs the power up sequence

	Motor_Init();		//Initializes motor driver

	for(r=0; r<10; r++)	//Sample enough sonar data to fill the 10 point averager
	{
		Sensor_Reading(0);
	}

	LCD_clear();		//Clears LCD
	LCD_text_setup();	//Sets up text on LCD for sensors

	while(1)
	{
		Sensor_Reading(1);

		if(BumpData > 200 )
		{
			Bumper_routine();
		}

		if(LeftIRData <= 170 && RightIRData <= 170 && (LeftSonarData >= 110 || RightSonarData >= 110) )
		{
			Behavior0 = 1;		//All sensors are clear
		}						//Move forward
		else
		{
			Behavior0 = 0;
		}

		if(LeftSonarData < 110 && RightSonarData < 110 )
		{
			Behavior1 = 1;		//Both sonar detect something up ahead
		}						//Turn around
		else
		{
			Behavior1 = 0;
		}

		if(LeftIRData > 170 )
		{
			Behavior2 = 1;		//Something on the left side of the robot
		}						//Turn right
		else
		{
			Behavior2 = 0;
		}

		if(RightIRData > 170 )
		{
			Behavior3 = 1;		//Something on the right side of the robot
		}						//Turn left
		else
		{
			Behavior3 = 0;
		}

		if(LeftPyroData > 260 && RightPyroData > 260)
		{
			Behavior4 = 1;		//Something hot up ahead
		}						//Target human
		else
		{
			Behavior4 = 0;
		}


		Behavior_Arbitrate();
	}

	

} //End of main

void Behavior_Arbitrate()
{
		if(Behavior0 == 1 && Behavior1 == 0 && Behavior2 == 0 && Behavior3 == 0 && Behavior4 == 0)  
		{														//If the path is clear, do this behavior
			if(LWheelDir == 1 && RWheelDir == 1)				//Move forward
			{
				if(LSpeed < 120 && RSpeed < 120)
				{
					LSpeed = LSpeed + 30;
					RSpeed = RSpeed + 30;
					Motor_forward(RSpeed, LSpeed);
					delay150ms();
				}
				else
				{
					Motor_forward(120, 120);
					delay150ms();
				}
			}
			else
			{
				Motor_stop_left();
				Motor_stop_right();
				LWheelDir = 1;
				RWheelDir = 1;
				LSpeed = 0;
				RSpeed = 0;
				delay150ms();
			}
		}

		if(Behavior0 == 0 && Behavior1 == 1 && Behavior4 == 0)		
		{															//Both sonars detect + no pyro detect
			if(LWheelDir == 1 && RWheelDir == 0)					//Spin around going right
			{
				if(LSpeed < 90 && RSpeed < 90)
				{
					LSpeed = LSpeed + 30;
					RSpeed = RSpeed + 30;
					LWheelDir = 1;
					RWheelDir = 0;
					Motor_spin_right(LSpeed, RSpeed);
					delay150ms();
				}
				else
				{
					Motor_spin_right(90, 90);
					delay150ms();
				}

			}
			else
			{
				Motor_stop_left();
				Motor_stop_right();
				LWheelDir = 1;
				RWheelDir = 0;
				LSpeed = 0;
				RSpeed = 0;
				delay150ms();
			}
		}

		if(Behavior2 == 1 && Behavior3 == 0 && Behavior1 == 0 && Behavior4 == 0)		//Something on the left side of the robot
		{											//Turn right
			if(LWheelDir == 1 && RWheelDir == 0)
			{
				if(LSpeed < 120)
				{
					LSpeed = LSpeed + 30;
					RSpeed = 0;
					LWheelDir = 1;
					RWheelDir = 0;
					Motor_turn_right(LSpeed);
					delay150ms();
				}
				else
				{
					RSpeed = 0;
					LWheelDir = 1;
					RWheelDir = 0;
					Motor_turn_right(120);
					delay150ms();
				}
			}
			else
			{
				if(LWheelDir == 0)
				{
					Motor_stop_left();
				}
				Motor_stop_right();
				LWheelDir = 1;
				RWheelDir = 0;
				LSpeed = 0;
				RSpeed = 0;
				delay150ms();
			}
		}

		if(Behavior3 == 1 && Behavior2 == 0 && Behavior1 == 0 && Behavior4 == 0)		//Something on the right side of the robot
		{											//Turn left
			if(LWheelDir == 0 && RWheelDir == 1)
			{
				if(RSpeed < 120)
				{
					LSpeed = 0;
					RSpeed = RSpeed + 30;
					LWheelDir = 0;
					RWheelDir = 1;
					Motor_turn_left(RSpeed);
					delay150ms();
				}
				else
				{
					LSpeed = 0;
					LWheelDir = 0;
					RWheelDir = 1;
					Motor_turn_left(120);
					delay150ms();
				}
			}
			else
			{
				if(RWheelDir == 0)
				{
					Motor_stop_right();
				}
				Motor_stop_left();
				LWheelDir = 0;
				RWheelDir = 1;
				LSpeed = 0;
				RSpeed = 0;
				delay150ms();
			}
		}

		if(Behavior2 == 1 && Behavior3 == 1 && Behavior1 ==0 && Behavior4 == 0)			//Both IR are triggered but no sonar
		{
			if(LWheelDir == 1 && RWheelDir == 0)					//Spin around going right
			{
				if(LSpeed < 90 && RSpeed < 90)
				{
					LSpeed = LSpeed + 30;
					RSpeed = RSpeed + 30;
					LWheelDir = 1;
					RWheelDir = 0;
					Motor_spin_right(LSpeed, RSpeed);
					delay150ms();
				}
				else
				{
					Motor_spin_right(90, 90);
					delay150ms();
				}

			}
			else
			{
				Motor_stop_left();
				Motor_stop_right();
				LWheelDir = 1;
				RWheelDir = 0;
				LSpeed = 0;
				RSpeed = 0;
				delay150ms();
			}
		}

		if(Behavior4 == 1 )//&& Behavior1 == 1)	//Both pyro detect
		{			
				Motor_stop_left();				//Stop
				Motor_stop_right();
				LWheelDir = 1;
				RWheelDir = 1;
				LSpeed = 0;
				RSpeed = 0;
				delay150ms();
				
				LCD_clear();					//Display we detected something
				_delay_ms(1);
				LCD_moveTo(1,3);
				_delay_ms(1);
				LCD_string("Motion");
				_delay_ms(1);
				LCD_moveTo(2,5);
				_delay_ms(1);
				LCD_string("Detected!!!!");

				delay500ms();					//Wait period after obliteration

				if(Behavior1 == 1)
				{
					Motor_spin_left(30,30);
					delay100ms();
					delay100ms();
					Motor_stop_left();
					Motor_stop_right();
				}

				for(r=0; r<3; r++)
				{
					Motor_spin_right(30,30);
					Sensor_Reading(0);
					delay500ms();
					Motor_spin_right(60,60);
					Sensor_Reading(0);
					delay500ms();
					Sensor_Reading(0);
					delay500ms();
					Sensor_Reading(0);
					Motor_stop_left();
					Motor_stop_right();

					Sensor_Reading(0);
					delay500ms();

					Motor_spin_left(30,30);
					Sensor_Reading(0);
					delay500ms();
					Motor_spin_left(60,60);
					Sensor_Reading(0);
					delay500ms();
					Sensor_Reading(0);
					delay500ms();
					Sensor_Reading(0);
					Motor_stop_left();
					Motor_stop_right();
					Sensor_Reading(0);
					delay500ms();
				}

				if(LeftPyroData > 100 && RightPyroData > 100)
				{
					LCD_clear();					//Display we acquired something
					_delay_ms(1);
					LCD_moveTo(1,3);
					_delay_ms(1);
					LCD_string("Target Acquired");
					_delay_ms(1);
					LCD_moveTo(2,1);
					_delay_ms(1);
					LCD_string("Powering Cannon...");

					delay500ms();					//Fire cannon code goes here!!!!!!
					delay500ms();
					delay500ms();
					delay500ms();

					//FIRE CANNON HERE

					LCD_clear();					//Display we are firing
					_delay_ms(1);
					LCD_moveTo(1,3);
					PORTB = 0x31;				//Turn on cannon
					_delay_ms(1);
					LCD_string("OBLITERATED");
				}
				else
				{
					LCD_clear();					//Display it was a false alarm
					_delay_ms(1);
					LCD_moveTo(1,3);
					_delay_ms(1);
					LCD_string("False Alarm");
					_delay_ms(1);
					LCD_moveTo(2,5);
					_delay_ms(1);
					LCD_string("Standing Down");
					Motor_stop_left();
					Motor_stop_right();
					delay500ms();		
					delay500ms();
					delay500ms();
					delay500ms();
				}

				
				//This code backs up and turns away from the target once destroyed
				Motor_reverse(30,30);
				delay150ms();
				delay100ms();
				Motor_reverse(60,60);
				delay150ms();
				delay100ms();
				Motor_reverse(90,90);
				delay150ms();
				delay100ms();
				Motor_reverse(90,90);
				delay150ms();
				delay500ms();
				delay500ms();
				delay500ms();
				delay500ms();
				PORTB = 0x01;				//Turn off cannon

				Motor_stop_left();
				Motor_stop_right();
				delay100ms();
				delay100ms();
	
				Motor_spin_left(30,30);
				delay150ms();
				delay100ms();
				Motor_spin_left(60,60);
				delay150ms();
				delay100ms();
				Motor_spin_left(90,90);
				delay150ms();
				delay100ms();
				Motor_spin_left(90,90);
				delay500ms();
				delay500ms();
				delay500ms();
				delay500ms();
				delay500ms();
				delay500ms();

				Motor_stop_left();
				Motor_stop_right();
				delay150ms();
				/////////////////////////////////////////////////////////

				LeftPyroData = 0;				//This assures the same target is not targeted
				RightPyroData = 0;
				for(p=0; p<10; p++)
				{
					LeftPyroArray[p] = 0;
					RightPyroArray[p] = 0;
				}

				LCD_clear();					//Return display to sensor output
				_delay_ms(1);
				LCD_moveTo(0,0);
				_delay_ms(1);
				LCD_text_setup();
			}
		
}

void Sensor_Reading(int feedback)	//Sensor Loop  Used to read sensors and store global data.
{
		//Bumper Switch data reading
		ADMUX = 0b01100100;
		_delay_ms(5);
		ADhigh = ADCH;
		ADdata = ADhigh;
		BumpData = ADdata; 					//Stores bump data into global variable
		_delay_ms(5);
		
		//Left IR Sensor Code = Red Wire = PortF[3]
		ADMUX = 0b01100011;
		_delay_ms(5);
		ADhigh = ADCH;
		ADhigh = ADhigh + 100;
		ADdata = ADhigh;
		LeftIRData = ADdata;				//Stores LeftIR data into global variable

		//Right IR Sensor Code = Orange Wire = PortF[2]
		ADMUX = 0b01100010;
		_delay_ms(5);
		ADhigh = ADCH;
		ADhigh = ADhigh + 100;
		ADdata = ADhigh;
		RightIRData = ADdata;				//Stores RightIR data into global variable

		//Left Pyro Sensor Code = PortF[6]
		ADMUX = 0b01100110;
		_delay_ms(5);
		ADhigh = ADCH;
		ADhigh = ADhigh + 100;
		LeftPyroArray[s] = ADhigh;			//Stores LeftPyro data into global variable

		//Right Pyro Sensor Code = PortF[5]
		ADMUX = 0b01100101;
		_delay_ms(5);
		ADhigh = ADCH;
		ADhigh = ADhigh + 100;
		RightPyroArray[s] = ADhigh;			//Stores RightPyro data into global variable

		//Left Sonar Sensor Code = Purple Wire = PortF[1]
		ADMUX = 0b01100001;
		_delay_ms(5);
		ADhigh = ADCH;
		ADdata = ADhigh + 100;
		LeftSonarArray[s] = ADdata;			//Stores LeftSonar data into global LeftSonarArray

		//Right Sonar Sensor Code = Blue Wire = PortF[0]
		ADMUX = 0b01100000;
		_delay_ms(5);
		ADhigh = ADCH;
		ADdata = ADhigh + 100;
		RightSonarArray[s] = ADdata;		//Stores RightSonar data into global RightSonarArray


		//This will do all the feedback output in one IF statement:
		if(feedback == 1)					//If feedback was requested, print this to the screen
		{
			sprintf(LeftIR, "%d", LeftIRData);
			_delay_ms(5);
			LCD_moveTo(2,5);
			_delay_ms(5);
			LCD_string(LeftIR);
			_delay_ms(5);

			sprintf(RightIR, "%d", RightIRData);
			_delay_ms(5);
			LCD_moveTo(2,15);
			_delay_ms(5);
			LCD_string(RightIR);
			_delay_ms(5);

			sprintf(LeftPyro, "%d", LeftPyroData);
			_delay_ms(5);
			LCD_moveTo(1,5);
			_delay_ms(5);
			LCD_string(LeftPyro);
			_delay_ms(5);

			sprintf(RightPyro, "%d", RightPyroData);
			_delay_ms(5);
			LCD_moveTo(1,15);
			_delay_ms(5);
			LCD_string(RightPyro);
			_delay_ms(5);

			sprintf(LeftSonar, "%d", LeftSonarData);
			_delay_ms(5);
			LCD_moveTo(3,5);
			_delay_ms(5);
			LCD_string(LeftSonar);
			_delay_ms(5);

			sprintf(RightSonar, "%d", RightSonarData);
			_delay_ms(5);
			LCD_moveTo(3,15);
			_delay_ms(5);
			LCD_string(RightSonar);
			_delay_ms(5);
		}



		s++;
		if(s >= 10)				//If s > array length, reset to 0
		{
			s=0;
		}
		q++;
		if(q >= 5)
		{
			q=0;
		}

		
		TempPyroLeft = 0;		//Reset temp variables to 0
		TempPyroRight = 0;
		TempSonarLeft = 0;		
		TempSonarRight = 0;

		for(t=0; t<10; t++)		//Add the array values into the temp variable
		{			
			TempPyroLeft = TempPyroLeft + LeftPyroArray[t];
			TempPyroRight = TempPyroRight + RightPyroArray[t];
			TempSonarLeft = TempSonarLeft + LeftSonarArray[t];
			TempSonarRight = TempSonarRight + RightSonarArray[t];
		}
			
		LeftPyroData = (TempPyroLeft / 10);
		RightPyroData = (TempPyroRight / 10);
		LeftSonarData = (TempSonarLeft / 10);		//Average out the array data
		RightSonarData = (TempSonarRight /10);
}

void Bumper_routine()
{
	Motor_stop_left();
	Motor_stop_right();
	LWheelDir = 1;
	RWheelDir = 1;
	LSpeed = 0;
	RSpeed = 0;
	delay150ms();
	
	LCD_clear();
	_delay_ms(1);
	LCD_moveTo(1,3);
	_delay_ms(1);
	LCD_string("Oops!!!!!");

	Motor_reverse(30,30);
	delay150ms();
	delay100ms();
	Motor_reverse(60,60);
	delay150ms();
	delay100ms();
	Motor_reverse(90,90);
	delay150ms();
	delay100ms();
	Motor_reverse(90,90);
	delay150ms();
	delay500ms();
	delay500ms();
	delay500ms();
	delay500ms();

	Motor_stop_left();
	Motor_stop_right();
	delay100ms();
	delay100ms();
	
	Motor_spin_left(30,30);
	delay150ms();
	delay100ms();
	Motor_spin_left(60,60);
	delay150ms();
	delay100ms();
	Motor_spin_left(90,90);
	delay150ms();
	delay100ms();
	Motor_spin_left(90,90);
	delay500ms();
	delay500ms();
	delay500ms();
	delay500ms();
	delay500ms();
	delay500ms();

	Motor_stop_left();
	Motor_stop_right();

	delay150ms();
	delay100ms();

	LCD_clear();
	_delay_ms(1);
	LCD_moveTo(0,0);
	_delay_ms(1);
	LCD_text_setup();
}

void delay150ms()				//Delays for 150 mseconds = 0.15 seconds
{
	for(t = 0; t<10; t++)
	{
		_delay_ms(15);			//Max delay AVRStudio allows is 15ms
	}
}

void delay500ms()
{
	for(t = 0; t<100; t++)		//Delays for 500 mseconds = 0.5 seconds
	{
		_delay_ms(5);
	}
}

void delay100ms()
{
	for(t = 0; t<20; t++)		//Delays for 100 mseconds = 0.1 seconds
	{
		_delay_ms(5);
	}
}

void AD_Init()
{	
	//AD Initialization Code
	ADMUX  = 0b01100000;
	ADCSRA = 0b11100111;
}

void USART_Init()
{
	//UART Initialization Code
	UCSR0A = 0x00;
	UCSR0B = 0x08;
	UCSR0C = 0x06;

	UBRR0H = 0x00;
	UBRR0L = 0x5F;
}

void LCD_text_setup()
{
	//LCD Initial Text
	_delay_ms(1);
	LCD_string(name);	//Display behavior title
	_delay_ms(1);
	LCD_moveTo(1,0);
	_delay_ms(1);
	LCD_string(LPI);	//Display LeftPyro text
	_delay_ms(1);
	LCD_moveTo(1,10);
	_delay_ms(1);
	LCD_string(RPI);	//Display RightPyro text
	_delay_ms(1);
	LCD_moveTo(2,0);	
	_delay_ms(1);
	LCD_string(LIR);	//Display LeftIR text
	_delay_ms(1);
	LCD_moveTo(2,10);
	_delay_ms(1);
	LCD_string(RIR);	//Display RightIR text
	_delay_ms(1);
	LCD_moveTo(3,0);		
	_delay_ms(1);
	LCD_string(LSO);	//Display LeftSonar text
	_delay_ms(1);
	LCD_moveTo(3,10);
	_delay_ms(1);
	LCD_string(RSO);	//Display RightSonar text
}

void Oblit_Powerup()
{
	_delay_ms(1);
	LCD_moveTo(0,3);
	_delay_ms(1);
	LCD_string("Obliterator");
	_delay_ms(1);
	LCD_moveTo(1,5);
	_delay_ms(1);
	LCD_string("Initializing!!!");
	_delay_ms(1);

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string("10 Seconds...");
	delay500ms();
	delay500ms();

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 9 Seconds...");
	delay500ms();
	delay500ms();

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 8 Seconds...");
	delay500ms();
	delay500ms();

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 7 Seconds...");
	delay500ms();
	delay500ms();

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 6 Seconds...");
	delay500ms();
	delay500ms();

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 5 Seconds...");
	_delay_ms(1);
	LCD_moveTo(3,4);
	_delay_ms(1);
	LCD_string("Testing Laser");
	PORTB = 0x20;
	delay500ms();
	PORTB = 0x00;
	delay500ms();	

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 4 Seconds...");
	PORTB = 0x20;
	delay150ms();  	//150
	PORTB = 0x00;
	delay150ms();	//300
	PORTB = 0x20;
	delay150ms();	//450
	PORTB = 0x00;
	delay150ms();	//600
	PORTB = 0x20;
	delay150ms();	//750
	PORTB = 0x00;
	delay150ms();	//900
	PORTB = 0x20;
	delay100ms();	//1000 = 1 second
	PORTB = 0x00;

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 3 Seconds...");
	PORTB = 0x20;
	delay150ms();  	//150
	PORTB = 0x00;
	delay150ms();	//300
	PORTB = 0x20;
	delay150ms();	//450
	PORTB = 0x00;
	delay150ms();	//600
	PORTB = 0x20;
	delay150ms();	//750
	PORTB = 0x00;
	delay150ms();	//900
	PORTB = 0x20;
	delay100ms();	//1000 = 1 second
	PORTB = 0x00;

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 2 Seconds...");
	PORTB = 0x20;
	delay150ms();  	//150
	PORTB = 0x00;
	delay150ms();	//300
	PORTB = 0x20;
	delay150ms();	//450
	PORTB = 0x00;
	delay150ms();	//600
	PORTB = 0x20;
	delay150ms();	//750
	PORTB = 0x00;
	delay150ms();	//900
	PORTB = 0x20;
	delay100ms();	//1000 = 1 second
	PORTB = 0x00;

	LCD_moveTo(2,6);
	_delay_ms(1);
	LCD_string(" 1 Seconds...");
	PORTB = 0x20;
	delay150ms();  	//150
	PORTB = 0x00;
	delay150ms();	//300
	PORTB = 0x20;
	delay150ms();	//450
	PORTB = 0x00;
	delay150ms();	//600
	PORTB = 0x20;
	delay150ms();	//750
	PORTB = 0x00;
	delay150ms();	//900
	PORTB = 0x20;
	delay100ms();	//1000 = 1 second
	PORTB = 0x00;


	LCD_clear();
	_delay_ms(1);
	LCD_moveTo(1,3);
	_delay_ms(1);
	LCD_string("You Better");
	_delay_ms(1);
	LCD_moveTo(2,5);
	_delay_ms(1);
	LCD_string("Run!!!!");

	delay500ms();
	delay500ms();
}
