#include <18f46k80.h>                    //PIC A UTILIZAR
#fuses HSH,NOWDT, NOPUT,NOPLLEN            //CRISTAL
#use delay(clock=10000000)               //A 20MHZ
#include <glcd.c>                     //INCLUIMOS GLCD.C DE PICC
#include<stdlib.h>
#include<stdio.h>

#use rs232(baud=9600,xmit=PIN_D5,rcv=PIN_B0,stream=Serie3)
#use rs232(baud=9600,xmit=PIN_D6,rcv=PIN_D7,stream=Serie2)
   
#USE FAST_IO (A) 
#USE FAST_IO (D) 
#USE FAST_IO (c) 
#USE FAST_IO (b) 

//----------------------------DEFINICION DE CONSTANTES-----------------

#define ADELANTE	1 	
#define	ATRAS		2	
#define	ENTER		3
#define	MENU		4
#define E1			1
#define E11			11
#define E12			12
#define E13			13
#define E14			14
#define E2			2
#define E21			21
#define E22			22
#define E23			23
#define E24			24	
#define E3			3
#define E31			31		
#define E32			32
#define E33			33
#define E34			34
#define E4			4
#define E41			41
#define E42			42
#define E43			43
#define E44			44
#define E0			0	
#define EJ11		110
#define EJ12		120
#define EJ13		130
#define EJ14		140
#define EJ21		210
#define EJ22		220
#define EJ23		230
#define EJ24		240
#define EJ31		310
#define EJ32		320
#define EJ33		330
#define EJ34		340
#define EJ41		410
#define EJ42		420
#define EJ43		430
#define EJ44		440

	

//---------------------------------DECLARACION DE FUNCIONES-------------------------

void Maquina_Estados(void);
void Seleccion_Estado(void);
void Estado_E0(void);
void Estado_E1(void);
void Estado_E11(void);
void Estado_E12(void);
void Estado_E13(void);
void Estado_E14(void);
void Estado_E2(void);
void Estado_E21(void);
void Estado_E22(void);
void Estado_E23(void);
void Estado_E24(void);
void Estado_E3(void);
void Estado_E31(void);
void Estado_E32(void);
void Estado_E33(void);
void Estado_E34(void);

//---------------------------------DECLARACION DE VARIABLES-------------------------

int 	Estado=E0;
char	Accion=0;
char	c=0;
char	texto1[20];
char 	cambio_estado=1;

main() 
{

//-----------------------------------CONFIGURACION DE INTERRUPCIONES------------------------
	DISABLE_INTERRUPTS(global);

	ENABLE_INTERRUPTS(INT_EXT);
	CLEAR_INTERRUPT(int_ext);
	EXT_INT_EDGE(0,H_TO_L);

	ENABLE_INTERRUPTS(INT_EXT1);
	EXT_INT_EDGE(1,L_TO_H);
	CLEAR_INTERRUPT(int_ext1);

	ENABLE_INTERRUPTS(INT_EXT2);
	EXT_INT_EDGE(2,L_TO_H);
	CLEAR_INTERRUPT(int_ext2);

	ENABLE_INTERRUPTS(INT_RB5);
	ENABLE_INTERRUPTS(INT_RB4);
	CLEAR_INTERRUPT(int_rb);

//-----------------------------------CONFIGURACION DE ENTREDAS/SALIDAS DIGITALES--------------------------

	SET_TRIS_A( 0x00 );		//0b
	SET_TRIS_D( 0x80 );		//0b10000000
	SET_TRIS_C( 0x00 );		//0b
	SET_TRIS_B( 0x37 );		//0b00110111

//	glcd_init(ON);   		// iniciamos la lcd                              
//	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	output_low(PIN_B3);

	ENABLE_INTERRUPTS(global);
	
//	sprintf(texto1 "COMENZANDO...");
//	glcd_text57(0,10,texto1,2, ON);
//	delay_ms(3000);	

	while(1)
	{	
		delay_ms(500);
		fprintf(Serie3,"%i ",Estado);
//		if(cambio_estado==1)
//		{
//			Seleccion_Estado();
//			cambio_estado=0;
//		}
	}
}


#INT_EXT
void rx3()
{
	c=getch();
	fprintf(Serie3,"");
	CLEAR_INTERRUPT(int_ext);
}

#INT_EXT1
Bot_Atras()
{
	Accion=ATRAS;
//	cambio_estado=1;
	Maquina_Estados();
	CLEAR_INTERRUPT(int_ext1);
}

#INT_EXT2
Bot_Menu()
{
	Accion=MENU;
//	cambio_estado=1;
	Maquina_Estados();
	CLEAR_INTERRUPT(int_ext2);
}

#INT_RB
Bot_Ent_Adelante()
{
	if(input(PIN_B4))
	{
		Accion=ENTER;
//		cambio_estado=1;
		Maquina_Estados();
		CLEAR_INTERRUPT(int_rb);
	}
	if(input(PIN_B5))
	{
		Accion=ADELANTE;
//		cambio_estado=1;
		Maquina_Estados();
		CLEAR_INTERRUPT(int_rb);
	}	
	CLEAR_INTERRUPT(int_rb);	
}



void Maquina_Estados()
{
	switch (Estado)
	{
		case E0:
			switch (Accion)
			{
				case ATRAS:
					Estado=E0;
					return;
				case MENU:
					Estado=E1;
					return;
				case ENTER:
					Estado=E0;
					return;
				case ADELANTE:
					Estado=E0;
					return;
			}
		break;
		case E1:
			switch (Accion)
			{
				case ATRAS:
					Estado=E4;
					return;
				case MENU:
					Estado=E0;
					return;
				case ENTER:
					Estado=E11;
					return;
				case ADELANTE:
					Estado=E2;
					return;
			}
			break;
		case E11:	
			switch (Accion)
			{
				case ATRAS:
					Estado=E14;
					return;
				case MENU:
					Estado=E1;
					return;
				case ENTER:
					Estado=EJ11;
					return;
				case ADELANTE:
					Estado=E12;
					return;
			break;
			}
		case E12:
			switch (Accion)
			{
				case ATRAS:
					Estado=E11;
					return;
				case MENU:
					Estado=E1;
					return;
				case ENTER:
					Estado=EJ12;
					return;
				case ADELANTE:
					Estado=E13;
					return;
			}
			break;
		case E13:
			switch (Accion)
			{
				case ATRAS:
					Estado=E12;
					return;
				case MENU:
					Estado=E1;
					return;
				case ENTER:
					Estado=EJ13;
					return;
				case ADELANTE:
					Estado=E14;
					return;
			}
			break;
		case E14:
			switch (Accion)
			{
				case ATRAS:
					Estado=E13;
					return;
				case MENU:
					Estado=E1;
					return;
				case ENTER:
					Estado=EJ14;
					return;
				case ADELANTE:
					Estado=E11;
					return;
			}
			break;
		case E2:
			switch (Accion)
			{
				case ATRAS:
					Estado=E1;
					return;
				case MENU:
					Estado=E0;
					return;
				case ENTER:
					Estado=E21;
					return;
				case ADELANTE:
					Estado=E3;
					return;
			}
			break;
		case E21:
			switch (Accion)
			{
				case ATRAS:
					Estado=E24;
					return;
				case MENU:
					Estado=E2;
					return;
				case ENTER:
					Estado=EJ21;
					return;
				case ADELANTE:
					Estado=E22;
					return;
			}
			break;
		case E22:
			switch (Accion)
			{
				case ATRAS:
					Estado=E21;
					return;
				case MENU:
					Estado=E2;
					return;
				case ENTER:
					Estado=EJ22;
					return;
				case ADELANTE:
					Estado=E23;
					return;
			}
			break;
		case E23:
			switch (Accion)
			{
				case ATRAS:
					Estado=E22;
					return;
				case MENU:
					Estado=E2;
					return;
				case ENTER:
					Estado=EJ23;
					return;
				case ADELANTE:
					Estado=E24;
					return;
			}
			break;
		case E24:
			switch (Accion)
			{
				case ATRAS:
					Estado=E23;
					return;
				case MENU:
					Estado=E2;
					return;
				case ENTER:
					Estado=EJ24;
					return;
				case ADELANTE:
					Estado=E21;
					return;
			}
			break;
		case E3:
			switch (Accion)
			{
				case ATRAS:
					Estado=E2;
					return;;
				case MENU:
					Estado=E0;
					return;
				case ENTER:
					Estado=E31;
					return;
				case ADELANTE:
					Estado=E4;
					return;
			}
			break;
		case E31:
			switch (Accion)
			{
				case ATRAS:
					Estado=E34;
					return;
				case MENU:
					Estado=E3;
					return;
				case ENTER:
					Estado=EJ31;
					return;
				case ADELANTE:
					Estado=E32;
					return;
			}
			break;
		case E32:
			switch (Accion)
			{
				case ATRAS:
					Estado=E31;
					return;
				case MENU:
					Estado=E3;
					return;
				case ENTER:
					Estado=EJ32;
					return;
				case ADELANTE:
					Estado=E33;
					return;
			}
			break;
		case E33:
			switch (Accion)
			{
				case ATRAS:
					Estado=E32;
					return;
				case MENU:
					Estado=E3;
					return;
				case ENTER:
					Estado=EJ33;
					return;
				case ADELANTE:
					Estado=E34;
					return;
			}
			break;
		case E34:
			switch (Accion)
			{
				case ATRAS:
					Estado=E33;
					return;
				case MENU:
					Estado=E3;
					return;
				case ENTER:
					Estado=EJ34;
					return;
				case ADELANTE:
					Estado=E31;
					return;
			}
			break;
		case E4:
			switch (Accion)
			{
				case ATRAS:
					Estado=E3;
					return;
				case MENU:
					Estado=E0;
					return;
				case ENTER:
					Estado=E41;
					return;
				case ADELANTE:
					Estado=E1;
					return;
			}
			break;
		case E41:
			switch (Accion)
			{
				case ATRAS:
					Estado=E44;
					return;
				case MENU:
					Estado=E4;
					return;
				case ENTER:
					Estado=EJ41;
					return;
				case ADELANTE:
					Estado=E42;
					return;
			}
			break;
		case E42:
			switch (Accion)
			{
				case ATRAS:
					Estado=E41;
					return;
				case MENU:
					Estado=E4;
					return;
				case ENTER:
					Estado=EJ42;
					return;
				case ADELANTE:
					Estado=E43;
					return;
			}
			break;
		case E43:
			switch (Accion)
			{
				case ATRAS:
					Estado=E42;
					return;
				case MENU:
					Estado=E4;
					return;
				case ENTER:
					Estado=EJ43;
					return;
				case ADELANTE:
					Estado=E44;
					return;
			}
			break;
		case E44:
			switch (Accion)
			{
				case ATRAS:
					Estado=E43;
					return;
				case MENU:
					Estado=E4;
					return;
				case ENTER:
					Estado=EJ44;
					return;
				case ADELANTE:
					Estado=E41;
					return;
			}
			break;
	

	}
}
/*
void Seleccion_Estado()
{
		switch(Estado)
		{
			case E0:
				Estado_E0();
			break;
			case E1:
				Estado_E1();
			break;
			case E11:
				Estado_E11();
			break;
			case E12:
				Estado_E12();
			break;
			case E13:
				Estado_E13();
			break;
			case E14:
				Estado_E14();
			break;
			case E2:
				Estado_E2();
			break;
			case E21:
				Estado_E21();
			break;
			case E22:
				Estado_E22();
			break;
			case E23:
				Estado_E23();
			break;
			case E24:
				Estado_E24();
			break;
			case E3:
				Estado_E3();
			break;
			case E31:
				Estado_E31();
			break;
			case E32:
				Estado_E32();
			break;
			case E33:
				Estado_E33();
			break;
			case E34:
				Estado_E34();
			break;
		}
}

void Estado_E0(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_0");
	glcd_text57(0,10,texto1,2, ON);
}
void Estado_E1(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_1");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E11(void)
{
	sprintf(texto1 "ESTADO_11");
	glcd_text57(0,10,texto1,2, ON);
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
}

void Estado_E12(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_12");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E13(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_13");
	glcd_text57(0,10,texto1,2, ON);
}
void Estado_E14(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_14");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E2(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_2");
	glcd_text57(0,10,texto1,2, ON);
}
void Estado_E21(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_21");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E22(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_22");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E23(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_23");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E24(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_24");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E3(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_3");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E31(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_31");
	glcd_text57(0,10,texto1,2, ON);
}
void Estado_E32(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_32");
	glcd_text57(0,10,texto1,2, ON);
}
void Estado_E33(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_33");
	glcd_text57(0,10,texto1,2, ON);
}

void Estado_E34(void)
{
	glcd_fillScreen(OFF); 	//LIMPIAMOS LA PANTALLA
	sprintf(texto1 "ESTADO_34");
	glcd_text57(0,10,texto1,2, ON);
}
*/