// ***************************************************NOTES FOR GARY************************************************** 
// Routine1(task1) and 3(task3) function as intended, however ONLY when routine2 (task2) is commented out in void main
// Routine 2(task2) runs when Routines1(task1) and 3(task3) are commented out in void main
// Routine 2 performs the 4 tasks required in Task2's breif, however ONLY on 1 push, not 4 separate pushes
// ***************************************************NOTES FOR GARY**************************************************




#include <main.h>
#define LCD_ENABLE_PIN PIN_C0
#define LCD_RS_PIN PIN_C2
#define LCD_RW_PIN PIN_C1
#define LCD_DATA4 PIN_C4
#define LCD_DATA5 PIN_C5
#define LCD_DATA6 PIN_C6
#define LCD_DATA7 PIN_C7

unsigned int adc1(void);
unsigned int adc2(void);	
unsigned int adc3(void);
unsigned int adc,old_adc;
unsigned int read_but(void);
unsigned int ops,old_ops,a=1;

void clear_outputs(void);	
void welcome (void);
void routine1(void);
void routine2(void);
void routine2a(void);
void routine2b(void);
void routine2c(void);
void routine2d(void);
void routine3(void);

#include <lcd.c>

void main()
{
	setup_adc_ports(sAN0 | sAN1 | sAN2, VSS_VDD);
	setup_adc(ADC_CLOCK_INTERNAL | ADC_TAD_MUL_0);

   lcd_init();
 
	while(TRUE)
	{
			routine1();					
			routine2();
			routine3();	
	}

}



void routine1(void)
   {
      
      printf(lcd_putc,"\f         %u  ", adc1());
      lcd_gotoxy(1,2);						
      printf(lcd_putc,"         %u  ", adc2()); 
      lcd_gotoxy(21,1);
      printf(lcd_putc,"         %u  ", adc3());
      delay_ms(1000); 
   }
   
void routine2()
   {
      while(TRUE)
      {
          ops=read_but();

          if(ops!=old_ops)    
		  {
          switch(ops)
                  {
                        case 1:           routine2a();
					  //break;
                        case 2:           routine2b();
					  //break;
                        case 4:           routine2c();
					  //break;
			case 8:           routine2d();
					  //break;
                        //default:    	  break;
                  }
				  a*=2;
			  }
            old_ops=ops;

      }
   }

void routine2a(void)
      {
	 if(old_ops!=ops)									
		  {
				 output_high(PIN_A7);							
				 output_low(PIN_A6); 
				 delay_ms(2000);
		  }
	//clear_outputs();	
      }
      
void routine2b(void)
      {
	    if(old_ops!=ops)									
		  {
				 output_low(PIN_A6);							
				 output_low(PIN_A7); 
				 delay_ms(2000);
		  }
	//clear_outputs();	
      }
      
void routine2c(void)
      {
	if(old_ops!=ops)									
		  {
				 output_low(PIN_A7);							
				 output_high(PIN_A6); 
				 delay_ms(2000);
		  }
	//clear_outputs();
      }
      
void routine2d(void)
      {
	if(old_ops!=ops)									
		  {
				 output_low(PIN_A6);							
				 output_low(PIN_A7); 
				 delay_ms(2000);
		  }
	//clear_outputs();
      }
      
void routine3(void)                         								 
	{
	   if(input(PIN_A5))
	      {
		adc = adc1();										
		if(old_adc!=adc)									
		  {
		     output_b(adc);									
		     delay_ms(2000);
		  }
		old_adc = adc;										
		adc = adc2();										
		if(old_adc!=adc)									
		  {
		     output_b(adc);									
		     delay_ms(2000);
		  }
		old_adc = adc;	
		adc = adc3();										
		if(old_adc!=adc)									
		  {
		     output_b(adc);									
		  }
	       }
	    else
	    {
	       output_b(0x00);
	    }
	    old_adc = adc;	
	}

unsigned int adc1(void)										
	{	
		unsigned int adc1_value;									
		set_adc_channel(0);									
		delay_us(20);										
		adc1_value=read_adc();									
		return(adc1_value);										
	}
	
unsigned int adc2()											
	{
		unsigned int adc2_value;									
		set_adc_channel(1);									
		delay_us(20);										
		adc2_value = read_adc();									
		return(adc2_value);									
	}

unsigned int adc3()											
	{
		unsigned int adc3_value;									
		set_adc_channel(2);									
		delay_us(20);										
		adc3_value = read_adc();									
		return(adc3_value);									
	}
	
void clear_outputs(void)										
	 {
		output_b(0x00);																									
		output_low(pin_A6);									
		output_low(pin_A7);
	        adc = 0;
		old_adc = 0;
	 }
	 
unsigned int read_but(void)
      {
            unsigned int buttons;
            buttons = input(PIN_A4);               
            return(buttons);                    
      }