//************************************************************************************
//**  
//**  File name:     C:\Siirto 5\Koekansio\Lambda_Cont_pic16f877.c
//**  Title:         
//**  Description:   
//**  
//**  Generated by:  Flowcode v5.4.0.0
//**  Date:          Monday, February 11, 2013 12:01:58
//**  Licence:       Professional
//**  Registered to: jujucode12
//**  Licence key:   9TK9EE
//**  
//**  
//**  http://www.matrixmultimedia.com
//**  
//************************************************************************************


#define MX_PIC

#define MX_USES_UINT8 1
#define MX_USES_SINT16 1
#define MX_USES_CHAR 2
#define MX_USES_FLOAT 1
#define MX_USES_SINT32 0
#define MX_USES_BOOL 0
#define MX_USES_UINT16 0
#define MX_USES_UINT32 0
//Defines for microcontroller
#define P16F877A
#define FC_CAL_PIC
#define MX_ADC
#define MX_ADC_TYPE_1
#define MX_ADC_BITS_10
#define MX_EE
#define MX_EE_TYPE2
#define MX_EE_SIZE 256
#define MX_SPI_1
#define MX_SPI_1_MISO_PORT portc
#define MX_SPI_1_MISO_TRIS trisc
#define MX_SPI_1_MISO_PIN 4
#define MX_SPI_1_MOSI_PORT portc
#define MX_SPI_1_MOSI_TRIS trisc
#define MX_SPI_1_MOSI_PIN 5
#define MX_SPI_1_CLK_PORT portc
#define MX_SPI_1_CLK_TRIS trisc
#define MX_SPI_1_CLK_PIN 3
#define MX_SPI_1_SS_PORT portc
#define MX_SPI_1_SS_TRIS trisc
#define MX_UART_1
#define MX_UART_1_TX_PORT portc
#define MX_UART_1_TX_TRIS trisc
#define MX_UART_1_TX_PIN 6
#define MX_UART_1_RX_PORT portc
#define MX_UART_1_RX_TRIS trisc
#define MX_UART_1_RX_PIN 7
#define MX_I2C
#define MX_MI2C
#define MX_I2C_1
#define MX_I2C_1_SDA_PORT portc
#define MX_I2C_1_SDA_TRIS trisc
#define MX_I2C_1_SDA_PIN 4
#define MX_I2C_1_SCL_PORT portc
#define MX_I2C_1_SCL_TRIS trisc
#define MX_I2C_1_SCL_PIN 3
#define MX_PWM
#define MX_PWM_CNT 2
#define MX_PWM_PSCA1
#define MX_PWM_PSCA4
#define MX_PWM_PSCA16
#define MX_PWM_1_PORT portc
#define MX_PWM_1_TRIS trisc
#define MX_PWM_1_PIN 2
#define MX_PWM_2_PORT portc
#define MX_PWM_2_TRIS trisc
#define MX_PWM_2_PIN 1

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

//Configuration data
#ifdef _BOOSTC
#pragma DATA 0x2007, 0x3f72
#endif
#ifdef HI_TECH_C
__CONFIG(0x3f72);
#endif

//Internal functions
#include "C:\Program Files (x86)\Flowcode\v5\FCD\internals.c"

//Macro function declarations
void FCM_Temp();
void FCM_Lambda_5V_input();
void FCM_Primary_Damper_80();
void FCM_Secondary_damper_40();
void FCM_Lcd_Startup();


//Variable declarations
#define FCSZ_DEG_S 5
#define FCSZ_VOTLAGE_HUNDRETHS 5
#define FCSZ_VOLTAGE_UNIT 2
#define FCSZ_VOLTS 4
#define FCSZ_TEMP_STRING 1
MX_UINT8 FCV_COUNT_STEPS = (0x0);
MX_UINT8 FCV_COUNT_DP2 = (0x0);
MX_UINT8 FCV_COUNT_DP;
MX_FLOAT FCV_VOLTAGE;
MX_FLOAT FCV_DEG;
MX_SINT16 FCV_ADC_LEVEL = (0);
MX_SINT16 FCV_TEMP = (0);
MX_UINT8 FCV_STEPS_PRIMARY1 = (0x0);
MX_UINT8 FCV_DATA_H = (0x0);
MX_CHAR FCV_DEG_S[FCSZ_DEG_S];
MX_UINT8 FCV_STEPS_SECONDARY1TOT;
MX_CHAR FCV_VOTLAGE_HUNDRETHS[FCSZ_VOTLAGE_HUNDRETHS];
MX_SINT16 FCV_LAMBDA = (0);
MX_UINT8 FCV_DATA_L;
MX_UINT8 FCV_COUNT;
MX_UINT8 FCV_STEPS_PRIMARY1TOT = (0x0);
MX_SINT16 FCV_DATA;
MX_SINT16 FCV_STEPS_SECONDARY1 = (0);
MX_UINT8 FCV_ADC = (0x0);
MX_CHAR FCV_VOLTAGE_UNIT[FCSZ_VOLTAGE_UNIT];
MX_CHAR FCV_VOLTS[FCSZ_VOLTS];
MX_UINT8 FCV_DELAY = (0x2);
MX_CHAR FCV_TEMP_STRING[FCSZ_TEMP_STRING];
MX_UINT8 FCV_CS;




//LCDDisplay(0): //Defines:

/**** Macro Substitutions ****
a = Unique Component Reference Number
b = D1 Port Letter
c = D2 Port Letter
d = D3 Port Letter
e = D4 Port Letter
f = RS Port Letter
g = E Port Letter
h = Data 1_Pin
i = Data 2 Pin
j = Data 3 Pin
k = Data 4 Pin
l = RS Pin
m = Enable Pin
n = Row Count
o = Column Count
******************************/

	//component connections
	//Port pin lat workaround for 8-bit PIC devices running >= 32MHz

  #ifdef FC_CAL_PIC
   #if MX_CLK_SPEED >= 32000000
	#define LCD_1__PORT0    latb
	#define LCD_1__PORT1    latb
	#define LCD_1__PORT2    latb
	#define LCD_1__PORT3    latb
	#define LCD_1__PORT4    latb
	#define LCD_1__PORT5    latb
   #else
   	#define LCD_1__PORT0    portb
   	#define LCD_1__PORT1    portb
   	#define LCD_1__PORT2    portb
   	#define LCD_1__PORT3    portb
   	#define LCD_1__PORT4    portb
   	#define LCD_1__PORT5    portb
   #endif
  #else
	#define LCD_1__PORT0    portb
	#define LCD_1__PORT1    portb
	#define LCD_1__PORT2    portb
	#define LCD_1__PORT3    portb
	#define LCD_1__PORT4    portb
	#define LCD_1__PORT5    portb
  #endif

	#define LCD_1__TRIS0    trisb
	#define LCD_1__TRIS1    trisb
	#define LCD_1__TRIS2    trisb
	#define LCD_1__TRIS3    trisb
	#define LCD_1__TRIS4    trisb
	#define LCD_1__TRIS5    trisb
	#define LCD_1__BIT0    	0
	#define LCD_1__BIT1    	1
	#define LCD_1__BIT2    	2
	#define LCD_1__BIT3    	3
	#define LCD_1__RS      	4
	#define LCD_1__E       	5
	#define LCD_1__ROWCNT	4
	#define LCD_1__COLCNT	20

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




//LCDDisplay(0): //Macro function declarations

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


//ADC(1): //Defines:

/**** Macro Substitutions ****
a = Unique Reference
b = Which ADC Channel
c = Acquisition time
d = Conversion Speed
e = VRef+ Option
f = VRef Voltage x 0.01V
******************************/

//Common Defines

#define ADC_3_MX_ADC_CHANNEL	4
#define ADC_3_MX_ADC_ACTIME	100
#define ADC_3_MX_ADC_CONVSP	0
#define ADC_3_MX_ADC_VREFOP	0
#define ADC_3_MX_ADC_VREFVOL	136

#ifndef MX_ADC_CHANNEL_4
 #define MX_ADC_CHANNEL_4			//Inform CAL ADC channel 4 is now in use.
#endif

#ifndef MX_ADC_REF					//Inform CAL ADC peripheral is now in use
 #define MX_ADC_REF
#endif

extern void FC_CAL_Enable_ADC (MX_UINT8 Channel, MX_UINT8 Conv_Speed, MX_UINT8 Vref, MX_UINT8 T_Charge);
extern MX_UINT16 FC_CAL_Sample_ADC (MX_UINT8 Sample_Mode);
extern void FC_CAL_Disable_ADC (void);




//ADC(1): //Macro function declarations

void FCD_ADC1_SampleADC();
MX_UINT8 FCD_ADC1_ReadAsByte();
MX_UINT16 FCD_ADC1_ReadAsInt();
MX_FLOAT FCD_ADC1_ReadAsVoltage();
void FCD_ADC1_ReadAsString(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE);
void FCD_ADC1_ADC_RAW_Configure_Channel();
MX_UINT8 FCD_ADC1_ADC_RAW_Sample_Channel_Byte();
MX_UINT16 FCD_ADC1_ADC_RAW_Sample_Channel_Int();
MX_UINT8 FCD_ADC1_ADC_RAW_Average_Channel_Byte(MX_UINT8 NumSamples, MX_UINT8 DelayUs);
MX_UINT16 FCD_ADC1_ADC_RAW_Average_Channel_Int(MX_UINT8 NumSamples, MX_UINT8 DelayUs);
void FCD_ADC1_ADC_RAW_Disable_Channel();


//Stepper(0): //Defines:

/**** Macro Substitutions ****
a = Unique Component Identifier
b = Coil 1 Port Register
c = Coil 1 Pin
d = Coil 2 Port Register
e = Coil 2 Pin
f = Coil 3 Port Register
g = Coil 3 Pin
h = Coil 4 Port Register
i = Coil 4 Pin
j = Step Type - 0 = half step, 1 = full step (2-2), 2 = wave (1-1)
k = Motor Type - 0 = bipolar/unipolar +ve, 1 = unipolar -ve
l = Number of Full Steps Per Revolution
******************************/

//common defines
#define STEPPER_4_MX_STEP_PORT1			porta
#define STEPPER_4_MX_STEP_TRIS1			trisa
#define STEPPER_4_MX_STEP_PIN1				0
#define STEPPER_4_MX_STEP_PORT2			porta
#define STEPPER_4_MX_STEP_TRIS2			trisa
#define STEPPER_4_MX_STEP_PIN2				1
#define STEPPER_4_MX_STEP_PORT3			porta
#define STEPPER_4_MX_STEP_TRIS3			trisa
#define STEPPER_4_MX_STEP_PIN3				2
#define STEPPER_4_MX_STEP_PORT4			porta
#define STEPPER_4_MX_STEP_TRIS4			trisa
#define STEPPER_4_MX_STEP_PIN4				3
#define STEPPER_4_MX_STEP_STEP_TYPE		1		//0 = half step, 1 = full step (2-2), 2 = wave (1-1)
#define STEPPER_4_MX_STEP_WINDING_TYPE		0		//0 = bipolar/unipolar +ve, 1 = unipolar -ve


#if (STEPPER_4_MX_STEP_WINDING_TYPE == 2)
	MX_UINT8 STEPPER_4_MX_STEP_PATTERN[8] = {0x06, 0x0e, 0x0a, 0x0b, 0x09, 0x0d, 0x05, 0x07};
#else
	MX_UINT8 STEPPER_4_MX_STEP_PATTERN[8] = {0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08};
#endif

#if (STEPPER_4_MX_STEP_STEP_TYPE == 0)
	#define STEPPER_4_MX_STEP_INC_STEP	1
#else
	#define STEPPER_4_MX_STEP_INC_STEP	2
#endif

MX_UINT8 STEPPER_4_mx_step_phase = 0;
MX_UINT8 STEPPER_4_mx_step_enabled = 0;




//Stepper(0): //Macro function declarations

void FCD_Stepper0_IncrementStep();
void FCD_Stepper0_DecrementStep();
void FCD_Stepper0_EnableMotor();
void FCD_Stepper0_DisableMotor();
void FCD_Stepper0_OutputStep(MX_UINT8 out_pattern);


//Stepper(1): //Defines:

/**** Macro Substitutions ****
a = Unique Component Identifier
b = Coil 1 Port Register
c = Coil 1 Pin
d = Coil 2 Port Register
e = Coil 2 Pin
f = Coil 3 Port Register
g = Coil 3 Pin
h = Coil 4 Port Register
i = Coil 4 Pin
j = Step Type - 0 = half step, 1 = full step (2-2), 2 = wave (1-1)
k = Motor Type - 0 = bipolar/unipolar +ve, 1 = unipolar -ve
l = Number of Full Steps Per Revolution
******************************/

//common defines
#define STEPPER_5_MX_STEP_PORT1			portd
#define STEPPER_5_MX_STEP_TRIS1			trisd
#define STEPPER_5_MX_STEP_PIN1				0
#define STEPPER_5_MX_STEP_PORT2			portd
#define STEPPER_5_MX_STEP_TRIS2			trisd
#define STEPPER_5_MX_STEP_PIN2				1
#define STEPPER_5_MX_STEP_PORT3			portd
#define STEPPER_5_MX_STEP_TRIS3			trisd
#define STEPPER_5_MX_STEP_PIN3				2
#define STEPPER_5_MX_STEP_PORT4			portd
#define STEPPER_5_MX_STEP_TRIS4			trisd
#define STEPPER_5_MX_STEP_PIN4				3
#define STEPPER_5_MX_STEP_STEP_TYPE		1		//0 = half step, 1 = full step (2-2), 2 = wave (1-1)
#define STEPPER_5_MX_STEP_WINDING_TYPE		0		//0 = bipolar/unipolar +ve, 1 = unipolar -ve


#if (STEPPER_5_MX_STEP_WINDING_TYPE == 2)
	MX_UINT8 STEPPER_5_MX_STEP_PATTERN[8] = {0x06, 0x0e, 0x0a, 0x0b, 0x09, 0x0d, 0x05, 0x07};
#else
	MX_UINT8 STEPPER_5_MX_STEP_PATTERN[8] = {0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08};
#endif

#if (STEPPER_5_MX_STEP_STEP_TYPE == 0)
	#define STEPPER_5_MX_STEP_INC_STEP	1
#else
	#define STEPPER_5_MX_STEP_INC_STEP	2
#endif

MX_UINT8 STEPPER_5_mx_step_phase = 0;
MX_UINT8 STEPPER_5_mx_step_enabled = 0;




//Stepper(1): //Macro function declarations

void FCD_Stepper1_IncrementStep();
void FCD_Stepper1_DecrementStep();
void FCD_Stepper1_EnableMotor();
void FCD_Stepper1_DisableMotor();
void FCD_Stepper1_OutputStep(MX_UINT8 out_pattern);


//SPI_Legacy(0): //Defines:

/**** Macro Substitutions ****
a = Unique Ref
b = SPI Channel
c = MOSI Pin
d = MOSI Port
e = MISO Pin
f = MISO Port
g = SCK Pin
h = SCK Port
i = Clock Polarity + Clock Phase + Data Sample Phase
j = SPI Prescaler
k = SPI Postscaler
l = DAC Enable Pin
m = DAC Enable Port
n = FRAM Enable Pin
o = FRAM Enable Port
******************************/

//Bus Mode - Bit0=CKP=CPOL, Bit1=CKE=!CPHA, Bit2=CSMP
//CKP=CPOL - Clock Polarity - Idle State of the clock 0=0, 1=1
//CKE=CPHA - Clock Phase - Clock Edge 0=leading edge, 1=trailing edge
//CSMP - Input Data Bit Sample Phase
//CRAT - SPI Clock Rate 0=1/4, 1=1/16, 2=1/64

// There are 4 SPI clock modes as follows:
//
// SPI Mode | CKP (CPOL) | CKE (CPHA) | BMODE | Explanation
//----------+------------+--------------------+------------------------------------------------
//  1 (0,1) |  0   (0)   |  0   (1)   | xx00  | idle low;  data out on falling/trailing edge
//  3 (1,1) |  1   (1)   |  0   (1)   | xx01  | idle high; data out on rising/trailing edge
//  0 (0,0) |  0   (0)   |  1   (0)   | xx10  | idle low;  data out on rising/leading edge
//  2 (1,0) |  1   (1)   |  1   (0)   | xx11  | idle high; data out on falling/leading edge
//----------+------------+---------------------------------------------------------------------
//
// So:
//     BMODE & 0x01 = CKP =  CPOL
//     BMODE & 0x02 = CKE = !CPHA

//Definitions for CS control lines
#define SPI_6_MX_SPI_LEGACY_DAC_PIN		4
#define SPI_6_MX_SPI_LEGACY_DAC_PORT		portc
#define SPI_6_MX_SPI_LEGACY_DAC_TRIS		trisc
#define SPI_6_MX_SPI_LEGACY_FRAM_PIN		3
#define SPI_6_MX_SPI_LEGACY_FRAM_PORT		portc
#define SPI_6_MX_SPI_LEGACY_FRAM_TRIS		trisc

// Another Fix for SPI clock mode (component outputs the wrong info, so fixed by xor)
#define SPI_6_MX_SPI_BMODE					(5 ^ 0x07)

//Definitions for SPI slot allocation
#ifndef	MX_SPI_REF1
	#define MX_SPI_REF1
	#define SPI_6_MX_SPI_UREF			1
	#define MX_SPI_CHANNEL_1		1
	#define MX_SPI_MOSI_PIN_1		0
	#define MX_SPI_MOSI_PORT_1		portc
	#define MX_SPI_MOSI_TRIS_1		trisc
	#define MX_SPI_MISO_PIN_1		4
	#define MX_SPI_MISO_PORT_1		portc
	#define MX_SPI_MISO_TRIS_1		trisc
	#define MX_SPI_SCK_PIN_1		3
	#define MX_SPI_SCK_PORT_1		portc
	#define MX_SPI_SCK_TRIS_1		trisc
	#define MX_SPI_CS_PIN_1			0
	#define MX_SPI_CS_PORT_1		0
	#define MX_SPI_BMODE_1			SPI_6_MX_SPI_BMODE
	#define MX_SPI_PR_SCALE_1		4
	#define MX_SPI_PO_SCALE_1		0
	#define MX_SPI_INT_1			0
#else
 #ifndef	MX_SPI_REF2
	#define MX_SPI_REF2
	#define SPI_6_MX_SPI_UREF			2
	#define MX_SPI_CHANNEL_2		1
	#define MX_SPI_MOSI_PIN_2		0
	#define MX_SPI_MOSI_PORT_2		portc
	#define MX_SPI_MOSI_TRIS_2		trisc
	#define MX_SPI_MISO_PIN_2		4
	#define MX_SPI_MISO_PORT_2		portc
	#define MX_SPI_MISO_TRIS_2		trisc
	#define MX_SPI_SCK_PIN_2		3
	#define MX_SPI_SCK_PORT_2		portc
	#define MX_SPI_SCK_TRIS_2		trisc
	#define MX_SPI_CS_PIN_2			0
	#define MX_SPI_CS_PORT_2		0
	#define MX_SPI_BMODE_2			SPI_6_MX_SPI_BMODE
	#define MX_SPI_PR_SCALE_2		4
	#define MX_SPI_PO_SCALE_2		0
	#define MX_SPI_INT_2			0
 #else
  #ifndef	MX_SPI_REF3
	#define MX_SPI_REF3
	#define SPI_6_MX_SPI_UREF			3
	#define MX_SPI_CHANNEL_3		1
	#define MX_SPI_MOSI_PIN_3		0
	#define MX_SPI_MOSI_PORT_3		portc
	#define MX_SPI_MOSI_TRIS_3		trisc
	#define MX_SPI_MISO_PIN_3		4
	#define MX_SPI_MISO_PORT_3		portc
	#define MX_SPI_MISO_TRIS_3		trisc
	#define MX_SPI_SCK_PIN_3		3
	#define MX_SPI_SCK_PORT_3		portc
	#define MX_SPI_SCK_TRIS_3		trisc
	#define MX_SPI_CS_PIN_3			0
	#define MX_SPI_CS_PORT_3		0
	#define MX_SPI_BMODE_3			SPI_6_MX_SPI_BMODE
	#define MX_SPI_PR_SCALE_3		4
	#define MX_SPI_PO_SCALE_3		0
	#define MX_SPI_INT_3			0
  #else
   #ifndef	MX_SPI_REF4
	#define MX_SPI_REF4
	#define SPI_6_MX_SPI_UREF			4
	#define MX_SPI_CHANNEL_4		1
	#define MX_SPI_MOSI_PIN_4		0
	#define MX_SPI_MOSI_PORT_4		portc
	#define MX_SPI_MOSI_TRIS_4		trisc
	#define MX_SPI_MISO_PIN_4		4
	#define MX_SPI_MISO_PORT_4		portc
	#define MX_SPI_MISO_TRIS_4		trisc
	#define MX_SPI_SCK_PIN_4		3
	#define MX_SPI_SCK_PORT_4		portc
	#define MX_SPI_SCK_TRIS_4		trisc
	#define MX_SPI_CS_PIN_4			0
	#define MX_SPI_CS_PORT_4		0
	#define MX_SPI_BMODE_4			SPI_6_MX_SPI_BMODE
	#define MX_SPI_PR_SCALE_4		4
	#define MX_SPI_PO_SCALE_4		0
	#define MX_SPI_INT_4			0
   #endif
  #endif
 #endif
#endif

#define SPI_6_SPI_Master_Init		CAL_APPEND(FC_CAL_SPI_Master_Init_, SPI_6_MX_SPI_UREF)
#define SPI_6_SPI_Master_Uninit	CAL_APPEND(FC_CAL_SPI_Master_Uninit_, SPI_6_MX_SPI_UREF)
#define SPI_6_SPI_Master_Byte		CAL_APPEND(FC_CAL_SPI_Master_Byte_, SPI_6_MX_SPI_UREF)

extern void SPI_6_SPI_Master_Init ();
extern void SPI_6_SPI_Master_Uninit ();
extern MX_UINT8 SPI_6_SPI_Master_Byte (MX_UINT8 DataOut);

//FRAM commands
#define FRAM_WREN  	6
#define FRAM_WRDI  	4
#define FRAM_RDSR  	5
#define FRAM_WRSR  	1
#define FRAM_READ  	3
#define FRAM_WRITE 	2




//SPI_Legacy(0): //Macro function declarations

void FCD_SPI_Legacy0_SPI_Init();
void FCD_SPI_Legacy0_SPI_Uninit();
void FCD_SPI_Legacy0_SPI_Send_Char(MX_UINT8 Char);
void FCD_SPI_Legacy0_SPI_Send_String(MX_STRING String, MX_UINT8 MSZ_String);
MX_UINT8 FCD_SPI_Legacy0_SPI_Get_Char();
void FCD_SPI_Legacy0_SPI_Get_String(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE, MX_UINT8 NumBytes);
void FCD_SPI_Legacy0_DAC_Send_Char(MX_UINT8 Char);
void FCD_SPI_Legacy0_NVM_Send_Char(MX_UINT8 hi_addr, MX_UINT8 lo_addr, MX_UINT8 Char);
MX_UINT8 FCD_SPI_Legacy0_NVM_Get_Char(MX_UINT8 hi_addr, MX_UINT8 lo_addr);
MX_UINT8 FCD_SPI_Legacy0_FramOutput(MX_UINT8 Char);
void FCD_SPI_Legacy0_EnableFRAM();
void FCD_SPI_Legacy0_DisableFRAM();

//Supplementary defines
rom char* LUT =
{0,71,73,75,77,79,81,83,85,87,90,92,94,
96,98,100,103,105,107,109,111,113,115,117,119,122,
124,126,130,132,134,136};




//LCDDisplay(0): //Macro implementations


void FCD_LCDDisplay0_RawSend(MX_UINT8 in, MX_UINT8 mask)
{
	
		MX_UINT8 pt;

		FC_CAL_Bit_Low(LCD_1__PORT0, LCD_1__BIT0);
		FC_CAL_Bit_Low(LCD_1__PORT1, LCD_1__BIT1);
		FC_CAL_Bit_Low(LCD_1__PORT2, LCD_1__BIT2);
		FC_CAL_Bit_Low(LCD_1__PORT3, LCD_1__BIT3);
		FC_CAL_Bit_Low(LCD_1__PORT4, LCD_1__RS);
		FC_CAL_Bit_Low(LCD_1__PORT5, LCD_1__E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    FC_CAL_Bit_High(LCD_1__PORT0, LCD_1__BIT0);
		if (pt & 0x02)
		    FC_CAL_Bit_High(LCD_1__PORT1, LCD_1__BIT1);
		if (pt & 0x04)
		    FC_CAL_Bit_High(LCD_1__PORT2, LCD_1__BIT2);
		if (pt & 0x08)
		    FC_CAL_Bit_High(LCD_1__PORT3, LCD_1__BIT3);
		if (mask)
		    FC_CAL_Bit_High(LCD_1__PORT4, LCD_1__RS);
		LCD_1__DELAY;
		FC_CAL_Bit_High (LCD_1__PORT5, LCD_1__E);
		LCD_1__DELAY;
		FC_CAL_Bit_Low (LCD_1__PORT5, LCD_1__E);
		pt = (in & 0x0f);
		LCD_1__DELAY;
		FC_CAL_Bit_Low(LCD_1__PORT0, LCD_1__BIT0);
		FC_CAL_Bit_Low(LCD_1__PORT1, LCD_1__BIT1);
		FC_CAL_Bit_Low(LCD_1__PORT2, LCD_1__BIT2);
		FC_CAL_Bit_Low(LCD_1__PORT3, LCD_1__BIT3);
		FC_CAL_Bit_Low(LCD_1__PORT4, LCD_1__RS);
		FC_CAL_Bit_Low(LCD_1__PORT5, LCD_1__E);
		if (pt & 0x01)
		    FC_CAL_Bit_High(LCD_1__PORT0, LCD_1__BIT0);
		if (pt & 0x02)
		    FC_CAL_Bit_High(LCD_1__PORT1, LCD_1__BIT1);
		if (pt & 0x04)
		    FC_CAL_Bit_High(LCD_1__PORT2, LCD_1__BIT2);
		if (pt & 0x08)
		    FC_CAL_Bit_High(LCD_1__PORT3, LCD_1__BIT3);
		if (mask)
		    FC_CAL_Bit_High(LCD_1__PORT4, LCD_1__RS);
		LCD_1__DELAY;
		FC_CAL_Bit_High (LCD_1__PORT5, LCD_1__E);
		LCD_1__DELAY;
		FC_CAL_Bit_Low (LCD_1__PORT5, LCD_1__E);
		LCD_1__DELAY;

}

void FCD_LCDDisplay0_Start()
{
	
		FC_CAL_Bit_Low_DDR(LCD_1__PORT0, LCD_1__TRIS0, LCD_1__BIT0);
		FC_CAL_Bit_Low_DDR(LCD_1__PORT1, LCD_1__TRIS1, LCD_1__BIT1);
		FC_CAL_Bit_Low_DDR(LCD_1__PORT2, LCD_1__TRIS2, LCD_1__BIT2);
		FC_CAL_Bit_Low_DDR(LCD_1__PORT3, LCD_1__TRIS3, LCD_1__BIT3);
		FC_CAL_Bit_Low_DDR(LCD_1__PORT4, LCD_1__TRIS4, LCD_1__RS);
		FC_CAL_Bit_Low_DDR(LCD_1__PORT5, LCD_1__TRIS5, LCD_1__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(MX_UINT8 Character)
{
	
		FCD_LCDDisplay0_RawSend(Character, 0x10);

}

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

}

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

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

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

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

		#if (LCD_1__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(MX_SINT16 Number)
{
	
		MX_SINT16 tmp_int;
		MX_UINT8 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(MX_STRING String, MX_UINT8 MSZ_String)
{
	
		MX_UINT8 idx = 0;

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

}

void FCD_LCDDisplay0_ScrollDisplay(MX_UINT8 Direction, MX_UINT8 Num_Positions)
{
	
		MX_UINT8 cmd = 0;
		MX_UINT8 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(MX_UINT8 Line)
{
	
		MX_UINT8 count;
		MX_UINT8 rowcount;

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

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

		#if (LCD_1__ROWCNT == 4)
			#if (LCD_1__COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_1__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(MX_UINT8 nIdx, MX_UINT8 d0, MX_UINT8 d1, MX_UINT8 d2, MX_UINT8 d3, MX_UINT8 d4, MX_UINT8 d5, MX_UINT8 d6, MX_UINT8 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);

}



//ADC(1): //Macro implementations


void FCD_ADC1_SampleADC()
{
	
	    //unused

}

MX_UINT8 FCD_ADC1_ReadAsByte()
{
	
		MX_UINT8 retVal;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_3_MX_ADC_CHANNEL , ADC_3_MX_ADC_CONVSP , ADC_3_MX_ADC_VREFOP , ADC_3_MX_ADC_ACTIME );

		retVal = FC_CAL_Sample_ADC( 0 );				//Perform Sample - Return as byte

		FC_CAL_Disable_ADC ();

		return (retVal);

}

MX_UINT16 FCD_ADC1_ReadAsInt()
{
	
		MX_UINT16 retVal;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_3_MX_ADC_CHANNEL , ADC_3_MX_ADC_CONVSP , ADC_3_MX_ADC_VREFOP , ADC_3_MX_ADC_ACTIME );

		retVal = FC_CAL_Sample_ADC( 1 );				//Perform Sample - Return as MX_UINT16

		FC_CAL_Disable_ADC ();

		return (retVal);

}

MX_FLOAT FCD_ADC1_ReadAsVoltage()
{
	
		MX_UINT16 iSample;
		MX_FLOAT fSample, fVoltage, fVperDiv;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_3_MX_ADC_CHANNEL , ADC_3_MX_ADC_CONVSP , ADC_3_MX_ADC_VREFOP , ADC_3_MX_ADC_ACTIME );

	  #ifdef MX_ADC_BITS_8
		iSample = FC_CAL_Sample_ADC( 0 );								//Perform Sample - Return as byte
	  #else
		iSample = FC_CAL_Sample_ADC( 1 );								//Perform Sample - Return as MX_UINT16
	  #endif

	  	FC_CAL_Disable_ADC ();											//Switch off ADC peripheral
		fVoltage = flt_fromi( ADC_3_MX_ADC_VREFVOL );						//Convert reference voltage count to floating point (0 - 500 x 10mV)
		fVoltage = flt_mul(fVoltage, 0.01);								//Convert reference voltage count to actual voltage (0 - 5)

	  #ifdef MX_ADC_BITS_8
		fVperDiv = flt_mul(fVoltage, 0.00390625);						//Convert actual voltage to voltage per division (VRef / 256)
	  #endif
	  #ifdef MX_ADC_BITS_10
		fVperDiv = flt_mul(fVoltage, 0.000976);							//Convert actual voltage to voltage per division (VRef / 1024)
	  #endif
	  #ifdef MX_ADC_BITS_12
		fVperDiv = flt_mul(fVoltage, 0.00024414);						//Convert actual voltage to voltage per division (VRef / 4096)
	  #endif

		fSample = flt_fromi(iSample);									//Convert to floating point variable
		fVoltage = flt_mul(fSample, fVperDiv);							//Calculate floating point voltage

		return (fVoltage);

}

void FCD_ADC1_ReadAsString(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE)
{
	
		MX_FLOAT fVoltage;

		fVoltage = FCD_ADC1_ReadAsVoltage();
		FCI_FLOAT_TO_STRING(fVoltage, 2, FCR_RETVAL, FCR_RETVAL_SIZE);	//Convert to String

}

void FCD_ADC1_ADC_RAW_Configure_Channel()
{
	
		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_3_MX_ADC_CHANNEL , ADC_3_MX_ADC_CONVSP , ADC_3_MX_ADC_VREFOP , ADC_3_MX_ADC_ACTIME );

}

MX_UINT8 FCD_ADC1_ADC_RAW_Sample_Channel_Byte()
{
	
		return FC_CAL_Sample_ADC( 0 );									//Perform Sample - Return as byte

}

MX_UINT16 FCD_ADC1_ADC_RAW_Sample_Channel_Int()
{
	
		return FC_CAL_Sample_ADC( 1 );									//Perform Sample - Return as MX_UINT16

}

MX_UINT8 FCD_ADC1_ADC_RAW_Average_Channel_Byte(MX_UINT8 NumSamples, MX_UINT8 DelayUs)
{
	
		MX_UINT32 average = 0;
		MX_UINT8 count;

		for (count=0; count<NumSamples; count++)
		{
			average = average + FC_CAL_Sample_ADC( 0 );					//Perform Sample - Return as byte - add to average

			if (DelayUs)
				delay_us(DelayUs);										//If delay is not 0 then pause between samples
		}
		average = average / count;

		return (average & 0xFF);										//Return average as byte

}

MX_UINT16 FCD_ADC1_ADC_RAW_Average_Channel_Int(MX_UINT8 NumSamples, MX_UINT8 DelayUs)
{
	
		MX_UINT32 average = 0;
		MX_UINT8 count;

		for (count=0; count<NumSamples; count++)
		{
			average = average + FC_CAL_Sample_ADC( 1 );					//Perform Sample - Return as MX_UINT16 - add to average

			if (DelayUs)
				delay_us(DelayUs);										//If delay is not 0 then pause between samples
		}
		average = average / count;

		return (average & 0x1FFF);										//Return average as MX_SINT16

}

void FCD_ADC1_ADC_RAW_Disable_Channel()
{
	
		FC_CAL_Disable_ADC ();											//Disable ADC Channel

}



//Stepper(0): //Macro implementations


void FCD_Stepper0_IncrementStep()
{
	
		MX_UINT8 pattern_now;

		if( STEPPER_4_mx_step_enabled)
		{
			STEPPER_4_mx_step_phase = (STEPPER_4_mx_step_phase + STEPPER_4_MX_STEP_INC_STEP);	//increment step

			#if (STEPPER_4_MX_STEP_STEP_TYPE == 1)
				STEPPER_4_mx_step_phase &=0x06;		//full step, even index
			#endif

			#if (STEPPER_4_MX_STEP_STEP_TYPE == 2)								//full step, odd index
				STEPPER_4_mx_step_phase |=0x01;
			#endif

			STEPPER_4_mx_step_phase &= 0x07;
			pattern_now = STEPPER_4_MX_STEP_PATTERN[STEPPER_4_mx_step_phase];
			FCD_Stepper0_OutputStep(pattern_now);
		}
}

void FCD_Stepper0_DecrementStep()
{
	
		MX_UINT8 pattern_now;

		if( STEPPER_4_mx_step_enabled)
		{
			STEPPER_4_mx_step_phase = (STEPPER_4_mx_step_phase - STEPPER_4_MX_STEP_INC_STEP);	//increment step

			#if (STEPPER_4_MX_STEP_STEP_TYPE == 1)
				STEPPER_4_mx_step_phase &=0x06;		//full step, even index
			#endif

			#if (STEPPER_4_MX_STEP_STEP_TYPE == 2)			//full step, odd index
				STEPPER_4_mx_step_phase |=0x01;
			#endif

			STEPPER_4_mx_step_phase &= 0x07;
			pattern_now = STEPPER_4_MX_STEP_PATTERN[STEPPER_4_mx_step_phase];
			FCD_Stepper0_OutputStep(pattern_now);
		}
}

void FCD_Stepper0_EnableMotor()
{
	
		STEPPER_4_mx_step_enabled = 1;

		FC_CAL_Bit_Low_DDR( STEPPER_4_MX_STEP_PORT1 , STEPPER_4_MX_STEP_TRIS1 , STEPPER_4_MX_STEP_PIN1 );
		FC_CAL_Bit_Low_DDR( STEPPER_4_MX_STEP_PORT2 , STEPPER_4_MX_STEP_TRIS2 , STEPPER_4_MX_STEP_PIN2 );
		FC_CAL_Bit_Low_DDR( STEPPER_4_MX_STEP_PORT3 , STEPPER_4_MX_STEP_TRIS3 , STEPPER_4_MX_STEP_PIN3 );
		FC_CAL_Bit_Low_DDR( STEPPER_4_MX_STEP_PORT4 , STEPPER_4_MX_STEP_TRIS4 , STEPPER_4_MX_STEP_PIN4 );

}

void FCD_Stepper0_DisableMotor()
{
	
		STEPPER_4_mx_step_enabled = 0;

		FC_CAL_Bit_In_DDR( STEPPER_4_MX_STEP_PORT1 , STEPPER_4_MX_STEP_TRIS1 , STEPPER_4_MX_STEP_PIN1 );
		FC_CAL_Bit_In_DDR( STEPPER_4_MX_STEP_PORT2 , STEPPER_4_MX_STEP_TRIS2 , STEPPER_4_MX_STEP_PIN2 );
		FC_CAL_Bit_In_DDR( STEPPER_4_MX_STEP_PORT3 , STEPPER_4_MX_STEP_TRIS3 , STEPPER_4_MX_STEP_PIN3 );
		FC_CAL_Bit_In_DDR( STEPPER_4_MX_STEP_PORT4 , STEPPER_4_MX_STEP_TRIS4 , STEPPER_4_MX_STEP_PIN4 );

}

void FCD_Stepper0_OutputStep(MX_UINT8 out_pattern)
{
	
		if(test_bit(out_pattern, 0)) FC_CAL_Bit_High( STEPPER_4_MX_STEP_PORT1 , STEPPER_4_MX_STEP_PIN1 );
		else FC_CAL_Bit_Low( STEPPER_4_MX_STEP_PORT1 , STEPPER_4_MX_STEP_PIN1 );
		if(test_bit(out_pattern, 1)) FC_CAL_Bit_High( STEPPER_4_MX_STEP_PORT2 , STEPPER_4_MX_STEP_PIN2 );
		else FC_CAL_Bit_Low( STEPPER_4_MX_STEP_PORT2 , STEPPER_4_MX_STEP_PIN2 );
		if(test_bit(out_pattern, 2)) FC_CAL_Bit_High( STEPPER_4_MX_STEP_PORT3 , STEPPER_4_MX_STEP_PIN3 );
		else FC_CAL_Bit_Low( STEPPER_4_MX_STEP_PORT3 , STEPPER_4_MX_STEP_PIN3 );
		if(test_bit(out_pattern, 3)) FC_CAL_Bit_High( STEPPER_4_MX_STEP_PORT4 , STEPPER_4_MX_STEP_PIN4 );
		else FC_CAL_Bit_Low( STEPPER_4_MX_STEP_PORT4 , STEPPER_4_MX_STEP_PIN4 );

}



//Stepper(1): //Macro implementations


void FCD_Stepper1_IncrementStep()
{
	
		MX_UINT8 pattern_now;

		if( STEPPER_5_mx_step_enabled)
		{
			STEPPER_5_mx_step_phase = (STEPPER_5_mx_step_phase + STEPPER_5_MX_STEP_INC_STEP);	//increment step

			#if (STEPPER_5_MX_STEP_STEP_TYPE == 1)
				STEPPER_5_mx_step_phase &=0x06;		//full step, even index
			#endif

			#if (STEPPER_5_MX_STEP_STEP_TYPE == 2)								//full step, odd index
				STEPPER_5_mx_step_phase |=0x01;
			#endif

			STEPPER_5_mx_step_phase &= 0x07;
			pattern_now = STEPPER_5_MX_STEP_PATTERN[STEPPER_5_mx_step_phase];
			FCD_Stepper1_OutputStep(pattern_now);
		}
}

void FCD_Stepper1_DecrementStep()
{
	
		MX_UINT8 pattern_now;

		if( STEPPER_5_mx_step_enabled)
		{
			STEPPER_5_mx_step_phase = (STEPPER_5_mx_step_phase - STEPPER_5_MX_STEP_INC_STEP);	//increment step

			#if (STEPPER_5_MX_STEP_STEP_TYPE == 1)
				STEPPER_5_mx_step_phase &=0x06;		//full step, even index
			#endif

			#if (STEPPER_5_MX_STEP_STEP_TYPE == 2)			//full step, odd index
				STEPPER_5_mx_step_phase |=0x01;
			#endif

			STEPPER_5_mx_step_phase &= 0x07;
			pattern_now = STEPPER_5_MX_STEP_PATTERN[STEPPER_5_mx_step_phase];
			FCD_Stepper1_OutputStep(pattern_now);
		}
}

void FCD_Stepper1_EnableMotor()
{
	
		STEPPER_5_mx_step_enabled = 1;

		FC_CAL_Bit_Low_DDR( STEPPER_5_MX_STEP_PORT1 , STEPPER_5_MX_STEP_TRIS1 , STEPPER_5_MX_STEP_PIN1 );
		FC_CAL_Bit_Low_DDR( STEPPER_5_MX_STEP_PORT2 , STEPPER_5_MX_STEP_TRIS2 , STEPPER_5_MX_STEP_PIN2 );
		FC_CAL_Bit_Low_DDR( STEPPER_5_MX_STEP_PORT3 , STEPPER_5_MX_STEP_TRIS3 , STEPPER_5_MX_STEP_PIN3 );
		FC_CAL_Bit_Low_DDR( STEPPER_5_MX_STEP_PORT4 , STEPPER_5_MX_STEP_TRIS4 , STEPPER_5_MX_STEP_PIN4 );

}

void FCD_Stepper1_DisableMotor()
{
	
		STEPPER_5_mx_step_enabled = 0;

		FC_CAL_Bit_In_DDR( STEPPER_5_MX_STEP_PORT1 , STEPPER_5_MX_STEP_TRIS1 , STEPPER_5_MX_STEP_PIN1 );
		FC_CAL_Bit_In_DDR( STEPPER_5_MX_STEP_PORT2 , STEPPER_5_MX_STEP_TRIS2 , STEPPER_5_MX_STEP_PIN2 );
		FC_CAL_Bit_In_DDR( STEPPER_5_MX_STEP_PORT3 , STEPPER_5_MX_STEP_TRIS3 , STEPPER_5_MX_STEP_PIN3 );
		FC_CAL_Bit_In_DDR( STEPPER_5_MX_STEP_PORT4 , STEPPER_5_MX_STEP_TRIS4 , STEPPER_5_MX_STEP_PIN4 );

}

void FCD_Stepper1_OutputStep(MX_UINT8 out_pattern)
{
	
		if(test_bit(out_pattern, 0)) FC_CAL_Bit_High( STEPPER_5_MX_STEP_PORT1 , STEPPER_5_MX_STEP_PIN1 );
		else FC_CAL_Bit_Low( STEPPER_5_MX_STEP_PORT1 , STEPPER_5_MX_STEP_PIN1 );
		if(test_bit(out_pattern, 1)) FC_CAL_Bit_High( STEPPER_5_MX_STEP_PORT2 , STEPPER_5_MX_STEP_PIN2 );
		else FC_CAL_Bit_Low( STEPPER_5_MX_STEP_PORT2 , STEPPER_5_MX_STEP_PIN2 );
		if(test_bit(out_pattern, 2)) FC_CAL_Bit_High( STEPPER_5_MX_STEP_PORT3 , STEPPER_5_MX_STEP_PIN3 );
		else FC_CAL_Bit_Low( STEPPER_5_MX_STEP_PORT3 , STEPPER_5_MX_STEP_PIN3 );
		if(test_bit(out_pattern, 3)) FC_CAL_Bit_High( STEPPER_5_MX_STEP_PORT4 , STEPPER_5_MX_STEP_PIN4 );
		else FC_CAL_Bit_Low( STEPPER_5_MX_STEP_PORT4 , STEPPER_5_MX_STEP_PIN4 );

}



//SPI_Legacy(0): //Macro implementations


void FCD_SPI_Legacy0_SPI_Init()
{
	
		//Disable SPI Devices
		FC_CAL_Bit_High_DDR(SPI_6_MX_SPI_LEGACY_DAC_PORT, SPI_6_MX_SPI_LEGACY_DAC_TRIS, SPI_6_MX_SPI_LEGACY_DAC_PIN);
		FC_CAL_Bit_High_DDR(SPI_6_MX_SPI_LEGACY_FRAM_PORT, SPI_6_MX_SPI_LEGACY_FRAM_TRIS, SPI_6_MX_SPI_LEGACY_FRAM_PIN);

		//Init SPI
		SPI_6_SPI_Master_Init();		//Call initialise function

}

void FCD_SPI_Legacy0_SPI_Uninit()
{
	
		//Convert SPI Device Control Lines To Inputs
		FC_CAL_Bit_In_DDR(SPI_6_MX_SPI_LEGACY_DAC_PORT, SPI_6_MX_SPI_LEGACY_DAC_TRIS, SPI_6_MX_SPI_LEGACY_DAC_PIN);
		FC_CAL_Bit_In_DDR(SPI_6_MX_SPI_LEGACY_FRAM_PORT, SPI_6_MX_SPI_LEGACY_FRAM_TRIS, SPI_6_MX_SPI_LEGACY_FRAM_PIN);

		//Uninit SPI
		SPI_6_SPI_Master_Uninit();		//Call uninitialise function

}

void FCD_SPI_Legacy0_SPI_Send_Char(MX_UINT8 Char)
{
	
		SPI_6_SPI_Master_Byte(Char);

}

void FCD_SPI_Legacy0_SPI_Send_String(MX_STRING String, MX_UINT8 MSZ_String)
{
	
		MX_UINT8 idx;
		for(idx = 0; idx < MSZ_String; idx++)
		{
			if (String[idx] == 0)				//End of string data?
				break;

			SPI_6_SPI_Master_Byte(String[idx]);
		}

}

MX_UINT8 FCD_SPI_Legacy0_SPI_Get_Char()
{
	
		MX_UINT8 retVal = 0;

		retVal = SPI_6_SPI_Master_Byte(0xFF);

		return (retVal);

}

void FCD_SPI_Legacy0_SPI_Get_String(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE, MX_UINT8 NumBytes)
{
		MX_UINT8 idx;

		if (NumBytes > FCR_RETVAL_SIZE)
			NumBytes = FCR_RETVAL_SIZE;

		for (idx = 0; idx < NumBytes; idx++)
		{
			FCR_RETVAL[idx] = SPI_6_SPI_Master_Byte(0xFF);		//Collect incoming data byte
		}

		if (idx < FCR_RETVAL_SIZE)
			FCR_RETVAL[idx] = 0;					//Terminate string if string variable is longer then expected data

}

void FCD_SPI_Legacy0_DAC_Send_Char(MX_UINT8 Char)
{
	
		MX_UINT8 dac_val;

		FC_CAL_Bit_Low(SPI_6_MX_SPI_LEGACY_DAC_PORT, SPI_6_MX_SPI_LEGACY_DAC_PIN);		//enable dac

		dac_val = (Char & 0xF0) >> 4;
		SPI_6_SPI_Master_Byte(dac_val);

		dac_val = (Char & 0x0F) << 4;
		SPI_6_SPI_Master_Byte(dac_val);

		FC_CAL_Bit_High(SPI_6_MX_SPI_LEGACY_DAC_PORT, SPI_6_MX_SPI_LEGACY_DAC_PIN);		//disable dac

}

void FCD_SPI_Legacy0_NVM_Send_Char(MX_UINT8 hi_addr, MX_UINT8 lo_addr, MX_UINT8 Char)
{
	
		//enable writes
		FCD_SPI_Legacy0_EnableFRAM();
		FCD_SPI_Legacy0_FramOutput(FRAM_WREN);
		FCD_SPI_Legacy0_DisableFRAM();

		//send write-fram command, address and data
		FCD_SPI_Legacy0_EnableFRAM();
		FCD_SPI_Legacy0_FramOutput(FRAM_WRITE);
		FCD_SPI_Legacy0_FramOutput(hi_addr);
		FCD_SPI_Legacy0_FramOutput(lo_addr);
		FCD_SPI_Legacy0_FramOutput(Char);
		FCD_SPI_Legacy0_DisableFRAM();

}

MX_UINT8 FCD_SPI_Legacy0_NVM_Get_Char(MX_UINT8 hi_addr, MX_UINT8 lo_addr)
{
	
		MX_UINT8 retVal;

		FCD_SPI_Legacy0_EnableFRAM();

		//send read-fram command and address
		FCD_SPI_Legacy0_FramOutput(FRAM_READ);
		FCD_SPI_Legacy0_FramOutput(hi_addr);
		FCD_SPI_Legacy0_FramOutput(lo_addr);

		//read the data
		retVal = FCD_SPI_Legacy0_FramOutput(0x5A);  	//don't care byte of 0x5A

		FCD_SPI_Legacy0_DisableFRAM();

		return(retVal);

}

MX_UINT8 FCD_SPI_Legacy0_FramOutput(MX_UINT8 Char)
{
	
		MX_UINT8 retVal = 0;
		retVal = SPI_6_SPI_Master_Byte(Char);
		return (retVal);

}

void FCD_SPI_Legacy0_EnableFRAM()
{
	
		FC_CAL_Bit_Low(SPI_6_MX_SPI_LEGACY_FRAM_PORT, SPI_6_MX_SPI_LEGACY_FRAM_PIN);

}

void FCD_SPI_Legacy0_DisableFRAM()
{
	
		FC_CAL_Bit_High(SPI_6_MX_SPI_LEGACY_FRAM_PORT, SPI_6_MX_SPI_LEGACY_FRAM_PIN);

}

#include "C:\Program Files (x86)\Flowcode\v5\CAL\includes.c"

//Macro implementations


void FCM_Temp()
{

	//Call Component Macro
	//Call Component Macro: SPI_Init()
	FCD_SPI_Legacy0_SPI_Init();

	//Call Component Macro
	//Call Component Macro: Cursor(0, 0)
	FCD_LCDDisplay0_Cursor(0, 0);

	//Call Component Macro
	//Call Component Macro: PrintString("Temp:")
	FCD_LCDDisplay0_PrintString("Temp:", 5);

	//Calculation
	//Calculation:
	//  CS = 1
	FCV_CS = 1;

	//Output
	//Output: CS -> C0
	trisc = trisc & 0xFE;
	if ((FCV_CS))
		portc = (portc & 0xFE) | 0x01;
	else
		portc = portc & 0xFE;

	//Delay
	//Delay: 100 ms
	delay_ms(100);

	//Calculation
	//Calculation:
	//  CS = 0
	FCV_CS = 0;

	//Output
	//Output: CS -> C0
	trisc = trisc & 0xFE;
	if ((FCV_CS))
		portc = (portc & 0xFE) | 0x01;
	else
		portc = portc & 0xFE;

	//Call Component Macro
	//Call Component Macro: DATA_H=SPI_Get_Char()
	FCV_DATA_H = FCD_SPI_Legacy0_SPI_Get_Char();

	//Call Component Macro
	//Call Component Macro: DATA_L=SPI_Get_Char()
	FCV_DATA_L = FCD_SPI_Legacy0_SPI_Get_Char();

	//Calculation
	//Calculation:
	//  CS = 1
	FCV_CS = 1;

	//Output
	//Output: CS -> C0
	trisc = trisc & 0xFE;
	if ((FCV_CS))
		portc = (portc & 0xFE) | 0x01;
	else
		portc = portc & 0xFE;

	//Calculation
	//Calculation:
	//  DATA = (DATA_H<<8) OR DATA_L
	FCV_DATA = (FCV_DATA_H << 8) | FCV_DATA_L;

	//Decision
	//Decision: (DATA AND 0x04) = 0x04?
	if ((FCV_DATA & 0x04) == 0x04)
	{

	} else {

		//Calculation
		//Calculation:
		//  TEMP = (DATA >> 3)
		//  TEMP = TEMP AND 0x0FFF
		//  TEMP = TEMP / 3.97
		FCV_TEMP = (FCV_DATA >> 3);
		FCV_TEMP = FCV_TEMP & 0x0FFF;
		FCV_TEMP = flt_toi(flt_div(flt_fromi(FCV_TEMP), 3.97));

		//Call Component Macro
		//Call Component Macro: Cursor(13, 0)
		FCD_LCDDisplay0_Cursor(13, 0);

		//Call Component Macro
		//Call Component Macro: PrintNumber(TEMP)
		FCD_LCDDisplay0_PrintNumber(FCV_TEMP);

		//Call Component Macro
		//Call Component Macro: PrintASCII("  ")
		FCD_LCDDisplay0_PrintASCII(' ');
		FCD_LCDDisplay0_PrintASCII(' ');

		#if 0 // Disabled code
		//Call Component Macro
		//Call Component Macro: PrintASCII(0xDF)
		FCD_LCDDisplay0_PrintASCII(0xDF);

		#endif // #if 0: Disabled code
		//Call Component Macro
		//Call Component Macro: Cursor(18, 0)
		FCD_LCDDisplay0_Cursor(18, 0);

		//Call Component Macro
		//Call Component Macro: PrintASCII("C")
		FCD_LCDDisplay0_PrintASCII('C');

	}

	//Delay
	//Delay: 100 ms
	delay_ms(100);

}


void FCM_Lambda_5V_input()
{

	//Read level from pot divider
	//Call Component Macro: adc_level=ReadAsByte()
	FCV_ADC_LEVEL = FCD_ADC1_ReadAsByte();

	//Calculation
	//Calculation:
	//  Voltage = adc_level * 27 / 100 + 68
	FCV_VOLTAGE = flt_fromi(FCV_ADC_LEVEL * 27 / 100 + 68);

	//String Manipulation
	//Calculation:
	//  Volts = ToString$ (Voltage)
	//  Votlage_Hundreths = Right$ (Volts,2)
	FCI_TOSTRING(flt_toi(FCV_VOLTAGE), FCV_VOLTS,FCSZ_VOLTS);
	FCI_RIGHTSTRING(FCV_VOLTS, FCSZ_VOLTS, 2, FCV_VOTLAGE_HUNDRETHS,FCSZ_VOTLAGE_HUNDRETHS);

	//Decision
	//Decision: Voltage = 255?
	if (flt_eq(FCV_VOLTAGE, 255))
	{

		//String Manipulation
		//Calculation:
		//  Voltage = 441
		FCV_VOLTAGE = 441;

	// } else {

	}

	//Decision
	//Decision: Voltage > 999?
	if (flt_gt(FCV_VOLTAGE, 999))
	{

		//String Manipulation
		//Calculation:
		//  Voltage_Unit = Left$ (Volts,2)
		FCI_LEFTSTRING(FCV_VOLTS, FCSZ_VOLTS, 2, FCV_VOLTAGE_UNIT,FCSZ_VOLTAGE_UNIT);

	} else {

		//Decision
		//Decision: Voltage > 99?
		if (flt_gt(FCV_VOLTAGE, 99))
		{

			//String Manipulation
			//Calculation:
			//  Voltage_Unit = Left$ (Volts,1)
			FCI_LEFTSTRING(FCV_VOLTS, FCSZ_VOLTS, 1, FCV_VOLTAGE_UNIT,FCSZ_VOLTAGE_UNIT);

		} else {

			//String Manipulation
			//Calculation:
			//  Voltage_Unit = "0"
			FCI_SCOPY("0",1, FCV_VOLTAGE_UNIT,FCSZ_VOLTAGE_UNIT);

			//Decision
			//Decision: Voltage < 10?
			if (flt_lt(FCV_VOLTAGE, 10))
			{

				//String Manipulation
				//Calculation:
				//  Votlage_Hundreths = Voltage_Unit + Volts
				FCI_SHEAD(FCV_VOLTAGE_UNIT,FCSZ_VOLTAGE_UNIT, FCV_VOLTS,FCSZ_VOLTS, FCV_VOTLAGE_HUNDRETHS,FCSZ_VOTLAGE_HUNDRETHS);

			// } else {

			}

		}

	}

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

	//Call Component Macro
	//Call Component Macro: PrintString("Lambda:")
	FCD_LCDDisplay0_PrintString("Lambda:", 7);

	//Call Component Macro
	//Call Component Macro: Cursor(13, 1)
	FCD_LCDDisplay0_Cursor(13, 1);

	//Call Component Macro
	//Call Component Macro: PrintString(Voltage_Unit)
	FCD_LCDDisplay0_PrintString(FCV_VOLTAGE_UNIT, FCSZ_VOLTAGE_UNIT);

	//Call Component Macro
	//Call Component Macro: PrintString(".")
	FCD_LCDDisplay0_PrintString(".", 1);

	//Displat voltage
	//Call Component Macro: PrintString(Votlage_Hundreths)
	FCD_LCDDisplay0_PrintString(FCV_VOTLAGE_HUNDRETHS, FCSZ_VOTLAGE_HUNDRETHS);

	//Calculation
	//Calculation:
	//  Count = 0
	FCV_COUNT = 0;

	//Calculation
	//Calculation:
	//  Count = Count+1
	FCV_COUNT = FCV_COUNT + 1;

}


void FCM_Primary_Damper_80()
{

	//Decision
	//Decision: Steps_Primary1 = 255?
	if (FCV_STEPS_PRIMARY1 == 255)
	{

	} else {

		//Enable Motor
		//Call Component Macro: EnableMotor()
		FCD_Stepper0_EnableMotor();

		//Set start counter
		//Calculation:
		//  Steps_Primary1 = 0
		FCV_STEPS_PRIMARY1 = 0;

		//Loop
		//Loop: While Steps_Primary1 = 255
		while (1)
		{

			//Call Component Macro
			//Call Component Macro: ReadAsByte()
			FCD_ADC1_ReadAsByte();

			//Call Component Macro
			//Call Component Macro: IncrementStep()
			FCD_Stepper0_IncrementStep();

			//Calculation
			//Calculation:
			//  Delay = 400 + ADC
			//  Count_steps = Count_steps + 1
			FCV_DELAY = 400 + FCV_ADC;
			FCV_COUNT_STEPS = FCV_COUNT_STEPS + 1;

			//Increment Steps
			//Calculation:
			//  Steps_Primary1 = Steps_Primary1 + 1
			FCV_STEPS_PRIMARY1 = FCV_STEPS_PRIMARY1 + 1;

			//Calculation
			//Calculation:
			//  Deg = fmul (0.32,Steps_Primary1)
			//  Deg_s = FloatToString$ (Deg)
			//  Count_DP = 0
			//  Count_DP2 = 0
			FCV_DEG = flt_mul(0.32, flt_fromi(FCV_STEPS_PRIMARY1));
			FCI_FLOAT_TO_STRING(FCV_DEG, 6, FCV_DEG_S,FCSZ_DEG_S);
			FCV_COUNT_DP = 0;
			FCV_COUNT_DP2 = 0;

			//Display Degrees on bottom
			//Call Component Macro: Cursor(0, 2)
			FCD_LCDDisplay0_Cursor(0, 2);

			//
			//Call Component Macro: PrintString("Prim damp:")
			FCD_LCDDisplay0_PrintString("Prim damp:", 10);

			//Call Component Macro
			//Call Component Macro: Cursor(18, 2)
			FCD_LCDDisplay0_Cursor(18, 2);

			//
			//Call Component Macro: PrintString("%")
			FCD_LCDDisplay0_PrintString("%", 1);

			//Call Component Macro
			//Call Component Macro: Cursor(13, 2)
			FCD_LCDDisplay0_Cursor(13, 2);

			//Loop
			//Loop: While Count_DP2 = 7
			while (1)
			{

				//Calculation
				//Calculation:
				//  Temp_String = Mid$ (Deg_S,Count_DP,1)
				//  Temp = Compare$ (Temp_String,".",1)
				//  Count_DP = Count_DP + 1
				//  Count_Dp2 = Count_Dp2 + 1
				FCI_MIDSTRING(FCV_DEG_S, FCSZ_DEG_S, FCV_COUNT_DP, 1, FCV_TEMP_STRING,FCSZ_TEMP_STRING);
				FCV_TEMP = FCI_COMPARE(FCV_TEMP_STRING, FCSZ_TEMP_STRING, ".", 1, 1);
				FCV_COUNT_DP = FCV_COUNT_DP + 1;
				FCV_COUNT_DP2 = FCV_COUNT_DP2 + 1;

				//Decision
				//Decision: Temp = 0?
				if (FCV_TEMP == 0)
				{

					//Calculation
					//Calculation:
					//  Count_DP2 = 6
					FCV_COUNT_DP2 = 6;

				// } else {

				}

				//Call Component Macro
				//Call Component Macro: PrintString(Temp_String)
				FCD_LCDDisplay0_PrintString(FCV_TEMP_STRING, FCSZ_TEMP_STRING);


				if ((FCV_COUNT_DP2 == 7) != 0) break;
			}

			//Delay
			//Delay: 100 ms
			delay_ms(100);


			if ((FCV_STEPS_PRIMARY1 == 255) != 0) break;
		}

	}

	#if 0 // Disabled code
	//Call Component Macro
	//Call Component Macro: DisableMotor()
	FCD_Stepper0_DisableMotor();

	#endif // #if 0: Disabled code
}


void FCM_Secondary_damper_40()
{

	//Enable Motor
	//Call Component Macro: EnableMotor()
	FCD_Stepper1_EnableMotor();

	//Decision
	//Decision: voltage > 132?
	if (flt_gt(FCV_VOLTAGE, 132))
	{

		//Decision
		//Decision: Steps_Secondary1 <= -19?
		if (FCV_STEPS_SECONDARY1 <= -19)
		{

		} else {

			//Call Component Macro
			//Call Component Macro: DecrementStep()
			FCD_Stepper1_DecrementStep();

			//Calculation
			//Calculation:
			//  Steps_Secondary1 = Steps_Secondary1 - 1
			FCV_STEPS_SECONDARY1 = FCV_STEPS_SECONDARY1 - 1;

		}

	} else {

		//Decision
		//Decision: voltage < 132?
		if (flt_lt(FCV_VOLTAGE, 132))
		{

			//Decision
			//Decision: Steps_Secondary1 <= Steps_Secondary1Tot?
			if (FCV_STEPS_SECONDARY1 <= FCV_STEPS_SECONDARY1TOT)
			{

				//Call Component Macro
				//Call Component Macro: IncrementStep()
				FCD_Stepper1_IncrementStep();

				//Calculation
				//Calculation:
				//  Steps_Secondary1 = Steps_Secondary1 + 1
				FCV_STEPS_SECONDARY1 = FCV_STEPS_SECONDARY1 + 1;

			// } else {

			}

		// } else {

		}

	}

	//Display Degrees on bottom
	//Call Component Macro: Cursor(0, 3)
	FCD_LCDDisplay0_Cursor(0, 3);

	//
	//Call Component Macro: PrintString("Second damp:")
	FCD_LCDDisplay0_PrintString("Second damp:", 12);

	//Call Component Macro
	//Call Component Macro: PrintString("  ")
	FCD_LCDDisplay0_PrintString("  ", 2);

	//Call Component Macro
	//Call Component Macro: Cursor(13, 3)
	FCD_LCDDisplay0_Cursor(13, 3);

//Calculation
//Calculation:
//  Deg = fmul / Steps_Secondary1Tot * Steps_Secondary1
//  Deg_s = FloatToString$ (Deg)
//  Count_DP = 0
//  Count_DP2 = 0
FCV_DEG = flt_mul(flt_div(40.0, flt_fromi(FCV_STEPS_SECONDARY1TOT)), flt_fromi(FCV_STEPS_SECONDARY1));
FCI_FLOAT_TO_STRING(FCV_DEG, 6, FCV_DEG_S,FCSZ_DEG_S);
FCV_COUNT_DP = 0;
FCV_COUNT_DP2 = 0;

	//Loop
	//Loop: While Count_DP2 = 7
	while (1)
	{

		//Calculation
		//Calculation:
		//  Temp_String = Mid$ (Deg_S,Count_DP,1)
		//  Temp = Compare$ (Temp_String,".",1)
		//  Count_DP = Count_DP + 1
		//  Count_Dp2 = Count_Dp2 + 1
		FCI_MIDSTRING(FCV_DEG_S, FCSZ_DEG_S, FCV_COUNT_DP, 1, FCV_TEMP_STRING,FCSZ_TEMP_STRING);
		FCV_TEMP = FCI_COMPARE(FCV_TEMP_STRING, FCSZ_TEMP_STRING, ".", 1, 1);
		FCV_COUNT_DP = FCV_COUNT_DP + 1;
		FCV_COUNT_DP2 = FCV_COUNT_DP2 + 1;

		//Decision
		//Decision: Temp = 0?
		if (FCV_TEMP == 0)
		{

			//Calculation
			//Calculation:
			//  Count_DP2 = 6
			FCV_COUNT_DP2 = 6;

		// } else {

		}

		//Call Component Macro
		//Call Component Macro: PrintString(Temp_String)
		FCD_LCDDisplay0_PrintString(FCV_TEMP_STRING, FCSZ_TEMP_STRING);


		if ((FCV_COUNT_DP2 == 7) != 0) break;
	}

	//Call Component Macro
	//Call Component Macro: PrintString("  ")
	FCD_LCDDisplay0_PrintString("  ", 2);

	//Call Component Macro
	//Call Component Macro: Cursor(18, 3)
	FCD_LCDDisplay0_Cursor(18, 3);

	//
	//Call Component Macro: PrintString("%")
	FCD_LCDDisplay0_PrintString("%", 1);

	#if 0 // Disabled code
	//Call Component Macro
	//Call Component Macro: DisableMotor()
	FCD_Stepper1_DisableMotor();

	#endif // #if 0: Disabled code
}


void FCM_Lcd_Startup()
{

	//Component Macro Aanroepen
	//Call Component Macro: Start()
	FCD_LCDDisplay0_Start();

	//Call Component Macro
	//Call Component Macro: Cursor(0, 0)
	FCD_LCDDisplay0_Cursor(0, 0);

	//Call Component Macro
	//Call Component Macro: PrintString("Lambda Cont Syst")
	FCD_LCDDisplay0_PrintString("Lambda Cont Syst", 16);

	//Call Component Macro
	//Call Component Macro: Cursor(5, 1)
	FCD_LCDDisplay0_Cursor(5, 1);

	//Call Component Macro
	//Call Component Macro: PrintString("v.1.00")
	FCD_LCDDisplay0_PrintString("v.1.00", 6);

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

	//Component Macro Aanroepen
	//Call Component Macro: Clear()
	FCD_LCDDisplay0_Clear();

	//Call Component Macro
	//Call Component Macro: Cursor(0, 0)
	FCD_LCDDisplay0_Cursor(0, 0);

	//Call Component Macro
	//Call Component Macro: PrintString("Testing Lambda.. ")
	FCD_LCDDisplay0_PrintString("Testing Lambda.. ", 17);

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

	//Loop
	//Loop: While Delay = 0
	while (1)
	{

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

		//Call Component Macro
		//Call Component Macro: PrintString("Warming Lambda..")
		FCD_LCDDisplay0_PrintString("Warming Lambda..", 16);

		//Call Component Macro
		//Call Component Macro: Cursor(12, 1)
		FCD_LCDDisplay0_Cursor(12, 1);

		//Call Component Macro
		//Call Component Macro: PrintNumber(Delay)
		FCD_LCDDisplay0_PrintNumber(FCV_DELAY);

		//Call Component Macro
		//Call Component Macro: PrintString("s ")
		FCD_LCDDisplay0_PrintString("s ", 2);

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

		//Call Component Macro
		//Call Component Macro: PrintString("Please wait")
		FCD_LCDDisplay0_PrintString("Please wait", 11);

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

		//Calculation
		//Calculation:
		//  Delay = Delay - 1
		FCV_DELAY = FCV_DELAY - 1;


		if ((FCV_DELAY == 0) != 0) break;
	}

}

//Supplementary implementations




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


	//Interrupt initialization code
	option_reg = 0xC0;


	//Calculation
	//Calculation:
	//  Steps_Primary1Tot = 200
	//  Steps_Secondary1Tot = 180
	FCV_STEPS_PRIMARY1TOT = 200;
	FCV_STEPS_SECONDARY1TOT = 180;

	//Call Macro
	//Call Macro: Lcd_Startup()
	FCM_Lcd_Startup();

	//Call Component Macro
	//Call Component Macro: SPI_Init()
	FCD_SPI_Legacy0_SPI_Init();

	//Call Component Macro
	//Call Component Macro: Clear()
	FCD_LCDDisplay0_Clear();

	//Loop
	//Loop: While 1
	while (1)
	{

		//Call Macro
		//Call Macro: Temp()
		FCM_Temp();

		//Call Macro
		//Call Macro: Lambda_5V_input()
		FCM_Lambda_5V_input();

		//Call Macro
		//Call Macro: Primary_Damper_80()
		FCM_Primary_Damper_80();

		//Delay
		//Delay: 10 ms
		delay_ms(10);

		//Call Macro
		//Call Macro: Secondary_damper_40()
		FCM_Secondary_damper_40();

		//Delay
		//Delay: 10 ms
		delay_ms(10);


	}

	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}



