//************************************************************************************
//**  
//**  File name:     L:\Documents\Documents\Flowcode Projects\Aquarium Controller Version 2011\Aquarium Controller Version 011-a00.c
//**  Generated by:  Flowcode v4.3.7.63
//**  Date:          Thursday, September 01, 2011 20:15:48
//**  Licence:       Professional
//**  Registered to: 2A1RRG
//**  
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_PIC

//Defines voor de microcontroller
#define P16F877A
#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

//Functies
#define MX_CLK_SPEED 19660800
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Configuratiegegevens
#ifdef _BOOSTC
#pragma DATA 0x2007, 0x3f3a
#endif
#ifdef HI_TECH_C
__CONFIG(0x3f3a);
#endif

//Interne functies
#include "C:\Program Files (x86)\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Macro functie declaraties
void FCM_Startup();
void FCM_Preparing();
void FCM_BuildUP_Display();
void FCM_Time_Date_DS1307();
void FCM_Display_Time();
void FCM_Display_Day();
void FCM_Display_Date();
void FCM_I2C_Bus_Init();


//Variable declaraties
char FCV_RTC_SEC_BCD;
char FCV_ONE_WIRE_SCANBUS;
char FCV_RTC_MIN_BCD;
char FCV_ONE_WIRE_DEVICECOUNT;
char FCV_RTC_DAY;
char FCV_RTC_VAR1;
char FCV_RTC_YEAR_BCD;
char FCV_ONE_WIRE_BUSRESET;
char FCV_RTC_VAR2;
char FCV_RTC_HR;
char FCV_RTC_SEC;
char FCV_RTC_MIN;
char FCV_SW0;
char FCV_RTC_DATE_BCD;
char FCV_RTC_MONTH_BCD;
char FCV_STARTUP_CHECK;
char FCV_RTC_HR_BCD;
char FCV_GENERAL_COUNTER;


//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
2 = Data 1_Pin
3 = Data 2 Pin
4 = Data 3 Pin
5 = Data 4 Pin
6 = RS Pin
7 = Enable Pin
LCD_1049572 = Unique Component Reference Number
4 = Row Count
20 = Column Count
******************************/

	//component connections
	#define LCD_1049572_PORT0    portb
	#define LCD_1049572_TRIS0    trisb
	#define LCD_1049572_PORT1    portb
	#define LCD_1049572_TRIS1    trisb
	#define LCD_1049572_PORT2    portb
	#define LCD_1049572_TRIS2    trisb
	#define LCD_1049572_PORT3    portb
	#define LCD_1049572_TRIS3    trisb
	#define LCD_1049572_PORT4    portb
	#define LCD_1049572_TRIS4    trisb
	#define LCD_1049572_PORT5    portb
	#define LCD_1049572_TRIS5    trisb
	#define LCD_1049572_BIT0    	2
	#define LCD_1049572_BIT1    	3
	#define LCD_1049572_BIT2    	4
	#define LCD_1049572_BIT3    	5
	#define LCD_1049572_RS      	6
	#define LCD_1049572_E       	7
	#define LCD_1049572_ROWCNT	4
	#define LCD_1049572_COLCNT	20

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




//LCDDisplay(0): //Macro functie declaraties

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);
//Defines:

/**** Macro Substitutions ****
0 = CRC Check Enable (0-Off / 1-On)
portc = One Wire Port Register
trisc = One Wire Data Direction Register
6 = One Wire Pin
%e = Clock Cycles For A 1us Delay
******************************/

#define CRC_CHECKING  	0
#define OO_PORT  		portc
#define OO_TRIS  		trisc
#define OO_PIN  		6

//Global Variables

char oo_scratchpad[9];
// Scratchpad contents
// 0	Temperature LSB
// 1	Temperature MSB
// 2	Hi alarm temperature
// 3	Lo alarm temperature
// 4	Reserved, 0xFF
// 5	Reserved, 0xFF
// 6	Remainder register
// 7	Nr of counts per degree
// 8	CRC of pad contents


// Commands for the OO
//    1. ROM function commands
#define        OO_READROM        	0x33
#define        OO_MATCHROM       	0x55
#define        OO_SKIPROM        	0xCC
#define        OO_SEARCHROM      	0xF0
#define        OO_ALARMSEARCH    	0xEC
//    2. Memory Command Functions
#define        OO_WRITEPAD       	0x4E
#define        OO_READPAD        	0xBE
#define        OO_COPYPAD        	0x48
#define        OO_CONVERTT       	0x44
#define        OO_RECALLE2			0xB8
#define        OO_READSUPPLY		0xB4


//I/O for the OO
#define Float_OO {set_bit(OO_TRIS, OO_PIN);}
#define Clear_OO {clear_bit(OO_TRIS, OO_PIN);	clear_bit(OO_PORT, OO_PIN);}


char FCD_One_Wire0_oo_get_next_id();
void FCD_One_Wire0_tx_bit(char out);
char FCD_One_Wire0_rx_bit();

// CRC working variable
char crc = 0;

//CRC for the OO
#if CRC_CHECKING == 1

	// CRC lookup table
	#ifdef _BOOSTC
		rom char* crc_rom = {0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
			157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
			35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
			190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
			70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
			219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
			101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
			248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
			140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
			17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
			175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
			50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
			202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
			87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
			233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
			116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
	#endif

	#ifdef HI_TECH_C
		const char crc_rom[] = {0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
			157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
			35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
			190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
			70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
			219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
			101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
			248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
			140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
			17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
			175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
			50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
			202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
			87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
			233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
			116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
	#endif

#endif


// Internal variables
char        id[8];
signed char conflict;
char        new_conflict;


//Device ID Variables
char num_devices = 0;
char DevID[64] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};




//One_Wire(0): //Macro functie declaraties

void FCD_One_Wire0_oo_crc_shuffle_byte(char input);
void FCD_One_Wire0_oo_crc_init();
char FCD_One_Wire0_rx_bit();
void FCD_One_Wire0_tx_bit(char out);
char FCD_One_Wire0_oo_get_next_id();
char FCD_One_Wire0_oo_busreset();
char FCD_One_Wire0_oo_get_pad_byte(char index);
void FCD_One_Wire0_oo_tx_byte(char data);
char FCD_One_Wire0_oo_rx_byte();
char FCD_One_Wire0_oo_scanbus();
char FCD_One_Wire0_oo_get_devicecount();
char FCD_One_Wire0_oo_read_device(char count);
char FCD_One_Wire0_oo_get_IDByte(char device, char octet);
char FCD_One_Wire0_DS1820_start_conversion();
char FCD_One_Wire0_DS1820_read_scratchpad();
short FCD_One_Wire0_DS1820_get_temp();
//Defines:

/**** Macro Substitutions ****
0 = SM BUS Enable
0 = Slew Rate Enable
25 = Baud Rate
1 = Hardware or Bitbanged I2C
portd = Bitbanged Port Register
trisd = Bitbanged Data Direction Register
3 = Bitbanged Clock Pin
4 = Bitbanged Data Pin
MI2C_5834788 = Unique component ID
******************************/

//common defines
#define MI2C_5834788_MX_MI2C_SMBUS  	0
#define MI2C_5834788_MX_MI2C_SLEW  	0
#define MI2C_5834788_MX_MI2C_BAUD 	25
#define MI2C_5834788_MX_HARDWARE  	1
#define MI2C_5834788_MX_PORT		  	portd
#define MI2C_5834788_MX_TRIS  		trisd
#define MI2C_5834788_MX_SCL  			3
#define MI2C_5834788_MX_SDA  			4

#define MI2C_5834788_MX_I2C_DELAY 	delay_us(10);
#define MI2C_5834788_SET_SCL			set_bit(MI2C_5834788_MX_TRIS,MI2C_5834788_MX_SCL);
#define MI2C_5834788_CLEAR_SCL		{clear_bit(MI2C_5834788_MX_TRIS,MI2C_5834788_MX_SCL); clear_bit(MI2C_5834788_MX_PORT,MI2C_5834788_MX_SCL);}
#define MI2C_5834788_SET_SDA			set_bit(MI2C_5834788_MX_TRIS,MI2C_5834788_MX_SDA);
#define MI2C_5834788_CLEAR_SDA		{clear_bit(MI2C_5834788_MX_TRIS,MI2C_5834788_MX_SDA); clear_bit(MI2C_5834788_MX_PORT,MI2C_5834788_MX_SDA);}




//I2C_Master(0): //Macro functie declaraties

void FCD_I2C_Master0_MI2C_Init();
void FCD_I2C_Master0_MI2C_Start();
void FCD_I2C_Master0_MI2C_Restart();
void FCD_I2C_Master0_MI2C_Stop();
char FCD_I2C_Master0_MI2C_Transmit_Byte(char Data);
char FCD_I2C_Master0_MI2C_Receive_Byte(char Last);
void FCD_I2C_Master0_MI2C_Send_Byte_Transaction(char Device_ID, char AddrH, char AddrL, char Data);
char FCD_I2C_Master0_MI2C_Receive_Byte_Transaction(char Device_ID, char AddrH, char AddrL);



//LCDDisplay(0): //Macro implementaties


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

		clear_bit(LCD_1049572_PORT0, LCD_1049572_BIT0);
		clear_bit(LCD_1049572_PORT1, LCD_1049572_BIT1);
		clear_bit(LCD_1049572_PORT2, LCD_1049572_BIT2);
		clear_bit(LCD_1049572_PORT3, LCD_1049572_BIT3);
		clear_bit(LCD_1049572_PORT4, LCD_1049572_RS);
		clear_bit(LCD_1049572_PORT5, LCD_1049572_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_1049572_PORT0, LCD_1049572_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_1049572_PORT1, LCD_1049572_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_1049572_PORT2, LCD_1049572_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_1049572_PORT3, LCD_1049572_BIT3);
		if (mask)
		    set_bit(LCD_1049572_PORT4, LCD_1049572_RS);
		LCD_1049572_DELAY;
		set_bit (LCD_1049572_PORT5, LCD_1049572_E);
		LCD_1049572_DELAY;
		clear_bit (LCD_1049572_PORT5, LCD_1049572_E);
		pt = (in & 0x0f);
		LCD_1049572_DELAY;
		clear_bit(LCD_1049572_PORT0, LCD_1049572_BIT0);
		clear_bit(LCD_1049572_PORT1, LCD_1049572_BIT1);
		clear_bit(LCD_1049572_PORT2, LCD_1049572_BIT2);
		clear_bit(LCD_1049572_PORT3, LCD_1049572_BIT3);
		clear_bit(LCD_1049572_PORT4, LCD_1049572_RS);
		clear_bit(LCD_1049572_PORT5, LCD_1049572_E);
		if (pt & 0x01)
		    set_bit(LCD_1049572_PORT0, LCD_1049572_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_1049572_PORT1, LCD_1049572_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_1049572_PORT2, LCD_1049572_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_1049572_PORT3, LCD_1049572_BIT3);
		if (mask)
		    set_bit(LCD_1049572_PORT4, LCD_1049572_RS);
		LCD_1049572_DELAY;
		set_bit (LCD_1049572_PORT5, LCD_1049572_E);
		LCD_1049572_DELAY;
		clear_bit (LCD_1049572_PORT5, LCD_1049572_E);
		LCD_1049572_DELAY;
}

void FCD_LCDDisplay0_Start()
{
	
		clear_bit(LCD_1049572_TRIS0, LCD_1049572_BIT0);
		clear_bit(LCD_1049572_TRIS1, LCD_1049572_BIT1);
		clear_bit(LCD_1049572_TRIS2, LCD_1049572_BIT2);
		clear_bit(LCD_1049572_TRIS3, LCD_1049572_BIT3);
		clear_bit(LCD_1049572_TRIS4, LCD_1049572_RS);
		clear_bit(LCD_1049572_TRIS5, LCD_1049572_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);

}

void FCD_LCDDisplay0_Clear()
{
	
		FCD_LCDDisplay0_RawSend(0x01, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x02, 0);
		Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_PrintASCII(char Character)
{
	
		FCD_LCDDisplay0_RawSend(Character, 0x10);

}

void FCD_LCDDisplay0_Command(char in)
{
	
		FCD_LCDDisplay0_RawSend(in, 0);
		Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_Cursor(char x, char y)
{
	
	  #if (LCD_1049572_ROWCNT == 1)
	    y=0x80;
	  #endif

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

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

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

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

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

}

void FCD_LCDDisplay0_PrintNumber(short Number)
{
	
		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);

}

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

		for (idx=0; idx<MSZ_String; idx++)
		{
			#ifdef _BOOSTC
				if (String[idx] == 0)
				{
					break;
				}
				FCD_LCDDisplay0_RawSend(String[idx], 0x10);
			#endif

			#ifdef HI_TECH_C
				if (*String == 0)
				{
					break;
				}
				FCD_LCDDisplay0_RawSend(*String, 0x10);
				String++;
			#endif
		}

}

void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions)
{
	
		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);
		}

}

void FCD_LCDDisplay0_ClearLine(char Line)
{
	
		char count;
		char rowcount;

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

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

		#if (LCD_1049572_ROWCNT == 4)
			#if (LCD_1049572_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_1049572_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);

}

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
	   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);
}



//One_Wire(0): //Macro implementaties


void FCD_One_Wire0_oo_crc_shuffle_byte(char input)
{
		#if CRC_CHECKING == 1
			crc = crc_rom[crc ^ input];
		#endif
}

void FCD_One_Wire0_oo_crc_init()
{
		#if CRC_CHECKING == 1
			crc = 0;
		#endif
}

char FCD_One_Wire0_rx_bit()
{
		char oo_bit, count;
		Clear_OO;							//Clear Output Pin
		delay_us(1);						//Delay 1us
		Float_OO;							//Float Output Pin
		delay_us(10);						//Delay 10us
		oo_bit = test_bit(OO_PORT, OO_PIN);	//Test Input
		delay_us(50);						//Delay 50us
		return oo_bit;
}

void FCD_One_Wire0_tx_bit(char out)
{
		char count;
		Clear_OO;							//Clear Output Pin
		delay_us(1);						//Delay 1us
		if (out & 0x01)
			Float_OO;						//Float Output Pin
		delay_us(60);						//Delay 60us
		Float_OO;							//Float Output Pin
		delay_us(10);						//Delay 10us
}

char FCD_One_Wire0_oo_get_next_id()
{
		char val0 = 0;
		char val1 = 0;
		char counter    = 0;
		char bit_index  = 0;
		char byte_index = 0;
		//char current_conflict = -1;

		//added JCMB 10/01/09
		char lz_selected = 0;
		char go_on = 0;
		char bit_test;

		new_conflict = 0;

		if ( FCD_One_Wire0_oo_busreset() )	// Reset the bus
		{
			return 1; // -> error
		}
		// Issue the search ROM command
		FCD_One_Wire0_oo_tx_byte(OO_SEARCHROM);

		// Start the search for the sensor
		for (byte_index = 0; byte_index < 8; byte_index++)
		{
			char data_in_byte = 0;
			for (bit_index = 0; bit_index < 8; bit_index++)
			{
				// Read 2 consecutive bits from the One Wire bus
				val0 = FCD_One_Wire0_rx_bit();						//Test Input
				val1 = FCD_One_Wire0_rx_bit();						//Test Input

				// Evaluate the result
				if ((val0 == 0) && (val1 == 0))
				{
					//current_conflict = counter;
					// if conflict occurs earlier than the previous conflict, then use the previous value
					if (counter < conflict)
					{
						// use previous value
						bit_test = id[byte_index] >> bit_index;		//added JCMB 10/01/09
						if (bit_test & 0x01)
						{
							val0 = 1;
						}
						else
						{
							val0 = 0;
							lz_selected = counter;				//added JCMB 10/01/09
							go_on = 1;							//added JCMB 10/01/09
						}
					}
					else if (counter == conflict)
					{
						// use 1
						val0 = 1;
					}
					else
					{
						// use zero on new conflicts
						val0 = 0;
						conflict = counter;
						new_conflict = 1;
					}
				}
				else if (val0 && val1) // 1 et 1 impossible
				{
					return 2;
				}
				// Store the bit in the ID array
				data_in_byte = data_in_byte >> 1;
				if (val0)
				{
					data_in_byte |= 0x80;
				}

				FCD_One_Wire0_tx_bit(val0);

				counter++;
			}
			id[byte_index] = data_in_byte;
		}

	        //added JCMB 10/01/09
		if ((new_conflict == 0) && go_on)
		{
			new_conflict = 1;
			conflict = lz_selected ;
		}

		// Verify ID CRC
		#if CRC_CHECKING == 1
			FCD_One_Wire0_oo_crc_init();
		#endif

		for (byte_index = 0; byte_index < 8; byte_index++)
		{
			#if CRC_CHECKING == 1
					FCD_One_Wire0_oo_crc_shuffle_byte(id[byte_index]);
			#endif
		}
		// Bail on CRC errors
	#if CRC_CHECKING == 1
		if (crc) return crc;
	#endif
		return 0;
}

char FCD_One_Wire0_oo_busreset()
{
		Float_OO; 						// Release bus
		Clear_OO;						// Send the reset pulse
		delay_us(200);					// Wait for 600 µs, this is the reset pulse
		delay_us(200);
		delay_us(200);
		Float_OO; 						// Release bus
		delay_us(60);					// Wait 60 us (release) let device drive the bus
		if (test_bit(OO_PORT, OO_PIN) == 1)	// Now sample, if there is a sensor on the bus, the line should be low
			return 1; 					// <<-error
		delay_us(140);					// Wait another 540 us to complete the reset sequence
		delay_us(200);
		delay_us(200);
		return 0;
}

char FCD_One_Wire0_oo_get_pad_byte(char index)
{
		return oo_scratchpad[index];
}

void FCD_One_Wire0_oo_tx_byte(char data)
{
		char counter = 0;
		while (counter < 8)
		{
			FCD_One_Wire0_tx_bit(data);
			data = data >> 1;				//Rotate to next bit of data
			counter++;						//Increment Counter
		}
}

char FCD_One_Wire0_oo_rx_byte()
{
		char counter = 0;
		char data    = 0;
		char oo_bit  = 0;
		while (counter < 8)
		{
			oo_bit = FCD_One_Wire0_rx_bit();
			data = data >> 1;					//Shift incoming data to next bit
			if (oo_bit > 0)
			{
				data = data | 0x80;				//Append incoming bit to data byte
			}
			counter++;							//Increment Counter
		}
		#ifdef OO_CRC_CHECKING
			FCD_One_Wire0_oo_crc_shuffle_byte(data);			//Check CRC
		#endif
		return data;
}

char FCD_One_Wire0_oo_scanbus()
{
		char retval = 0;
		char device_count = 0;
		char loper;
		conflict = -1;
		new_conflict = 1;
		// Reset the bus, wake up devices.
		retval = FCD_One_Wire0_oo_busreset();
		if (retval == 1)
		{
			return 255; // -> error
		}
		// new_conflict gets updated in the FCD_One_Wire0_oo_get_next_id() function.
		while (new_conflict)
		{
			retval = FCD_One_Wire0_oo_get_next_id();
			// Bail in case of errors
			if (retval) return retval;
			// Add the device id to EEPROM
			for (loper=0; loper < 8; loper++)
			{
				DevID[loper+(device_count<<3)] = id[loper];
			}
			device_count++;
		}
		// Write number of devices to the EEPROM
		num_devices = device_count;
		return 0;
}

char FCD_One_Wire0_oo_get_devicecount()
{
		return num_devices;
}

char FCD_One_Wire0_oo_read_device(char count)
{
		char loper = 0;
		char counter = 0;
		char temp;
		short value;
		FCD_One_Wire0_oo_busreset();
		FCD_One_Wire0_oo_tx_byte(OO_MATCHROM);
		for (loper=0; loper < 8; loper++)
		{
			id[loper] = DevID[loper+(count<<3)];
			FCD_One_Wire0_oo_tx_byte(id[loper]);
		}
		FCD_One_Wire0_oo_tx_byte(OO_READPAD);
		#if CRC_CHECKING == 1
			FCD_One_Wire0_oo_crc_init();			//Reset the CRC register, CRC is updated in the FCD_One_Wire0_oo_rx_byte() function.
		#endif
		while (counter < 9)
		{
			temp = FCD_One_Wire0_oo_rx_byte();
			oo_scratchpad[counter] = temp;
			counter++;
		}
		#if CRC_CHECKING == 1
			return crc;				//Verify the CRC
		#endif
		return 0;
}

char FCD_One_Wire0_oo_get_IDByte(char device, char octet)
{
		char retval = 255;
		if ((device >= num_devices) | (octet > 7))
		{
			return retval ; //error
		}
	        retval = DevID[octet+(device<<3)];
		return retval ;
}

char FCD_One_Wire0_DS1820_start_conversion()
{
		char in = 0;
		char counter = 0;
		FCD_One_Wire0_oo_busreset();
		FCD_One_Wire0_oo_tx_byte(OO_SKIPROM);		// Command all temp sensors on the bus to start a conversion
		FCD_One_Wire0_oo_tx_byte(OO_CONVERTT);	// Convert temperature
		while (in == 0)
		{
			in = FCD_One_Wire0_oo_rx_byte();
			delay_ms(4);
			counter++;
			if (counter == 0xFF)		// Security: if the conversion is not completed
				return 1;				// after > 1 sec -> break.
		}
		return 0;
}

char FCD_One_Wire0_DS1820_read_scratchpad()
{
		char temp;
		char counter = 0;
		if ( FCD_One_Wire0_oo_busreset() )
			return (1);
		FCD_One_Wire0_oo_tx_byte(OO_SKIPROM);		//Command all temp sensors on the bus to start a conversion
		FCD_One_Wire0_oo_tx_byte(OO_READPAD);		//Convert temperature
		#if CRC_CHECKING == 1
			FCD_One_Wire0_oo_crc_init();			//Reset the CRC register, CRC is updated in the FCD_One_Wire0_oo_rx_byte() function.
		#endif
		while (counter < 9)
		{
			temp = FCD_One_Wire0_oo_rx_byte();
			oo_scratchpad[counter] = temp;
			counter++;
		}
		#if CRC_CHECKING == 1
			return crc;				//Verify the CRC
		#endif
		return 0;
}

short FCD_One_Wire0_DS1820_get_temp()
{
		short retval;
		retval = oo_scratchpad[1];
		retval = retval << 8;
		retval = retval | oo_scratchpad[0];
		return retval;
}



//I2C_Master(0): //Macro implementaties


void FCD_I2C_Master0_MI2C_Init()
{
		#if MI2C_5834788_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				#ifdef MX_I2C_A
					#define MI2C_5834788_MX_I2C_TRIS trisa
				#endif
				#ifdef MX_I2C_B
					#define MI2C_5834788_MX_I2C_TRIS trisb
				#endif
				#ifdef MX_I2C_C
					#define MI2C_5834788_MX_I2C_TRIS trisc
				#endif
				#ifdef MX_I2C_D
					#define MI2C_5834788_MX_I2C_TRIS trisd
				#endif
				#if MI2C_5834788_MX_MI2C_SLEW == 1
					cr_bit (sspstat,SMP);					//Slew Rate Control Enabled
				#else
					st_bit (sspstat,SMP);					//Slew Rate Control Disabled
				#endif
				#if MI2C_5834788_MX_MI2C_SMBUS == 1
					st_bit (sspstat,CKE);					//Enable SMBus specific inputs
				#else
					cr_bit (sspstat,CKE);					//Disable SMBus specific inputs
				#endif

				#ifdef _BOOSTC
				  #ifdef SSPCON
					sspcon = 0x28;								//Setup I2C into Master Mode
				  #endif
				  #ifdef SSPCON1
					sspcon1 = 0x28;								//Setup I2C into Master Mode
				  #endif
				#endif

				#ifdef HI_TECH_C
				  #ifdef sspcon
					sspcon = 0x28;								//Setup I2C into Master Mode
				  #endif
				  #ifdef sspcon1
					sspcon1 = 0x28;								//Setup I2C into Master Mode
				  #endif
				#endif

				sspadd = MI2C_5834788_MX_MI2C_BAUD;						//Set the Baud Rate
				sspcon2 = 0x00;								//Clear the control bits
				st_bit(intcon, GIE);
				set_bit(MI2C_5834788_MX_TRIS, MI2C_5834788_MX_SCL);			//Configure SCL as Input
				set_bit(MI2C_5834788_MX_TRIS, MI2C_5834788_MX_SDA);			//Configure SDA as Input
			#endif
		#else												//Use Software
	    	clear_bit(MI2C_5834788_MX_PORT,MI2C_5834788_MX_SCL);						//Set Outputs to 0
			clear_bit(MI2C_5834788_MX_PORT,MI2C_5834788_MX_SDA);
			MI2C_5834788_SET_SDA;										//Configure SDA as Input
			MI2C_5834788_SET_SCL;										//Configure SCL as Input
		#endif
}

void FCD_I2C_Master0_MI2C_Start()
{
		#if MI2C_5834788_MX_HARDWARE == 1								//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				st_bit(sspcon2,SEN);						//Initiate start condition
				while(ts_bit(sspcon2,SEN));					//Wait for start bit to be generated
			#endif
		#else												//Use Software I2C
			MI2C_5834788_SET_SCL;										//Make Sure SCL is Set
			MI2C_5834788_SET_SDA;										//Make Sure SDA is Set
			MI2C_5834788_MX_I2C_DELAY;									//Small Delay
			MI2C_5834788_CLEAR_SDA;										//Clear SDA
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_CLEAR_SCL;										//Clear SCL
			MI2C_5834788_MX_I2C_DELAY;
		#endif
}

void FCD_I2C_Master0_MI2C_Restart()
{
		#if MI2C_5834788_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				st_bit(sspcon2,RSEN);						//Initiate restart condition
				while(ts_bit(sspcon2,RSEN));				//Wait for restart bit to be generated
			#endif
		#else												//Use Software I2C
			MI2C_5834788_SET_SDA;										//Set SDA High
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_SET_SCL;										//Set SCL High
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_CLEAR_SDA;										//Set SDA Low
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_CLEAR_SCL;										//Set SCL Low
			MI2C_5834788_MX_I2C_DELAY;
		#endif
}

void FCD_I2C_Master0_MI2C_Stop()
{
		#if MI2C_5834788_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				st_bit(sspcon2,PEN);						//Initiate stop condition
				while(ts_bit(sspcon2,PEN));					//Wait for stop bit to be generated
				delay_ms(10);								//Wait before reusing the I2C BUS
			#endif
		#else												//Use Software I2C
			MI2C_5834788_CLEAR_SCL;										//Set SCL Low
			MI2C_5834788_CLEAR_SDA;										//Set SDA Low
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_SET_SCL;										//Set SCL High
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_SET_SDA;										//Set SDA High
			delay_ms(10);									//Wait before reusing the I2C BUS
		#endif
}

char FCD_I2C_Master0_MI2C_Transmit_Byte(char Data)
{
		#if MI2C_5834788_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				sspbuf=Data;								//Send byte
				while(ts_bit(pir1,SSPIF) == 0);				//Wait for control bit to be sent
				if(ts_bit(sspcon2,ACKSTAT))					//Check Acknowledgement
					return (1);								//No Acknowledgement
				else return (0);							//Acknowledgement received
			#endif
		#else												//Use Software I2C
			char bit_mask;
			char local_ack = 0;
			for(bit_mask=0x80;bit_mask;bit_mask=bit_mask>>1)
			{
				if(Data & bit_mask)
				{
					MI2C_5834788_SET_SDA;								//Set SDA High
				} else {
					MI2C_5834788_CLEAR_SDA;								//Set SDA Low
				}
				MI2C_5834788_MX_I2C_DELAY;
				MI2C_5834788_SET_SCL;									//Set SCL High
				MI2C_5834788_MX_I2C_DELAY;
				MI2C_5834788_CLEAR_SCL;									//Set SCL Low
				MI2C_5834788_MX_I2C_DELAY;
			}
			MI2C_5834788_SET_SDA;										//Set SDA High
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_SET_SCL;										//Set SCL High
			MI2C_5834788_MX_I2C_DELAY;
			if (test_bit(MI2C_5834788_MX_PORT,MI2C_5834788_MX_SDA))					//Get the Status Bit
				local_ack = 1;
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_CLEAR_SCL;										//Set SCL Low
			MI2C_5834788_MX_I2C_DELAY;
			return (local_ack);								//0 = Ack received : 1 = Ack not received
		#endif
}

char FCD_I2C_Master0_MI2C_Receive_Byte(char Last)
{
		#if MI2C_5834788_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				st_bit(sspcon2,RCEN);						//Initiate Read
				while(ts_bit(pir1,SSPIF) == 0);				//Wait for data read
				if (Last)
					st_bit(sspcon2,ACKDT);					//Send Nack
				else cr_bit(sspcon2,ACKDT);					//Send Ack
				st_bit(sspcon2,ACKEN);						//Initiate Nack
				while(ts_bit(sspcon2,ACKEN));				//Wait for data read
				return(sspbuf);								//Store incoming data
			#endif
		#else												//Use Software I2C
			char bit_mask;
			char Data = 0;
			char local_ack;
			MI2C_5834788_SET_SDA;										//Set SDA High
			MI2C_5834788_MX_I2C_DELAY;
			for(bit_mask=0x80;bit_mask;bit_mask=bit_mask>>1)
			{
				MI2C_5834788_SET_SCL;									//Set SCL High
				MI2C_5834788_MX_I2C_DELAY;
				MI2C_5834788_SET_SDA;
				if(test_bit(MI2C_5834788_MX_PORT,MI2C_5834788_MX_SDA))				//Read Incoming Bit
					Data = Data | bit_mask;					//Add data to variable
				MI2C_5834788_CLEAR_SCL;									//Set SCL Low
				MI2C_5834788_MX_I2C_DELAY;
			}
			if (Last)										//Acknowledge?
			{
				MI2C_5834788_SET_SDA;									//Send Nack
			} else {
				MI2C_5834788_CLEAR_SDA;									//Send Ack
			}
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_SET_SCL;										//Set SCL High
			MI2C_5834788_MX_I2C_DELAY;
			MI2C_5834788_CLEAR_SCL;										//Set SCL Low
			MI2C_5834788_MX_I2C_DELAY;
			return (Data);
		#endif
}

void FCD_I2C_Master0_MI2C_Send_Byte_Transaction(char Device_ID, char AddrH, char AddrL, char Data)
{
	
		Device_ID = Device_ID << 1;			//Shift Device ID to enable write mode

		FCD_I2C_Master0_MI2C_Start();						//Start transaction
		FCD_I2C_Master0_MI2C_Transmit_Byte(Device_ID);		//Transmit Device Address
		FCD_I2C_Master0_MI2C_Transmit_Byte(AddrH);			//Transmit Internal Address
		FCD_I2C_Master0_MI2C_Transmit_Byte(AddrL);
		FCD_I2C_Master0_MI2C_Transmit_Byte(Data);			//Send Data byte
		FCD_I2C_Master0_MI2C_Stop();						//Stop Transaction

}

char FCD_I2C_Master0_MI2C_Receive_Byte_Transaction(char Device_ID, char AddrH, char AddrL)
{
	
		char RetVal = 0;
		Device_ID = Device_ID << 1;			//Shift Device ID to enable write mode

		FCD_I2C_Master0_MI2C_Start();						//Start transaction
		FCD_I2C_Master0_MI2C_Transmit_Byte(Device_ID);		//Transmit Device Address
		FCD_I2C_Master0_MI2C_Transmit_Byte(AddrH);			//Transmit Internal Address
		FCD_I2C_Master0_MI2C_Transmit_Byte(AddrL);
		FCD_I2C_Master0_MI2C_Restart();						//Restart transaction

		Device_ID = Device_ID | 0x01;		//Change Device ID to read mode
		FCD_I2C_Master0_MI2C_Transmit_Byte(Device_ID);		//Transmit Device Address
		RetVal = FCD_I2C_Master0_MI2C_Receive_Byte(1);		//Read data at address
		FCD_I2C_Master0_MI2C_Stop();						//Stop Transaction

		return RetVal;						//Return data

}

//Macro implementaties

void FCM_Startup()
{
	
	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Start
	FCD_LCDDisplay0_Start();


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Clear
	FCD_LCDDisplay0_Clear();


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Starting Device")
	FCD_LCDDisplay0_PrintString("Starting Device",15);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: One_Wire_BusReset=One_Wire(0)::oo_busreset
	FCV_ONE_WIRE_BUSRESET = FCD_One_Wire0_oo_busreset();


	//Component Macro Aanroepen
	//Component Macro Aanroepen: One_Wire_ScanBus=One_Wire(0)::oo_scanbus
	FCV_ONE_WIRE_SCANBUS = FCD_One_Wire0_oo_scanbus();


	//Component Macro Aanroepen
	//Component Macro Aanroepen: One_Wire_DeviceCount=One_Wire(0)::oo_get_devicecount
	FCV_ONE_WIRE_DEVICECOUNT = FCD_One_Wire0_oo_get_devicecount();


	//Delay
	//Delay: 1 s
	delay_s(1);


	//Decision
	//Decision: One_Wire_BusReset = 0?
	if (FCV_ONE_WIRE_BUSRESET == 0)
	{
		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 2)
		FCD_LCDDisplay0_Cursor(0, 2);


		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Devices are present")
		FCD_LCDDisplay0_PrintString("Devices are present",19);


	} else {
		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 2)
		FCD_LCDDisplay0_Cursor(0, 2);


		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::PrintString("No Device Present")
		FCD_LCDDisplay0_PrintString("No Device Present",17);


	}


	//Delay
	//Delay: 3 s
	delay_s(3);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Wis lijn(2)
	FCD_LCDDisplay0_ClearLine(2);


	//Decision
	//Decision: One_Wire_ScanBus == 0?
	if (FCV_ONE_WIRE_SCANBUS == 0)
	{
		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 2)
		FCD_LCDDisplay0_Cursor(0, 2);


		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Error on Bus")
		FCD_LCDDisplay0_PrintString("Error on Bus",12);


		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::Cursor(13, 2)
		FCD_LCDDisplay0_Cursor(13, 2);


		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::PrintNumber(One_Wire_ScanBus)
		FCD_LCDDisplay0_PrintNumber(FCV_ONE_WIRE_SCANBUS);


	} else {
		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 2)
		FCD_LCDDisplay0_Cursor(0, 2);


		//Component Macro Aanroepen
		//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Bus OK")
		FCD_LCDDisplay0_PrintString("Bus OK",6);


	}


	//Delay
	//Delay: 3 s
	delay_s(3);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Wis lijn(2)
	FCD_LCDDisplay0_ClearLine(2);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 2)
	FCD_LCDDisplay0_Cursor(0, 2);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Working Devices:")
	FCD_LCDDisplay0_PrintString("Working Devices:",16);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Cursor(16, 2)
	FCD_LCDDisplay0_Cursor(16, 2);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintNumber(One_Wire_DeviceCount)
	FCD_LCDDisplay0_PrintNumber(FCV_ONE_WIRE_DEVICECOUNT);


	//Delay
	//Delay: 3 s
	delay_s(3);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Wis lijn(2)
	FCD_LCDDisplay0_ClearLine(2);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 2)
	FCD_LCDDisplay0_Cursor(0, 2);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Preparing i2c Bus")
	FCD_LCDDisplay0_PrintString("Preparing i2c Bus",17);


	//Delay
	//Delay: 3 s
	delay_s(3);


}

void FCM_Preparing()
{
	
	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Clear
	FCD_LCDDisplay0_Clear();


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Preparing Device")
	FCD_LCDDisplay0_PrintString("Preparing Device",16);


	//Delay
	//Delay: 600 ms
	delay_ms(255);
	delay_ms(255);
	delay_ms(90);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 2)
	FCD_LCDDisplay0_Cursor(0, 2);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Building Menu")
	FCD_LCDDisplay0_PrintString("Building Menu",13);


	//Delay
	//Delay: 3 s
	delay_s(3);


}

void FCM_BuildUP_Display()
{
	
	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Clear
	FCD_LCDDisplay0_Clear();


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Water Temp:")
	FCD_LCDDisplay0_PrintString("Water Temp:",11);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 1)
	FCD_LCDDisplay0_Cursor(0, 1);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Light Level:")
	FCD_LCDDisplay0_PrintString("Light Level:",12);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 2)
	FCD_LCDDisplay0_Cursor(0, 2);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("pH Level:")
	FCD_LCDDisplay0_PrintString("pH Level:",9);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 3)
	FCD_LCDDisplay0_Cursor(0, 3);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString("Retrieving Info...")
	FCD_LCDDisplay0_PrintString("Retrieving Info...",18);


}

void FCM_Time_Date_DS1307()
{
	
	//
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//ecrire
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Transmit_Byte(0xD0)
	FCD_I2C_Master0_MI2C_Transmit_Byte(0xD0);


	//reg0
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Transmit_Byte(0)
	FCD_I2C_Master0_MI2C_Transmit_Byte(0);


	//restart
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Restart
	FCD_I2C_Master0_MI2C_Restart();


	//lecture
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Transmit_Byte(0xD1)
	FCD_I2C_Master0_MI2C_Transmit_Byte(0xD1);


	//second
	//Component Macro Aanroepen: RTC_SEC_BCD=I2C_Master(0)::MI2C_Receive_Byte(0)
	FCV_RTC_SEC_BCD = FCD_I2C_Master0_MI2C_Receive_Byte(0);


	//minut
	//Component Macro Aanroepen: RTC_MIN_BCD=I2C_Master(0)::MI2C_Receive_Byte(0)
	FCV_RTC_MIN_BCD = FCD_I2C_Master0_MI2C_Receive_Byte(0);


	//hour
	//Component Macro Aanroepen: RTC_HR_BCD=I2C_Master(0)::MI2C_Receive_Byte(1)
	FCV_RTC_HR_BCD = FCD_I2C_Master0_MI2C_Receive_Byte(1);


	//
	//Component Macro Aanroepen: I2C(0)::MI2C_Stop
	FCD_I2C0_MI2C_Stop();


}

void FCM_Display_Time()
{
	
	//
	//Calculation:
	//  RTC_var1 = RTC_SEC_BCD AND 0x0F
	//  RTC_var2 = ( RTC_SEC_BCD >> 4 ) AND 0x07
	//  RTC_SEC = RTC_var1 + ( RTC_var2 * 10 )
	//  RTC_var1 = RTC_MIN_BCD AND 0x0F
	//  RTC_var2 = ( RTC_MIN_BCD >> 4 ) AND 0x07
	//  RTC_MIN = RTC_var1 + ( RTC_var2 * 10 )
	//  RTC_var1 = RTC_HR_BCD AND 0x0F
	//  RTC_var2 = ( RTC_HR_BCD >> 4 ) AND 0x03
	//  RTC_HR = RTC_var1 + ( RTC_var2 * 10 )
	FCV_RTC_VAR1 = FCV_RTC_SEC_BCD & 0x0F;
	FCV_RTC_VAR2 = ( FCV_RTC_SEC_BCD >> 4 ) & 0x07;
	FCV_RTC_SEC = FCV_RTC_VAR1 + ( FCV_RTC_VAR2 * 10 );
	FCV_RTC_VAR1 = FCV_RTC_MIN_BCD & 0x0F;
	FCV_RTC_VAR2 = ( FCV_RTC_MIN_BCD >> 4 ) & 0x07;
	FCV_RTC_MIN = FCV_RTC_VAR1 + ( FCV_RTC_VAR2 * 10 );
	FCV_RTC_VAR1 = FCV_RTC_HR_BCD & 0x0F;
	FCV_RTC_VAR2 = ( FCV_RTC_HR_BCD >> 4 ) & 0x03;
	FCV_RTC_HR = FCV_RTC_VAR1 + ( FCV_RTC_VAR2 * 10 );
	

	//Component Macro Aanroepen
	//Component Macro Aanroepen: LCDDisplay(0)::Cursor(0, 3)
	FCD_LCDDisplay0_Cursor(0, 3);


	//N < 10
	//Decision: RTC_HR < 10?
	if (FCV_RTC_HR < 10)
	{
		//add 0
		//Component Macro Aanroepen: LCDDisplay(0)::PrintNumber(0)
		FCD_LCDDisplay0_PrintNumber(0);


	}


	//hour
	//Component Macro Aanroepen: LCDDisplay(0)::PrintNumber(RTC_HR)
	FCD_LCDDisplay0_PrintNumber(FCV_RTC_HR);


	//
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString(":")
	FCD_LCDDisplay0_PrintString(":",1);


	//N < 10
	//Decision: RTC_MIN < 10?
	if (FCV_RTC_MIN < 10)
	{
		//add 0
		//Component Macro Aanroepen: LCDDisplay(0)::PrintNumber(0)
		FCD_LCDDisplay0_PrintNumber(0);


	}


	//min
	//Component Macro Aanroepen: LCDDisplay(0)::PrintNumber(RTC_MIN)
	FCD_LCDDisplay0_PrintNumber(FCV_RTC_MIN);


	//
	//Component Macro Aanroepen: LCDDisplay(0)::PrintString(":")
	FCD_LCDDisplay0_PrintString(":",1);


	//N < 10
	//Decision: RTC_SEC < 10?
	if (FCV_RTC_SEC < 10)
	{
		//add 0
		//Component Macro Aanroepen: LCDDisplay(0)::PrintNumber(0)
		FCD_LCDDisplay0_PrintNumber(0);


	}


	//sec
	//Component Macro Aanroepen: LCDDisplay(0)::PrintNumber(RTC_SEC)
	FCD_LCDDisplay0_PrintNumber(FCV_RTC_SEC);


}

void FCM_Display_Day()
{
	
}

void FCM_Display_Date()
{
	
}

void FCM_I2C_Bus_Init()
{
	
	//Component Macro Aanroepen
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Init
	FCD_I2C_Master0_MI2C_Init();


	//Component Macro Aanroepen
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Component Macro Aanroepen
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Transmit_Byte(0xD0)
	FCD_I2C_Master0_MI2C_Transmit_Byte(0xD0);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Transmit_Byte(0)
	FCD_I2C_Master0_MI2C_Transmit_Byte(0);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Transmit_Byte(0b00000000)
	FCD_I2C_Master0_MI2C_Transmit_Byte(0b00000000);


	//Component Macro Aanroepen
	//Component Macro Aanroepen: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


}

void main()
{
	
	//Initialisatie
	adcon1 = 0x07;


	//Interrupt initialisatie code
	option_reg = 0xC0;


	//Call Macro
	//Call Macro: Startup
	FCM_Startup();


	//Call Macro
	//Call Macro: BuildUP_Display
	FCM_BuildUP_Display();


	//Call Macro
	//Call Macro: Preparing
	FCM_Preparing();


	//Call Macro
	//Call Macro: I2C_Bus_Init
	FCM_I2C_Bus_Init();


	//Delay
	//Delay: 1 s
	delay_s(1);


	//Loop
	//Loop: While 1
	while (1)
	{
		//Call Macro
		//Call Macro: Time_Date_DS1307
		FCM_Time_Date_DS1307();


		//Call Macro
		//Call Macro: Display_Time
		FCM_Display_Time();


	}


	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}



