

#define MX_PIC

//Määrittää mikro-ohjaimen
#define P16F887
#define MX_EE
#define MX_EE_TYPE2
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_C
#define MX_SPI_SDI 4
#define MX_SPI_SDO 5
#define MX_SPI_SCK 3
#define MX_UART
#define MX_UART_C
#define MX_UART_TX 6
#define MX_UART_RX 7
#define MX_I2C
#define MX_MI2C
#define MX_I2C_C
#define MX_I2C_SDA 4
#define MX_I2C_SCL 3
#define MX_PWM
#define MX_PWM_CNT 2
#define MX_PWM_TRIS1 trisc
#define MX_PWM_1 2
#define MX_PWM_TRIS2 trisc
#define MX_PWM_2 1

//funktiot
#define MX_CLK_SPEED 4194304
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Konfigurointi data
#ifdef _BOOSTC
#pragma DATA 0x2007, 0x2ff2
#endif
#ifdef HI_TECH_C
__CONFIG(0x2ff2);
#endif
#ifdef _BOOSTC
#pragma DATA 0x2008, 0x3fff
#endif
#ifdef HI_TECH_C
__CONFIG(0x3fff);
#endif

//Sisäiset toiminnot
#include "C:\Program Files (x86)\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Makro-funktion kuvaukset
void FCM_tmr_service();
void FCM_LCD_tulostus();
void FCM_Kellon_laskutoimitus();
void FCM_Lue_tulo();
void FCM_LCD_tulostus_nopeus_matka();
void FCM_pulssi_laskutoimitus();
void FCM_tulo();


//Muuttujakuvaukset
#define FCSZ_MATKA 6
#define FCSZ_KMH 4
char FCV_MATKA[FCSZ_MATKA];
float FCV_KMH_FLOAT;
char FCV_SECONDS;
char FCV_KMH[FCSZ_KMH];
float FCV_FLOAT_MATKA_TOTAL;
char FCV_MINUTES;
char FCV_IN;
char FCV_INT_COUNT;
char FCV_DISP_UPDATE;
float FCV_FREQ_FLOAT2;
char FCV_HOURS;
float FCV_FREQ_FLOAT;
float FCV_FLOAT_MATKA;




//LCDDisplay(0): //Defines:

/**** Macro Substitutions ****
portb = D1 Port
trisb = D1 Data Direction
portb = D2 Port
trisb = D2 Data Direction
portb = D3 Port
trisb = D3 Data Direction
portb = D4 Port
trisb = D4 Data Direction
portb = RS Port
trisb = RS Data Direction
portb = E Port
trisb = E Data Direction
0 = Data 1_Pin
1 = Data 2 Pin
2 = Data 3 Pin
3 = Data 4 Pin
4 = RS Pin
5 = Enable Pin
LCD_394190 = Unique Component Reference Number
2 = Row Count
16 = Column Count
******************************/

	//component connections
	#define LCD_394190_PORT0    portb
	#define LCD_394190_TRIS0    trisb
	#define LCD_394190_PORT1    portb
	#define LCD_394190_TRIS1    trisb
	#define LCD_394190_PORT2    portb
	#define LCD_394190_TRIS2    trisb
	#define LCD_394190_PORT3    portb
	#define LCD_394190_TRIS3    trisb
	#define LCD_394190_PORT4    portb
	#define LCD_394190_TRIS4    trisb
	#define LCD_394190_PORT5    portb
	#define LCD_394190_TRIS5    trisb
	#define LCD_394190_BIT0    	0
	#define LCD_394190_BIT1    	1
	#define LCD_394190_BIT2    	2
	#define LCD_394190_BIT3    	3
	#define LCD_394190_RS      	4
	#define LCD_394190_E       	5
	#define LCD_394190_ROWCNT	2
	#define LCD_394190_COLCNT	16

	#ifdef _BOOSTC
	  #define LCD_394190_DELAY   delay_10us(10)
	#endif
	#ifdef _C2C_
	  #define LCD_394190_DELAY   delay_us(100)
	#endif
	#ifdef HI_TECH_C
	  #define LCD_394190_DELAY   __delay_us(120)
	#endif
	#ifndef LCD_394190_DELAY
	  #define LCD_394190_DELAY   delay_us(100)
	#endif

	#define ModIDLCD_394190LCD_394190 (((trisb << 5) + portb) << 9)




//LCDDisplay(0): //Makro-funktion kuvaukset

void FCD_LCDDisplay0_RawSend(char in, char mask);
void FCD_LCDDisplay0_Start();
void FCD_LCDDisplay0_Clear();
void FCD_LCDDisplay0_PrintASCII(char Character);
void FCD_LCDDisplay0_Command(char in);
void FCD_LCDDisplay0_Cursor(char x, char y);
void FCD_LCDDisplay0_PrintNumber(short Number);
void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String);
void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions);
void FCD_LCDDisplay0_ClearLine(char Line);
void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7);



//LCDDisplay(0): //Makro-toteutukset


void FCD_LCDDisplay0_RawSend(char in, char mask)
{
	
	#ifndef MX_MIAC_SYSTEM
		unsigned char pt;

		clear_bit(LCD_394190_PORT0, LCD_394190_BIT0);
		clear_bit(LCD_394190_PORT1, LCD_394190_BIT1);
		clear_bit(LCD_394190_PORT2, LCD_394190_BIT2);
		clear_bit(LCD_394190_PORT3, LCD_394190_BIT3);
		clear_bit(LCD_394190_PORT4, LCD_394190_RS);
		clear_bit(LCD_394190_PORT5, LCD_394190_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_394190_PORT0, LCD_394190_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_394190_PORT1, LCD_394190_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_394190_PORT2, LCD_394190_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_394190_PORT3, LCD_394190_BIT3);
		if (mask)
		    set_bit(LCD_394190_PORT4, LCD_394190_RS);
		LCD_394190_DELAY;
		set_bit (LCD_394190_PORT5, LCD_394190_E);
		LCD_394190_DELAY;
		clear_bit (LCD_394190_PORT5, LCD_394190_E);
		pt = (in & 0x0f);
		LCD_394190_DELAY;
		clear_bit(LCD_394190_PORT0, LCD_394190_BIT0);
		clear_bit(LCD_394190_PORT1, LCD_394190_BIT1);
		clear_bit(LCD_394190_PORT2, LCD_394190_BIT2);
		clear_bit(LCD_394190_PORT3, LCD_394190_BIT3);
		clear_bit(LCD_394190_PORT4, LCD_394190_RS);
		clear_bit(LCD_394190_PORT5, LCD_394190_E);
		if (pt & 0x01)
		    set_bit(LCD_394190_PORT0, LCD_394190_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_394190_PORT1, LCD_394190_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_394190_PORT2, LCD_394190_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_394190_PORT3, LCD_394190_BIT3);
		if (mask)
		    set_bit(LCD_394190_PORT4, LCD_394190_RS);
		LCD_394190_DELAY;
		set_bit (LCD_394190_PORT5, LCD_394190_E);
		LCD_394190_DELAY;
		clear_bit (LCD_394190_PORT5, LCD_394190_E);
		LCD_394190_DELAY;

	#endif

}

void FCD_LCDDisplay0_Start()
{
	
	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		MIAC_CAN_TX[0] = 0;
		MIAC_CAN_TX[1] = 1;
		MIAC_CAN_TX[2] = 2;
		MIAC_CAN_TX[3] = 3;
		MIAC_CAN_TX[4] = 4;
		MIAC_CAN_TX[5] = 5;

		MIAC_Module_WR(ModIDLCD_394190, 608, 6,1,1);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 608, 20);

		MIAC_CAN_TX[0] = 2;
		MIAC_CAN_TX[1] = 16;
		MIAC_Module_WR(ModIDLCD_394190, 608, 2,0,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 608, 255);

	  #endif
	#else

		clear_bit(LCD_394190_TRIS0, LCD_394190_BIT0);
		clear_bit(LCD_394190_TRIS1, LCD_394190_BIT1);
		clear_bit(LCD_394190_TRIS2, LCD_394190_BIT2);
		clear_bit(LCD_394190_TRIS3, LCD_394190_BIT3);
		clear_bit(LCD_394190_TRIS4, LCD_394190_RS);
		clear_bit(LCD_394190_TRIS5, LCD_394190_E);

		Wdt_Delay_Ms(12);

		FCD_LCDDisplay0_RawSend(0x33, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x33, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x32, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x2c, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x06, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x0c, 0);
		Wdt_Delay_Ms(2);

		//clear the display
		FCD_LCDDisplay0_RawSend(0x01, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x02, 0);
		Wdt_Delay_Ms(2);
	#endif

}

void FCD_LCDDisplay0_Clear()
{
	
	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		MIAC_Module_WR(ModIDLCD_394190, 609, 0,1,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 609, 200);
	  #endif
	#else
		FCD_LCDDisplay0_RawSend(0x01, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x02, 0);
		Wdt_Delay_Ms(2);
	#endif

}

void FCD_LCDDisplay0_PrintASCII(char Character)
{
	
	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)



		MIAC_CAN_TX[0] = Character;

		MIAC_Module_WR(ModIDLCD_394190, 610, 1,1,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 610, 20);
	  #endif
	#else
		FCD_LCDDisplay0_RawSend(Character, 0x10);
	#endif

}

void FCD_LCDDisplay0_Command(char in)
{
	
	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		MIAC_CAN_TX[0] = in;

		MIAC_Module_WR(ModIDLCD_394190, 611, 1,1,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 611, 200);
	  #endif
	#else
		FCD_LCDDisplay0_RawSend(in, 0);
		Wdt_Delay_Ms(2);
	#endif

}

void FCD_LCDDisplay0_Cursor(char x, char y)
{
	
	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		MIAC_CAN_TX[0] = x;
		MIAC_CAN_TX[1] = y;

		MIAC_Module_WR(ModIDLCD_394190, 612, 2,1,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 612, 20);
	  #endif

	#else

	  #if (LCD_394190_ROWCNT == 1)
	    y=0x80;
	  #endif

	  #if (LCD_394190_ROWCNT == 2)
		if (y==0)
			y=0x80;
		else
			y=0xc0;
	  #endif

	  #if (LCD_394190_ROWCNT == 4)
		if (y==0)
			y=0x80;
		else if (y==1)
			y=0xc0;

		#if (LCD_394190_COLCNT == 16)
			else if (y==2)
				y=0x90;
			else
				y=0xd0;
		#endif

		#if (LCD_394190_COLCNT == 20)
			else if (y==2)
				y=0x94;
			else
				y=0xd4;
		#endif
	  #endif

		FCD_LCDDisplay0_RawSend(y+x, 0);
		Wdt_Delay_Ms(2);
	#endif

}

void FCD_LCDDisplay0_PrintNumber(short Number)
{
	
	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		MIAC_CAN_TX[1] = Number;
		MIAC_CAN_TX[0] = Number >> 8;

		MIAC_Module_WR(ModIDLCD_394190, 613, 4,1,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 613, 200);
	  #endif

	#else

		short tmp_int;
		char tmp_byte;

		if (Number < 0)
		{
			FCD_LCDDisplay0_RawSend('-', 0x10);
			Number = 0 - Number;
		}

		tmp_int = Number;
		if (Number >= 10000)
		{
			tmp_byte = tmp_int / 10000;
			FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 10000;
				tmp_byte--;
			}
		}
		if (Number >= 1000)
		{
			tmp_byte = tmp_int / 1000;
			FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 1000;
				tmp_byte--;
			}
		}
		if (Number >= 100)
		{
			tmp_byte = tmp_int / 100;
			FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 100;
				tmp_byte--;
			}
		}
		if (Number >= 10)
		{
			tmp_byte = tmp_int / 10;
			FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 10;
				tmp_byte--;
			}
		}
		FCD_LCDDisplay0_RawSend('0' + tmp_int, 0x10);
	#endif

}

void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String)
{
	
		char idx = 0;

	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		char msg_count, ch;
		char cmd_start = 1;
		char more_data = 1;

		// Split string into 6-byte packets
		do
		{
			msg_count = 0;
			do
			{
				ch = String[idx];
				if (ch)
				{
					MIAC_CAN_TX[msg_count] = ch;
					idx = idx + 1;
					msg_count = msg_count + 1;
				}
			}
			while (ch && (msg_count < 6) && (idx < MSZ_String));			// check for 2 x End Of String conditions and packet full

			if (idx == MSZ_String)											// end of string
			{
				more_data = 0;
			}else{
				if (String[idx] == 0) more_data = 0;						// next ch = null
			}

			MIAC_Module_WR(ModIDLCD_394190, 614, msg_count,cmd_start,more_data);		// TX data
			MIAC_Module_GetAck(ModIDLCD_394190 + 32, 614, 200);

			cmd_start = 0;
		}
		while (more_data);
	  #endif
	#else
		for (idx=0; idx<MSZ_String; idx++)
		{
			if (String[idx] == 0)
			{
				break;
			}
			FCD_LCDDisplay0_RawSend(String[idx], 0x10);
		}
	#endif

}

void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions)
{
	
	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		MIAC_CAN_TX[0] = Direction;
		MIAC_CAN_TX[1] = Num_Positions;

		MIAC_Module_WR(ModIDLCD_394190, 615, 2,1,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 615, 20);
	  #endif
	#else

		char cmd = 0;
		char count;

		//Choose the direction
		switch (Direction)
		{
			case 0:
			case 'l':
			case 'L':

				cmd = 0x18;
				break;

			case 1:
			case 'r':
			case 'R':

				cmd = 0x1C;
				break;

			default:
				break;
		}

		//If direction accepted then scroll the specified amount
		if (cmd)
		{
			for (count = 0; count < Num_Positions; count++)
				FCD_LCDDisplay0_Command(cmd);
		}
	#endif

}

void FCD_LCDDisplay0_ClearLine(char Line)
{
	
	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		MIAC_CAN_TX[0] = Line;

		MIAC_Module_WR(ModIDLCD_394190, 616, 1,1,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 616, 200);
	  #endif
	#else
		char count;
		char rowcount;

		//Define number of columns per line
		#if (LCD_394190_ROWCNT == 1)
			rowcount=80;
		#endif

		#if (LCD_394190_ROWCNT == 2)
			rowcount=40;
		#endif

		#if (LCD_394190_ROWCNT == 4)
			#if (LCD_394190_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_394190_COLCNT == 20)
				rowcount=20;
			#endif
		#endif

		//Start at beginning of the line
		FCD_LCDDisplay0_Cursor (0, Line);

		//Send out spaces to clear line
		for (count = 0; count < rowcount; count++)
			FCD_LCDDisplay0_RawSend(' ', 0x10);

		//Move back to the beginning of the line.
		FCD_LCDDisplay0_Cursor (0, Line);
	#endif

}

void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7)
{
	   //set CGRAM address

	#ifdef MX_MIAC_SYSTEM
	  #if (portb != MX_MIAC_MM_MIAC_BASE)

		MIAC_CAN_TX[0] = nIdx;
		MIAC_CAN_TX[1] = d0;
		MIAC_CAN_TX[2] = d1;
		MIAC_CAN_TX[3] = d2;
		MIAC_CAN_TX[4] = d3;
		MIAC_CAN_TX[5] = d4;

		MIAC_Module_WR(ModIDLCD_394190, 617, 6,1,1);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 617, 20);

		MIAC_CAN_TX[0] = d5;
		MIAC_CAN_TX[1] = d6;
		MIAC_CAN_TX[2] = d7;

		MIAC_Module_WR(ModIDLCD_394190, 617, 3,0,0);
		MIAC_Module_GetAck(ModIDLCD_394190 + 32, 617, 200);

	  #endif
	#else

	   FCD_LCDDisplay0_RawSend(64 + (nIdx << 3), 0);
	   delay_ms(2);

	   //write CGRAM data
	   FCD_LCDDisplay0_RawSend(d0, 0x10);
	   FCD_LCDDisplay0_RawSend(d1, 0x10);
	   FCD_LCDDisplay0_RawSend(d2, 0x10);
	   FCD_LCDDisplay0_RawSend(d3, 0x10);
	   FCD_LCDDisplay0_RawSend(d4, 0x10);
	   FCD_LCDDisplay0_RawSend(d5, 0x10);
	   FCD_LCDDisplay0_RawSend(d6, 0x10);
	   FCD_LCDDisplay0_RawSend(d7, 0x10);

	   //Clear the display
	   FCD_LCDDisplay0_RawSend(0x01, 0);
	   delay_ms(2);
	   FCD_LCDDisplay0_RawSend(0x02, 0);
	   delay_ms(2);
	#endif

}

//Makro-toteutukset

void FCM_tmr_service()
{
	
	//Increment the interrupt counter variable
	//Laskutoimitus:
	//  int_count = int_count + 1
	FCV_INT_COUNT = FCV_INT_COUNT + 1;
	

	//Has 1 second passed?
	//Päätös: int_count = 16?
	if (FCV_INT_COUNT == 16)
	{
		//Reset Interrupt counter& increment seconds
		//Laskutoimitus:
		//  int_count = 0
		//  seconds = seconds + 1
		FCV_INT_COUNT = 0;
		FCV_SECONDS = FCV_SECONDS + 1;
		

		//Laskutoimitus
		//Laskutoimitus:
		//  Disp_update = 1
		FCV_DISP_UPDATE = 1;
		

	}


}

void FCM_LCD_tulostus()
{
	
	//Kommentti:
	//Speed


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(0, 0)
	FCD_LCDDisplay0_Cursor(0, 0);


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::Tulostamerkkijono(kmh)
	FCD_LCDDisplay0_PrintString(FCV_KMH,FCSZ_KMH);


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::TulostaASCII("km/h ")
	FCD_LCDDisplay0_PrintASCII('k');
	FCD_LCDDisplay0_PrintASCII('m');
	FCD_LCDDisplay0_PrintASCII('/');
	FCD_LCDDisplay0_PrintASCII('h');
	FCD_LCDDisplay0_PrintASCII(' ');


	//Kommentti:
	//Trip


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(9, 0)
	FCD_LCDDisplay0_Cursor(9, 0);


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::Tulostamerkkijono(matka)
	FCD_LCDDisplay0_PrintString(FCV_MATKA,FCSZ_MATKA);


	//Kommentti:
	//Hours


	//Goto start of display
	//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(0, 1)
	FCD_LCDDisplay0_Cursor(0, 1);


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(hours)
	FCD_LCDDisplay0_PrintNumber(FCV_HOURS);


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::TulostaASCII(":")
	FCD_LCDDisplay0_PrintASCII(':');


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(minutes)
	FCD_LCDDisplay0_PrintNumber(FCV_MINUTES);


	//Kutsu komponenttimakro
	//Kutsu komponenttimakro: LCDDisplay(0)::TulostaASCII(":")
	FCD_LCDDisplay0_PrintASCII(':');


	//Print Seconds variable
	//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(seconds)
	FCD_LCDDisplay0_PrintNumber(FCV_SECONDS);


	//Laskutoimitus
	//Laskutoimitus:
	//  freq_float = 0
	//  freq_float2 = 0
	FCV_FREQ_FLOAT = 0;
	FCV_FREQ_FLOAT2 = 0;
	

}

void FCM_Kellon_laskutoimitus()
{
	
	//Seconds variable out of range?
	//Päätös: seconds >= 60?
	if (FCV_SECONDS >= 60)
	{
		//Update seconds variable
		//Laskutoimitus:
		//  minutes = minutes +1
		//  seconds = seconds - 60
		FCV_MINUTES = FCV_MINUTES +1;
		FCV_SECONDS = FCV_SECONDS - 60;
		

		//Kutsu komponenttimakro
		//Kutsu komponenttimakro: LCDDisplay(0)::Nollaa
		FCD_LCDDisplay0_Clear();


	}


	//Minuuttien nollaus ja tunnin lisäys
	//Päätös: minutes >= 60?
	if (FCV_MINUTES >= 60)
	{
		//Update seconds variable
		//Laskutoimitus:
		//  hours = hours +1
		//  minutes = minutes - 60
		FCV_HOURS = FCV_HOURS +1;
		FCV_MINUTES = FCV_MINUTES - 60;
		

	}


}

void FCM_Lue_tulo()
{
	
}

void FCM_LCD_tulostus_nopeus_matka()
{
	
}

void FCM_pulssi_laskutoimitus()
{
	
}

void FCM_tulo()
{
	
	//Tulo
	//Tulo: D1 -> in
	trisd = trisd | 0x02;
	FCV_IN = ((portd & 0x02) == 0x02);


}

void main()
{
	
	//alustus
	ansel = 0;
anselh = 0;


	//Keskeytyksen alustuskoodi
	option_reg = 0xC0;


	//Startup LCD
	//Kutsu komponenttimakro: LCDDisplay(0)::Start
	FCD_LCDDisplay0_Start();


	//
	//Laskutoimitus:
	//  int_count = 0
	//  seconds = 0
	//  minutes = 0
	//  hours = 0
	//  in = 0
	//  Disp_update = 0
	//  float_matka_total = 0
	//  float_matka = 0
	//  kmh_float = 0
	FCV_INT_COUNT = 0;
	FCV_SECONDS = 0;
	FCV_MINUTES = 0;
	FCV_HOURS = 0;
	FCV_IN = 0;
	FCV_DISP_UPDATE = 0;
	FCV_FLOAT_MATKA_TOTAL = 0;
	FCV_FLOAT_MATKA = 0;
	FCV_KMH_FLOAT = 0;
	

	//Collect Input
	//Kutsu makro: tulo
	FCM_tulo();


	//Enable Tmr0 Interrupts
	//Keskeytys: Salli TMR0
	cr_bit(option_reg,T0CS);
	st_bit(option_reg,T0SE);
	option_reg = (option_reg & 0xF0) | 0x07;
	st_bit(intcon,GIE);
	st_bit(intcon, T0IE);


	//Loop
	//Silmukka: While 1
	while (1)
	{
		//after 1 second
		//Päätös: Disp_update?
		if (FCV_DISP_UPDATE)
		{
			//Kutsu makro
			//Kutsu makro: LCD_tulostus
			FCM_LCD_tulostus();


			//Laskutoimitus
			//Laskutoimitus:
			//  Disp_update = 0
			FCV_DISP_UPDATE = 0;
			

		}


		//Kutsu makro
		//Kutsu makro: Kellon_laskutoimitus
		FCM_Kellon_laskutoimitus();


		//Kommentti:
		//Speed


		//Laskutoimitus
		//Laskutoimitus:
		//  kmh_float = fmul(freq_float,7.56)
		FCV_KMH_FLOAT = float32_mul(FCV_FREQ_FLOAT,7.56);
		

		//Kommentti:
		//Trip


		//Laskutoimitus
		//Laskutoimitus:
		//  float_matka = fmul(freq_float2,0.0021)
		//  float_matka_total = fsub(float_matka_total,float_matka)
		FCV_FLOAT_MATKA = float32_mul(FCV_FREQ_FLOAT2,0.0021);
		FCV_FLOAT_MATKA_TOTAL = float32_sub(FCV_FLOAT_MATKA_TOTAL,FCV_FLOAT_MATKA);
		

		//Merkkijonon käsittely
		//Merkkijonon käsittely:
		//  kmh = FloatToString$(kmh_float)
		//  matka = FloatToString$(float_matka_total)
		FCI_FLOAT_TO_STRING(FCV_KMH_FLOAT,6,FCV_KMH,FCSZ_KMH);
		FCI_FLOAT_TO_STRING(FCV_FLOAT_MATKA_TOTAL,6,FCV_MATKA,FCSZ_MATKA);
		

		//Wait Until Low Or Update flag set
		//Silmukka: While in = 1 && Disp_update = 0
		while (FCV_IN == 1 && FCV_DISP_UPDATE == 0)
		{
			//Collect Input
			//Kutsu makro: tulo
			FCM_tulo();


		}


		//Wait Until High Or Update flag set
		//Silmukka: While in = 0 &&Disp_update = 0
		while (FCV_IN == 0 &&FCV_DISP_UPDATE == 0)
		{
			//Collect Input
			//Kutsu makro: tulo
			FCM_tulo();


		}


		//Increment Count
		//Laskutoimitus:
		//  freq_float = fsub(freq_float,-1)
		//  freq_float2 = fsub(freq_float2,-1)
		FCV_FREQ_FLOAT = float32_sub(FCV_FREQ_FLOAT,-1);
		FCV_FREQ_FLOAT2 = float32_sub(FCV_FREQ_FLOAT2,-1);
		

	}


	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
	//Handler code for [TMR0]
	#ifndef MX_INTHANDLER_intcon_T0IF
	#define MX_INTHANDLER_intcon_T0IF
	if (ts_bit(intcon, T0IF) && ts_bit(intcon, T0IE))
	{
		#ifdef USE_FLOWCODE_ICD
			extern char ICD_Interrupt_Enable = 1;
		#endif	
		FCM_tmr_service();
		cr_bit(intcon, T0IF);
		#ifdef USE_FLOWCODE_ICD
			extern char ICD_Interrupt_Enable = 0;
		#endif	
	}
	#else
	#warning "This interrupt has previously been enabled, so the macro <tmr_service> may never get called."
	#endif


}



