//************************************************************************************
//**  
//**  File name:     H:\Kundendaten\Strunk\Projekt Rufsystem\Flowcode Software\Code_is_ready\Empfangseinheit_mit Klartextnamen_und Klartextabteilungen\07-06-2012\FC5\16F887_Empfaenger.c
//**  Title:         
//**  Description:   
//**  
//**  Generated by:  Flowcode v5.2.0.0
//**  Date:          Thursday, June 07, 2012 19:08:27
//**  Licence:       Professional
//**  Registered to: Ing. Buero REMANE
//**  Licence key:   4E59BK
//**  
//**  
//**  http://www.matrixmultimedia.com
//**  
//************************************************************************************


#define MX_PIC

#define MX_USES_UINT8 1
#define MX_USES_SINT16 0
#define MX_USES_CHAR 2
#define MX_USES_FLOAT 0
#define MX_USES_SINT32 0
#define MX_USES_BOOL 0
#define MX_USES_UINT16 0
#define MX_USES_UINT32 0
//Definitionen für Microcontroller
#define P16F887
#define FC_CAL_PIC
#define MX_ADC
#define MX_ADC_TYPE_7
#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

//Funktionen
#define MX_CLK_SPEED 4000000
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Konfigurations-Daten
#ifdef _BOOSTC
#pragma DATA 0x2007, 0x20c4
#endif
#ifdef HI_TECH_C
__CONFIG(0x20c4);
#endif
#ifdef _BOOSTC
#pragma DATA 0x2008, 0x3fff
#endif
#ifdef HI_TECH_C
__CONFIG(0x3fff);
#endif

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

//Makro-Funktions-Deklarationen
void FCM_Split_Buffer();
void FCM_Show();
void FCM_Buzzer();
void FCM_Error();


//Variablen-Deklarationen
#define FCSZ_ABTEILUNG_TEXT 16
#define FCSZ_PERSON 16
MX_UINT8 FCV_RF_BYTE_READ;
MX_UINT8 FCV_ABTEILUNG;
MX_CHAR FCV_ABTEILUNG_TEXT[FCSZ_ABTEILUNG_TEXT];
MX_UINT8 FCV_STOERUNG;
MX_CHAR FCV_PERSON[FCSZ_PERSON];
MX_UINT8 FCV_TASTER;
MX_UINT8 FCV_BUFFER;

MX_UINT8 FCLV_LOOP1;



//RF(0): //Defines:

/**** Macro Substitutions ****
a = Unique Reference
b = SPI Channel 0-SW / 1-HW SPI1 / 2-HW SPI2 / 3-HW SPI3 ....
c = MOSI Pin
d = MOSI Port
e = MISO Pin
f = MISO Port
g = SCK Pin
h = SCK Port
i = CS Pin
j = CS Port
k = FSEL Pin
l = FSEL Port
m = Frequency Selection	1-433MHz  2-868MHz 3-915MHz
n = Centre Frequency 		Channel selection - 96-3903	See Calculation p28
o = Baud Rate 				See Calculation p37
p = Receiver Bandwidth
q = Receiver Gain
r = Receiver Threshold
s = Transmitter Deviation
t = Transmitter Power Output
u = Transmitter Duty Cycle Setting
v = Data Mode
w = Preamble Sync ID Value
x = Extended Preamble Sync ID Enable
******************************/

#define MX_RF_CHANNEL		0

//Definitions for SDI control - need access to spi pin in application
#if (MX_RF_CHANNEL == 0)			//software spi
#define RF_2_MX_RF_SDI_PIN			7
#define RF_2_MX_RF_SDI_PORT			portd
#define RF_2_MX_RF_SDI_TRIS			trisd
#endif
#if (MX_RF_CHANNEL == 1)			//channel 1
#define RF_2_MX_RF_SDI_PIN			MX_SPI_1_MISO_PIN
#define RF_2_MX_RF_SDI_PORT			MX_SPI_1_MISO_PORT
#define RF_2_MX_RF_SDI_TRIS			MX_SPI_1_MISO_TRIS
#endif
#if (MX_RF_CHANNEL == 2)			//channel 2
#define RF_2_MX_RF_SDI_PIN			MX_SPI_2_MISO_PIN
#define RF_2_MX_RF_SDI_PORT			MX_SPI_2_MISO_PORT
#define RF_2_MX_RF_SDI_TRIS			MX_SPI_2_MISO_TRIS
#endif

//Definitions for CS control
#define RF_2_MX_RF_CS_PIN				5
#define RF_2_MX_RF_CS_PORT			portd
#define RF_2_MX_RF_CS_TRIS			trisd

//Definitions for FSEL Pin
#define RF_2_MX_RF_FSEL_PIN			3
#define RF_2_MX_RF_FSEL_PORT			portd
#define RF_2_MX_RF_FSEL_TRIS			trisd

//Definitions for SPI slot allocation
#ifndef	MX_SPI_REF1
	#define MX_SPI_REF1
	#define RF_2_MX_SPI_UREF			1
	#define MX_SPI_CHANNEL_1		0
	#define MX_SPI_MOSI_PIN_1		4
	#define MX_SPI_MOSI_PORT_1		portd
	#define MX_SPI_MOSI_TRIS_1		trisd
	#define MX_SPI_MISO_PIN_1		7
	#define MX_SPI_MISO_PORT_1		portd
	#define MX_SPI_MISO_TRIS_1		trisd
	#define MX_SPI_SCK_PIN_1		6
	#define MX_SPI_SCK_PORT_1		portd
	#define MX_SPI_SCK_TRIS_1		trisd
	#define MX_SPI_CS_PIN_1			0
	#define MX_SPI_CS_PORT_1		0
	#define MX_SPI_BMODE_1			2
	#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 RF_2_MX_SPI_UREF			2
	#define MX_SPI_CHANNEL_2		0
	#define MX_SPI_MOSI_PIN_2		4
	#define MX_SPI_MOSI_PORT_2		portd
	#define MX_SPI_MOSI_TRIS_2		trisd
	#define MX_SPI_MISO_PIN_2		7
	#define MX_SPI_MISO_PORT_2		portd
	#define MX_SPI_MISO_TRIS_2		trisd
	#define MX_SPI_SCK_PIN_2		6
	#define MX_SPI_SCK_PORT_2		portd
	#define MX_SPI_SCK_TRIS_2		trisd
	#define MX_SPI_CS_PIN_2			0
	#define MX_SPI_CS_PORT_2		0
	#define MX_SPI_BMODE_2			2
	#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 RF_2_MX_SPI_UREF			3
	#define MX_SPI_CHANNEL_3		0
	#define MX_SPI_MOSI_PIN_3		4
	#define MX_SPI_MOSI_PORT_3		portd
	#define MX_SPI_MOSI_TRIS_3		trisd
	#define MX_SPI_MISO_PIN_3		7
	#define MX_SPI_MISO_PORT_3		portd
	#define MX_SPI_MISO_TRIS_3		trisd
	#define MX_SPI_SCK_PIN_3		6
	#define MX_SPI_SCK_PORT_3		portd
	#define MX_SPI_SCK_TRIS_3		trisd
	#define MX_SPI_CS_PIN_3			0
	#define MX_SPI_CS_PORT_3		0
	#define MX_SPI_BMODE_3			2
	#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 RF_2_MX_SPI_UREF			4
	#define MX_SPI_CHANNEL_4		0
	#define MX_SPI_MOSI_PIN_4		4
	#define MX_SPI_MOSI_PORT_4		portd
	#define MX_SPI_MOSI_TRIS_4		trisd
	#define MX_SPI_MISO_PIN_4		7
	#define MX_SPI_MISO_PORT_4		portd
	#define MX_SPI_MISO_TRIS_4		trisd
	#define MX_SPI_SCK_PIN_4		6
	#define MX_SPI_SCK_PORT_4		portd
	#define MX_SPI_SCK_TRIS_4		trisd
	#define MX_SPI_CS_PIN_4			0
	#define MX_SPI_CS_PORT_4		0
	#define MX_SPI_BMODE_4			2
	#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 RF_2_SPI_Master_Init	CAL_APPEND(FC_CAL_SPI_Master_Init_, RF_2_MX_SPI_UREF)
#define RF_2_SPI_Master_Byte	CAL_APPEND(FC_CAL_SPI_Master_Byte_, RF_2_MX_SPI_UREF)

extern void RF_2_SPI_Master_Init ();
extern MX_UINT8 RF_2_SPI_Master_Byte (MX_UINT8 DataOut);

//Duty cycle limit when using the 868MHz band in Europe!!!

//common defines
#define MX_RF_FREQ  	2							//Module Frequency
#define MX_RF_CFREQ		2000							//Central Frequency 96 <-> 3903		(0x7D0)
#define MX_RF_BAUD		17							//Data Baud Rate					(0x23)
#define MX_RF_BWIDTH	(3 + 1)					//Bandwithd 0= / 6=
#define MX_RF_GAIN		0							//Gain 0= / 3=
#define MX_RF_THRESH	0							//Threshold 0= / 5=
#define MX_RF_DVN		7							//Deviation 0=15KHz / 15=240KHz
#define MX_RF_PWR		0							//Power 0=0dB / 7=-17.5dB
#define MX_RF_DUTY		100
#define MX_RF_DATAMODE	0							//Data mode - I/O or Data
#define MX_RF_ID		85							//Sync ID
#define MX_RF_EXTID		((1 - 1) * 8)				//Extended Sync 0=Off / 1=On
#define MX_RF_TXPROP	((MX_RF_DVN << 4) | MX_RF_PWR)

#define MX_RF_BUFFER_MAX	8

// General commands
#define GENCREG 	(0x8008 | (MX_RF_FREQ << 4))	//RF_Frequency does not change....
#define PMCREG 		0x8200
#define CFSREG		0xA000

// Data commands
#define DATARATE	0xC600
#define SYNCHRON	0xCE00

// RX commands
#define RXCREG 		0x9000
#define RXBREG		0xB000
#define FIFORSTREG	0xCA81		//0xCA85
#define BBFCREG 	0xC22C
#define AFCCREG		0xC4D7

// TX commands
#define TXCREG		0x9800
#define TXBREG 		0xB800

// Preloaded commands with data

#define PDOWN		0x8201

MX_UINT8 MX_RF_Mode;
MX_UINT8 MX_RF_Sync = MX_RF_ID;
MX_UINT8 MX_RF_RX_Buffer[MX_RF_BUFFER_MAX + 2];
MX_UINT8 MX_RF_RX_Buff1[MX_RF_BUFFER_MAX + 2];
MX_UINT8 MX_RF_TX_Buffer[MX_RF_BUFFER_MAX + 2];




//RF(0): //Makro-Funktions-Deklarationen

void FCD_RF0_SPI_Byte16(MX_SINT16 spicmd);
MX_SINT16 FCD_RF0_SPI_Command(MX_SINT16 spicmd);
void FCD_RF0_Wait_For_SDI();
MX_SINT16 FCD_RF0_Init_RF_Module();
void FCD_RF0_Uninit_RF_Module();
void FCD_RF0_Send_Byte(MX_UINT8 Data);
void FCD_RF0_Send_String(MX_STRING String, MX_UINT8 MSZ_String);
MX_UINT8 FCD_RF0_Receive_Byte(MX_UINT8 Timeout);
void FCD_RF0_Receive_String(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE, MX_UINT8 Length, MX_UINT8 Timeout);
void FCD_RF0_Activate_RX_Mode();
void FCD_RF0_Activate_TX_Mode();
void FCD_RF0_Update_Centre_Frequency(MX_SINT16 Frequency);
void FCD_RF0_Set_Sync_Pattern(MX_UINT8 Mode, MX_UINT8 Pattern);
void FCD_RF0_RX_Tune(MX_UINT8 Bandwidth, MX_UINT8 Gain, MX_UINT8 Threshold);
void FCD_RF0_TX_Tune(MX_UINT8 Deviation, MX_UINT8 Power);
void FCD_RF0_Set_Data_Rate(MX_UINT8 Rate);
MX_UINT8 FCD_RF0_Read_RX_Signal_Strength();
void FCD_RF0_FSK_Write(MX_UINT8 State);
MX_UINT8 FCD_RF0_FSK_Read();
void FCD_RF0_Set_Buffer_Data(MX_UINT8 Index, MX_UINT8 Data);
void FCD_RF0_Send_Buffer(MX_UINT8 Count);
MX_UINT8 FCD_RF0_Check_Buffer(MX_UINT8 Timeout);
MX_UINT8 FCD_RF0_Get_Data_Count();
MX_UINT8 FCD_RF0_Get_Buffer_Data(MX_UINT8 Index);


//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
	#define LCD_3__PORT0    porta
	#define LCD_3__PORT1    porta
	#define LCD_3__PORT2    porta
	#define LCD_3__PORT3    porta
	#define LCD_3__PORT4    porta
	#define LCD_3__PORT5    porta
	#define LCD_3__TRIS0    trisa
	#define LCD_3__TRIS1    trisa
	#define LCD_3__TRIS2    trisa
	#define LCD_3__TRIS3    trisa
	#define LCD_3__TRIS4    trisa
	#define LCD_3__TRIS5    trisa
	#define LCD_3__BIT0    	2
	#define LCD_3__BIT1    	3
	#define LCD_3__BIT2    	4
	#define LCD_3__BIT3    	5
	#define LCD_3__RS      	0
	#define LCD_3__E       	1
	#define LCD_3__ROWCNT	2
	#define LCD_3__COLCNT	16

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




//LCDDisplay(0): //Makro-Funktions-Deklarationen

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



//RF(0): //Makro-Implementierungen


void FCD_RF0_SPI_Byte16(MX_SINT16 spicmd)
{
	
		unsigned char temp;

		temp = spicmd >> 8;
		RF_2_SPI_Master_Byte(temp);			// Send Upper Command Byte
		temp = spicmd & 0xFF;
		RF_2_SPI_Master_Byte(temp);			// Send Lower Command Byte

}

MX_SINT16 FCD_RF0_SPI_Command(MX_SINT16 spicmd)
{
	
		unsigned int retval;
		unsigned char temp;

		FC_CAL_Bit_Low(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);										// Clear Chip Select bit
		delay_us(1);
		temp = spicmd >> 8;
		retval = RF_2_SPI_Master_Byte(temp);						// Send Upper Command Byte
		retval = retval << 8;
		temp = spicmd & 0xFF;
		retval = retval | RF_2_SPI_Master_Byte(temp);				// Send Lower Command Byte
		delay_us(1);
		FC_CAL_Bit_High(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);										// Set Chip Select bit
		delay_us(1);
		return retval;

}

void FCD_RF0_Wait_For_SDI()
{
	
		while(FC_CAL_Bit_In(RF_2_MX_RF_SDI_PORT, RF_2_MX_RF_SDI_PIN) == 0);						//Wait for SDI Input

}

MX_SINT16 FCD_RF0_Init_RF_Module()
{
	
		unsigned int Retval;

		FC_CAL_Bit_High_DDR(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_TRIS, RF_2_MX_RF_CS_PIN);								//Setup CS Pin

		RF_2_SPI_Master_Init();											//Call SPI initialise function

		delay_ms(100);										//100ms Delay to ensure transceiver has powered up

		// Configuring the RF link
		FCD_RF0_SPI_Command(FIFORSTREG);							//Disable (Sensitive) Reset Mode
		FCD_RF0_SPI_Command(FIFORSTREG | MX_RF_EXTID | 0x02);		//Restart Synchronous MX_UINT8acter pattern recognition
		FCD_RF0_SPI_Command(GENCREG);								//Assign frequency band and set load capacitance
		FCD_RF0_SPI_Command(CFSREG  | MX_RF_CFREQ);					//Set Channel Center Frequency
		FCD_RF0_SPI_Command(DATARATE | MX_RF_BAUD);					//Set Data Rate
		FCD_RF0_SPI_Command(PMCREG);								//Turn Off TX and RX controller chains

		Retval = (MX_RF_BWIDTH << 5) | (MX_RF_GAIN << 3) | MX_RF_THRESH;
		FCD_RF0_SPI_Command(RXCREG | Retval);						//Enable Data RX Output / Set signal strengths and gain

		FCD_RF0_SPI_Command(SYNCHRON | MX_RF_Sync);
		FCD_RF0_SPI_Command(TXCREG | MX_RF_TXPROP);					//Set TX frequency deviation

		// Antenna Tuning
		FCD_RF0_SPI_Command( PMCREG | 0x0020);						//Turn on TX baseband circuit
		delay_ms(5);										//Wait for oscillatr to stabilise

		// Set Up The Receiver
		FCD_RF0_SPI_Command(PMCREG | 0x0080);						//Turn off Tx, turn on receiver

		Retval = FCD_RF0_SPI_Command(0);							//Read back and return STSREG
		Retval = FCD_RF0_SPI_Command(0);							//Read back and return STSREG
		Retval = FCD_RF0_SPI_Command(0);							//Read back and return STSREG
		Retval = FCD_RF0_SPI_Command(0);							//Read back and return STSREG
		Retval = FCD_RF0_SPI_Command(0);							//Read back and return STSREG

	  #if (MX_RF_DATAMODE == 0)

		FCD_RF0_SPI_Command(GENCREG | 0x0040);						//Enable the FIFO
		FCD_RF0_SPI_Command(FIFORSTREG);
		FCD_RF0_SPI_Command(FIFORSTREG | MX_RF_EXTID | 0x02);		//Restart Synchronous character pattern recognition
		FC_CAL_Bit_High_DDR(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_TRIS, RF_2_MX_RF_FSEL_PIN);
		MX_RF_Mode = 0;

	  #else

		FC_CAL_Bit_In_DDR(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_TRIS, RF_2_MX_RF_FSEL_PIN);
		FCD_RF0_SPI_Command(GENCREG);								//Leave the FIFO disabled
		MX_RF_Mode = 2;

	  #endif

		return (Retval);

}

void FCD_RF0_Uninit_RF_Module()
{
	
		FCD_RF0_SPI_Command(PDOWN);

}

void FCD_RF0_Send_Byte(MX_UINT8 Data)
{
	
		FCD_RF0_Set_Buffer_Data(0, Data);					//Pass byte into send buffer
		FCD_RF0_Send_Buffer(1);								//Send buffer

}

void FCD_RF0_Send_String(MX_STRING String, MX_UINT8 MSZ_String)
{
	
		MX_UINT8 Ptr;
		MX_UINT8 Length;

		Length = MSZ_String;

		for (Ptr = 0; Ptr < Length; Ptr++)		//For each character in string
		{
			FCD_RF0_Set_Buffer_Data(Ptr, String[Ptr]);	//Pass string into send buffer

			if (String[Ptr] == 0)				//Is there a null byte in the string?
				Length = Ptr;					//If so then we are at the end
		}
		FCD_RF0_Send_Buffer(Length);					//Send buffer

}

MX_UINT8 FCD_RF0_Receive_Byte(MX_UINT8 Timeout)
{
	
		MX_UINT8 retVal;

		retVal = FCD_RF0_Check_Buffer(Timeout);				//Check for incoming data

		if (retVal == 1)							//If 1 byte received
			retVal = FCD_RF0_Get_Buffer_Data(0);			//Collect byte
		else
			return 255;								//Or return timeout err

		return retVal;

}

void FCD_RF0_Receive_String(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE, MX_UINT8 Length, MX_UINT8 Timeout)
{
	
		MX_UINT8 dcount, idx;

		FCR_RETVAL[0] = 0;											//Begin by assigning null to string

		dcount = FCD_RF0_Check_Buffer(Timeout);								//Check for incoming data

		if (dcount < 250)											//Valid packet size received?
		{
			for (idx = 0; idx < Length; idx++)						//Loop through specified received bytes
			{
				if (idx < FCR_RETVAL_SIZE)							//Is there still room in the buffer?
				{
					if (idx < dcount)								//Have we received all available bytes?
					{
						FCR_RETVAL[idx] = FCD_RF0_Get_Buffer_Data(idx);		//Collect byte and add to string

						if (FCR_RETVAL[idx] == 0)					//If null byte received
							Length = idx;							//Finish collecting bytes
					}
				}
			}

			if (idx < FCR_RETVAL_SIZE)								//If string is not full
				FCR_RETVAL[idx] = 0;								//Then add a null byte just incase there was not one in the received data
		}

}

void FCD_RF0_Activate_RX_Mode()
{
	
		FCD_RF0_SPI_Command(PMCREG | 0x0080);			// turn off Tx, turn on the receiver

		if (MX_RF_Mode == 0)					// Set system mode value
		{
			FCD_RF0_SPI_Command(GENCREG | 0x0040);		// disable the Tx register, Enable the FIFO

			FCD_RF0_SPI_Command(FIFORSTREG);
			FCD_RF0_SPI_Command(FIFORSTREG | MX_RF_EXTID | 0x0002);					//Reset FIFO

			FC_CAL_Bit_High_DDR(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_TRIS, RF_2_MX_RF_FSEL_PIN);		//FSEL pin as output
		}
		else
		{
			FC_CAL_Bit_In_DDR(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_TRIS, RF_2_MX_RF_FSEL_PIN);		//FSEL pin as input
			FCD_RF0_SPI_Command(GENCREG);											//Leave the FIFO disabled
		}

}

void FCD_RF0_Activate_TX_Mode()
{
	
		FCD_RF0_SPI_Command(PMCREG);					// Turn off the transmitter and receiver

		if (MX_RF_Mode == 1)
		{
			FCD_RF0_SPI_Command(GENCREG | 0x0080);		// Enable the Tx register
		}
		else
		{
			FCD_RF0_SPI_Command(GENCREG);				// disable the Tx register and the FIFO
		}

		FCD_RF0_SPI_Command(PMCREG | 0x0020);			// Turn on tx

		FC_CAL_Bit_High_DDR(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_TRIS, RF_2_MX_RF_FSEL_PIN);		//FSEL pin as output

}

void FCD_RF0_Update_Centre_Frequency(MX_SINT16 Frequency)
{
	
		if (Frequency < 96)
			Frequency = 96;

		if (Frequency > 3903)
			Frequency = 3903;

		FCD_RF0_SPI_Command(CFSREG | Frequency);

}

void FCD_RF0_Set_Sync_Pattern(MX_UINT8 Mode, MX_UINT8 Pattern)
{
	
		MX_RF_Sync = Pattern;

		FCD_RF0_SPI_Command(FIFORSTREG);

		if (Mode)
		{
			//Word type synchronisation
			FCD_RF0_SPI_Command(FIFORSTREG | 0x02);
		}
		else
		{
			//Byte type synchronisation
			FCD_RF0_SPI_Command(FIFORSTREG | 0x0a);
		}
		FCD_RF0_SPI_Command(SYNCHRON | MX_RF_Sync);

}

void FCD_RF0_RX_Tune(MX_UINT8 Bandwidth, MX_UINT8 Gain, MX_UINT8 Threshold)
{
	
		unsigned int TuneVals;

		if (Bandwidth > 6)
			Bandwidth = 6;

		if (Bandwidth < 1)
			Bandwidth = 1;

		if (Gain > 3)
			Gain = 3;

		if (Threshold > 5)
			Threshold = 5;

		TuneVals = RXCREG;
		TuneVals = TuneVals | (Bandwidth << 5);
		TuneVals = TuneVals | (Gain << 3);
		TuneVals = TuneVals | Threshold;

		FCD_RF0_SPI_Command(TuneVals);

}

void FCD_RF0_TX_Tune(MX_UINT8 Deviation, MX_UINT8 Power)
{
	
		MX_UINT8 MX_RF_TxProps;

		if (Deviation > 15)
			Deviation = 15;

		if (Power > 7)
			Power = 7;

		MX_RF_TxProps = Deviation << 4;
		MX_RF_TxProps = MX_RF_TxProps | Power;

		FCD_RF0_SPI_Command(TXCREG | MX_RF_TxProps);

}

void FCD_RF0_Set_Data_Rate(MX_UINT8 Rate)
{
	
		MX_UINT8 cs = 0;
		unsigned long r;

		r = 100000 / (29 * Rate);			//10 x data rate value
		r = r + 5;							//round up
		r = r / 10;							//divide by 10

		if (r > 0x80)						//result too large
		{
			cs = 0x80;						//set cs bit
			r >>= 2;						//divide by 4
			if (r & 0x01)
				r = r + 1;					//round up
			r >>= 1;						//divide by 2
		}
		r = r - 1;

		FCD_RF0_SPI_Command(DATARATE | cs | (MX_UINT8)r);

}

MX_UINT8 FCD_RF0_Read_RX_Signal_Strength()
{
	
		unsigned int test = 0;

		test = FCD_RF0_SPI_Command(0);					//Read back and return STSREG
		test = test >> 6;						//Rotate so that data we want is one bits 0 and 1
		test = test & 0x07;						//Mask off any unwanted values

		return (test);

}

void FCD_RF0_FSK_Write(MX_UINT8 State)
{
	
		if(MX_RF_Mode != 3)
		{
			MX_RF_Mode = 3;							//Set system mode value
			FCD_RF0_Activate_TX_Mode();
		}

		if(State)
			FC_CAL_Bit_High(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);
		else
			FC_CAL_Bit_Low(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);

}

MX_UINT8 FCD_RF0_FSK_Read()
{
	
		if (MX_RF_Mode != 2)
		{
			MX_RF_Mode = 2;
			FCD_RF0_Activate_RX_Mode();
		}
		return(FC_CAL_Bit_In(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN));

}

void FCD_RF0_Set_Buffer_Data(MX_UINT8 Index, MX_UINT8 Data)
{
	
		if (Index < MX_RF_BUFFER_MAX)
			MX_RF_TX_Buffer[Index + 1] = Data;

}

void FCD_RF0_Send_Buffer(MX_UINT8 Count)
{
	
		MX_UINT8 Data;
		MX_UINT8 Ptr;
		MX_UINT8 NextByte = 1;
		MX_UINT8 Csum = 0;

		if (Count < MX_RF_BUFFER_MAX)
		{
			MX_RF_TX_Buffer[0] = Count;

			//Calculate checksum
			for(Ptr = 0; Ptr <= Count; Ptr++)
				Csum ^= MX_RF_TX_Buffer[Ptr];

			MX_RF_TX_Buffer[Ptr] = Csum;

			//Include count and checksum
			Count += 2;

			//Set Tx mode
			if (MX_RF_Mode != 1)		//If we are in receive mode
			{
				MX_RF_Mode = 1;
				FCD_RF0_Activate_TX_Mode();		//Switch to transmit mode
			}

			FC_CAL_Bit_High(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);		// FSEL Output 1
			FC_CAL_Bit_Low(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);			// Clear Chip Select bit
			delay_us(1);

	//		FCD_RF0_Wait_For_SDI();
			FCD_RF0_SPI_Byte16(TXBREG | 0xAA);				// preamble

	  	  #if (MX_RF_EXTID == 0)
			FCD_RF0_Wait_For_SDI();							//Wait for SDI Input
			FCD_RF0_SPI_Byte16(TXBREG | 0x2D);				// sync pattern 1st byte (optional)
	  	  #endif

			FCD_RF0_Wait_For_SDI();							//Wait for SDI Input
			FCD_RF0_SPI_Byte16(TXBREG | MX_RF_Sync);		// sync pattern 2nd byte

			Ptr = 0;

			Data = MX_RF_TX_Buffer[Ptr++];

			while(NextByte)
			{
				FCD_RF0_Wait_For_SDI();						//Wait for SDI Input
				FCD_RF0_SPI_Byte16(TXBREG | Data);			// write byte to tx register

				Data = MX_RF_TX_Buffer[Ptr];

				if(Ptr == Count)
					NextByte = 0;

				Ptr++;
			}

			FCD_RF0_Wait_For_SDI();							//Wait for SDI Input
			FCD_RF0_SPI_Byte16(TXBREG | 0x00);				// write a dummy byte since the previous byte is still in buffer

			FCD_RF0_Wait_For_SDI();							//Wait for SDI Input

			FC_CAL_Bit_High(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);		// Chip select high, end transmission

			MX_RF_Mode = 0;
			FCD_RF0_Activate_RX_Mode();								//Switch to receive mode
		}

}

MX_UINT8 FCD_RF0_Check_Buffer(MX_UINT8 Timeout)
{
	
		MX_UINT8 ByteRx, Data;
		MX_UINT8 LoopCount;
		MX_UINT8 Ptr = 0;
		MX_UINT8 NextByte = 1;
		MX_UINT8 Count;
		MX_UINT8 retVal = 255;					//Nothing Received
		MX_UINT8 bCount = 0;
		MX_UINT8 Csum = 0;

		/*	Return values
			255 = No data
			254 = Count error (data count > buffer)
			253 = Insufficient data/timeout during reception
			252 = Checksum error
		*/

		if (MX_RF_Mode != 0)					//If we are in transmit mode
		{
			MX_RF_Mode = 0;
			FCD_RF0_Activate_RX_Mode();					//Switch to receive mode
		}

		//Get data count

		LoopCount = 0;
		ByteRx = 0;

		while((LoopCount < Timeout) && (ByteRx == 0))
		{
			FC_CAL_Bit_Low(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);			// Clear Chip Select bit
			delay_us(1);
			ByteRx = FC_CAL_Bit_In(RF_2_MX_RF_SDI_PORT, RF_2_MX_RF_SDI_PIN);
			FC_CAL_Bit_High(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);			// Set Chip Select bit

			if (ByteRx == 0)
				delay_us(100);

			LoopCount++;
		}

		if(ByteRx)
		{
			retVal = 254;												// Count received but nothing else
			FC_CAL_Bit_Low(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);		// FSEL Output 0
			delay_us(1);

			Count = RF_2_SPI_Master_Byte(0);

			FC_CAL_Bit_High(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);		// FSEL Output 1

			if (Count <= MX_RF_BUFFER_MAX)
			{
				retVal = 253;											// Count and some data received but packet incomplete
				MX_RF_RX_Buff1[Ptr++] = Count;

				Count = Count + 2;		//Include count and checksum

				while(NextByte)
				{
					LoopCount = 0;
					ByteRx = 0;

					while((LoopCount < Timeout) && (ByteRx == 0))
					{
						FC_CAL_Bit_High(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);		// FSEL Output 1
						delay_us(1);

						FC_CAL_Bit_Low(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);			// Clear Chip Select bit
						delay_us(1);

						ByteRx = FC_CAL_Bit_In(RF_2_MX_RF_SDI_PORT, RF_2_MX_RF_SDI_PIN);

						FC_CAL_Bit_High(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);			// Set Chip Select bit

						if (ByteRx == 0)
						{
							delay_us(100);
						}
						LoopCount = LoopCount + 1;
					}

					if(ByteRx)
					{
						FC_CAL_Bit_Low(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);		// FSEL Output 0
						delay_us(1);

						MX_RF_RX_Buff1[Ptr++] = RF_2_SPI_Master_Byte(0);

						bCount = 0;
					}
					else
					{
						bCount = bCount + 1;
						if (bCount == 100)
							NextByte = 0;
					}

					if(Ptr == Count)
					{
						NextByte = 0;

						for(Ptr = 0; Ptr < (Count - 1); Ptr++)
						{
							MX_RF_RX_Buffer[Ptr] = MX_RF_RX_Buff1[Ptr];
							Csum ^= MX_RF_RX_Buffer[Ptr];
						}

						if (Csum == MX_RF_RX_Buff1[Ptr])					//Is checksum ok?
							retVal = Count - 2;
						else
						{
							MX_RF_RX_Buffer[1] = Csum;
							retVal = 252;									//Count and packet data received but checksum error
						}
					}
				}
			}
			//FC_CAL_Bit_High(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);		// FSEL Output 1

			//SPI_Command(PMCREG);
			//SPI_Command(GENCREG);
			//SPI_Command(GENCREG | 0x0040);
			//SPI_Command(PMCREG | 0x0080);

			FCD_RF0_SPI_Command(FIFORSTREG);
			FCD_RF0_SPI_Command(FIFORSTREG | MX_RF_EXTID | 0x0002);		// reset FIFO
		}

		FC_CAL_Bit_High(RF_2_MX_RF_FSEL_PORT, RF_2_MX_RF_FSEL_PIN);		// FSEL Output 1
		FC_CAL_Bit_High(RF_2_MX_RF_CS_PORT, RF_2_MX_RF_CS_PIN);			// Chip select high, end transmission

		return (retVal);

}

MX_UINT8 FCD_RF0_Get_Data_Count()
{
	
		return(MX_RF_RX_Buffer[0]);

}

MX_UINT8 FCD_RF0_Get_Buffer_Data(MX_UINT8 Index)
{
	
		if (Index < MX_RF_BUFFER_MAX)
			return(MX_RF_RX_Buffer[Index + 1]);
		else
			return(0);

}



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


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

		FC_CAL_Bit_Low(LCD_3__PORT0, LCD_3__BIT0);
		FC_CAL_Bit_Low(LCD_3__PORT1, LCD_3__BIT1);
		FC_CAL_Bit_Low(LCD_3__PORT2, LCD_3__BIT2);
		FC_CAL_Bit_Low(LCD_3__PORT3, LCD_3__BIT3);
		FC_CAL_Bit_Low(LCD_3__PORT4, LCD_3__RS);
		FC_CAL_Bit_Low(LCD_3__PORT5, LCD_3__E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    FC_CAL_Bit_High(LCD_3__PORT0, LCD_3__BIT0);
		if (pt & 0x02)
		    FC_CAL_Bit_High(LCD_3__PORT1, LCD_3__BIT1);
		if (pt & 0x04)
		    FC_CAL_Bit_High(LCD_3__PORT2, LCD_3__BIT2);
		if (pt & 0x08)
		    FC_CAL_Bit_High(LCD_3__PORT3, LCD_3__BIT3);
		if (mask)
		    FC_CAL_Bit_High(LCD_3__PORT4, LCD_3__RS);
		LCD_3__DELAY;
		FC_CAL_Bit_High (LCD_3__PORT5, LCD_3__E);
		LCD_3__DELAY;
		FC_CAL_Bit_Low (LCD_3__PORT5, LCD_3__E);
		pt = (in & 0x0f);
		LCD_3__DELAY;
		FC_CAL_Bit_Low(LCD_3__PORT0, LCD_3__BIT0);
		FC_CAL_Bit_Low(LCD_3__PORT1, LCD_3__BIT1);
		FC_CAL_Bit_Low(LCD_3__PORT2, LCD_3__BIT2);
		FC_CAL_Bit_Low(LCD_3__PORT3, LCD_3__BIT3);
		FC_CAL_Bit_Low(LCD_3__PORT4, LCD_3__RS);
		FC_CAL_Bit_Low(LCD_3__PORT5, LCD_3__E);
		if (pt & 0x01)
		    FC_CAL_Bit_High(LCD_3__PORT0, LCD_3__BIT0);
		if (pt & 0x02)
		    FC_CAL_Bit_High(LCD_3__PORT1, LCD_3__BIT1);
		if (pt & 0x04)
		    FC_CAL_Bit_High(LCD_3__PORT2, LCD_3__BIT2);
		if (pt & 0x08)
		    FC_CAL_Bit_High(LCD_3__PORT3, LCD_3__BIT3);
		if (mask)
		    FC_CAL_Bit_High(LCD_3__PORT4, LCD_3__RS);
		LCD_3__DELAY;
		FC_CAL_Bit_High (LCD_3__PORT5, LCD_3__E);
		LCD_3__DELAY;
		FC_CAL_Bit_Low (LCD_3__PORT5, LCD_3__E);
		LCD_3__DELAY;

}

void FCD_LCDDisplay0_Start()
{
	
		FC_CAL_Bit_Low_DDR(LCD_3__PORT0, LCD_3__TRIS0, LCD_3__BIT0);
		FC_CAL_Bit_Low_DDR(LCD_3__PORT1, LCD_3__TRIS1, LCD_3__BIT1);
		FC_CAL_Bit_Low_DDR(LCD_3__PORT2, LCD_3__TRIS2, LCD_3__BIT2);
		FC_CAL_Bit_Low_DDR(LCD_3__PORT3, LCD_3__TRIS3, LCD_3__BIT3);
		FC_CAL_Bit_Low_DDR(LCD_3__PORT4, LCD_3__TRIS4, LCD_3__RS);
		FC_CAL_Bit_Low_DDR(LCD_3__PORT5, LCD_3__TRIS5, LCD_3__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_3__ROWCNT == 1)
	    y=0x80;
	  #endif

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

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

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

		#if (LCD_3__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_3__ROWCNT == 1)
			rowcount=80;
		#endif

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

		#if (LCD_3__ROWCNT == 4)
			#if (LCD_3__COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_3__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);

}

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

//Makro-Implementierungen

//Teilt den RF_Byte_Read in Abteilung und Taster auf

void FCM_Split_Buffer()
{

	//Berechnung
	//Berechnung:
	//  Stoerung = 0
	FCV_STOERUNG = 0;

	//Berechnung
	//Berechnung:
	//  Abteilung = RF_BYTE_READ / 10
	//  Taster = RF_BYTE_READ MOD 10
	FCV_ABTEILUNG = FCV_RF_BYTE_READ / 10;
	FCV_TASTER = FCV_RF_BYTE_READ % 10;

	//Switch (Icon für switch..case)
	//Switch (Icon für switch..case): Abteilung?
	switch (FCV_ABTEILUNG)
	{
		case 1:
		{
			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = "AV"
			FCI_SCOPY("AV",2, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			break;
		}
		case 2:
		{
			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = "Reparaturen"
			FCI_SCOPY("Reparaturen",11, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			break;
		}
		case 3:
		{
			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = "Kunststoff"
			FCI_SCOPY("Kunststoff",10, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			break;
		}
		case 4:
		{
			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = "Edelmetall"
			FCI_SCOPY("Edelmetall",10, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			break;
		}
		case 5:
		{
			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = "Modellguss"
			FCI_SCOPY("Modellguss",10, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			break;
		}
		case 6:
		{
			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = "Keramik Labor"
			FCI_SCOPY("Keramik Labor",13, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			break;
		}
		case 7:
		{
			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = "Keramik Brennen"
			FCI_SCOPY("Keramik Brennen",15, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			break;
		}
		case 8:
		{
			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = "CAD/CAM"
			FCI_SCOPY("CAD/CAM",7, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			break;
		}
		default:
		{
			//Berechnung
			//Berechnung:
			//  Stoerung = 1
			//  RF_BYTE_READ = 0
			//  Taster = 0
			FCV_STOERUNG = 1;
			FCV_RF_BYTE_READ = 0;
			FCV_TASTER = 0;

			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = " "
			FCI_SCOPY(" ",1, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

			//Gehe zum Verbindungspunkt
			//Gehe zum Verbindungspunkt: [A]: A
			goto FCC_Split_Buffer_A;

		}
	}

	//Switch (Icon für switch..case)
	//Switch (Icon für switch..case): Taster?
	switch (FCV_TASTER)
	{
		case 1:
		{
			//String Manipulation
			//Berechnung:
			//  Person = "Petra Zahn"
			FCI_SCOPY("Petra Zahn",10, FCV_PERSON,FCSZ_PERSON);

			break;
		}
		case 2:
		{
			//String Manipulation
			//Berechnung:
			//  Person = "Dirk Mueller"
			FCI_SCOPY("Dirk Mueller",12, FCV_PERSON,FCSZ_PERSON);

			break;
		}
		case 3:
		{
			//String Manipulation
			//Berechnung:
			//  Person = "Markus Jung"
			FCI_SCOPY("Markus Jung",11, FCV_PERSON,FCSZ_PERSON);

			break;
		}
		case 4:
		{
			//String Manipulation
			//Berechnung:
			//  Person = "Vertretung"
			FCI_SCOPY("Vertretung",10, FCV_PERSON,FCSZ_PERSON);

			break;
		}
		default:
		{
			//Berechnung
			//Berechnung:
			//  Stoerung = 1
			//  RF_BYTE_READ = 0
			//  Taster = 0
			FCV_STOERUNG = 1;
			FCV_RF_BYTE_READ = 0;
			FCV_TASTER = 0;

			//String Manipulation
			//Berechnung:
			//  Abteilung_Text = " "
			//  Person = " "
			FCI_SCOPY(" ",1, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			FCI_SCOPY(" ",1, FCV_PERSON,FCSZ_PERSON);

		}
	}

	//Berechnung
	//Berechnung:
	//  RF_BYTE_READ = 0
	FCV_RF_BYTE_READ = 0;

	//Verbindungspunkt
	//Verbindungspunkt: [A]: A
FCC_Split_Buffer_A:
;

}

//Zeigt Abteilung und Taste

void FCM_Show()
{

	//Berechnung
	//Berechnung:
	//  Stoerung = 0
	FCV_STOERUNG = 0;

	//Switch (Icon für switch..case)
	//Switch (Icon für switch..case): Taster?
	switch (FCV_TASTER)
	{
		case 1:
		{
			//Output
			//Output: 1 -> C3
			trisc = trisc & 0xF7;
			if ((1))
				portc = (portc & 0xF7) | 0x08;
			else
				portc = portc & 0xF7;

			break;
		}
		case 2:
		{
			//Output
			//Output: 1 -> C0
			trisc = trisc & 0xFE;
			if ((1))
				portc = (portc & 0xFE) | 0x01;
			else
				portc = portc & 0xFE;

			break;
		}
		case 3:
		{
			//Output
			//Output: 1 -> C2
			trisc = trisc & 0xFB;
			if ((1))
				portc = (portc & 0xFB) | 0x04;
			else
				portc = portc & 0xFB;

			break;
		}
		case 4:
		{
			//Output
			//Output: 1 -> C1
			trisc = trisc & 0xFD;
			if ((1))
				portc = (portc & 0xFD) | 0x02;
			else
				portc = portc & 0xFD;

			break;
		}
		default:
		{
			//Berechnung
			//Berechnung:
			//  Stoerung = 1
			FCV_STOERUNG = 1;

			//Gehe zum Verbindungspunkt
			//Gehe zum Verbindungspunkt: [A]: A
			goto FCC_Show_A;

		}
	}

	//Aufruf Komponenten-Makro
	//Aufruf Komponenten-Makro: PrintString(Abteilung_Text)
	FCD_LCDDisplay0_PrintString(FCV_ABTEILUNG_TEXT, FCSZ_ABTEILUNG_TEXT);

	//Aufruf Komponenten-Makro
	//Aufruf Komponenten-Makro: Cursor(0, 1)
	FCD_LCDDisplay0_Cursor(0, 1);

	//Aufruf Komponenten-Makro
	//Aufruf Komponenten-Makro: PrintString(Person)
	FCD_LCDDisplay0_PrintString(FCV_PERSON, FCSZ_PERSON);

	//Verbindungspunkt
	//Verbindungspunkt: [A]: A
FCC_Show_A:
;

}

//Piepton zur Aufmerksamkeitserzeugung

void FCM_Buzzer()
{

	//Output
	//Output: 1 -> C4
	trisc = trisc & 0xEF;
	if ((1))
		portc = (portc & 0xEF) | 0x10;
	else
		portc = portc & 0xEF;

	//Schleife
	//Schleife: Schleife 10 Mal
	for (FCLV_LOOP1=0; FCLV_LOOP1<10; FCLV_LOOP1++)
	{

		//Warten
		//Warten: 200 ms
		Wdt_Delay_Ms(200);

		//Output
		//Output: 0 -> C4
		trisc = trisc & 0xEF;
		if ((0))
			portc = (portc & 0xEF) | 0x10;
		else
			portc = portc & 0xEF;

		//Warten
		//Warten: 100 ms
		Wdt_Delay_Ms(100);

		//Output
		//Output: 1 -> C4
		trisc = trisc & 0xEF;
		if ((1))
			portc = (portc & 0xEF) | 0x10;
		else
			portc = portc & 0xEF;


	}

	//Output
	//Output: 0 -> C4
	trisc = trisc & 0xEF;
	if ((0))
		portc = (portc & 0xEF) | 0x10;
	else
		portc = portc & 0xEF;

}


void FCM_Error()
{

	//Aufruf Komponenten-Makro
	//Aufruf Komponenten-Makro: Uninit_RF_Module()
	FCD_RF0_Uninit_RF_Module();

	//Set All Variables to Zero
	//Berechnung:
	//  Abteilung = 0
	//  Taster = 0
	//  RF_BYTE_READ = 0
	//  Stoerung = 0
	FCV_ABTEILUNG = 0;
	FCV_TASTER = 0;
	FCV_RF_BYTE_READ = 0;
	FCV_STOERUNG = 0;

	//Set String to Blank
	//Berechnung:
	//  Abteilung_Text = " "
	FCI_SCOPY(" ",1, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

	//Output
	//Output: 0 -> PORTC
	trisc = trisc & 0xF0;
	portc = (portc & 0xF0) | ((0) & 0x0F);

	//Warten
	//Warten: 250 ms
	Wdt_Delay_Ms(250);

	//Init RF Module
	//Aufruf Komponenten-Makro: Init_RF_Module()
	FCD_RF0_Init_RF_Module();

}



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


	//Interrupt-Initialisierungs-Code
	option_reg = 0xC0;


	//C-Kode
	//C-Code:
	/*
	Bit 7 reserved set to 0
	Bit 6-4 IRCF Set Oscillator to internal at 4MHZ   110
	Bit 3 OSTS running from internal system clock
	Bit 2 HFINTOSC frequency is stable
	Bit 1 LFINTOSC LFINTOSC is stable
	Bit 0 SCS System Clock select Bit 1= internal OSC
	Next step is osctune 
	Bit 7-5 don´t care
	Bit 4-0  01111 = Maximum freq  00000 = factory default  10000 Minimum freq
	osccon = 0b01100111;
	osctune = 0b00000010;
	*/
	osccon = 0x61;

	//Kommentar:
	///*
	//Bit 7 reserved set to 0
	//Bit 6-4 IRCF Set Oscillator to internal at 4MHZ   110
	//Bit 3 OSTS running from internal system clock
	//Bit 2 HFINTOSC frequency is stable
	//Bit 1 LFINTOSC LFINTOSC is stable
	//Bit 0 SCS System Clock select Bit 1= internal OSC
	//Next step is osctune 
	//Bit 7-5 don´t care
	//Bit 4-0  01111 = Maximum freq  00000 = factory default  10000 Minimum freq
	//*/
	//osccon = 0b01100111;
	//osctune = 0b00000010;

	//Warten
	//Warten: 100 ms
	Wdt_Delay_Ms(100);

	//Init All Variables
	//Berechnung:
	//  RF_BYTE_READ = 0
	//  Stoerung = 0
	//  Abteilung = 0
	//  Taster = 0
	FCV_RF_BYTE_READ = 0;
	FCV_STOERUNG = 0;
	FCV_ABTEILUNG = 0;
	FCV_TASTER = 0;

	//Init String
	//Berechnung:
	//  Abteilung_Text = " "
	FCI_SCOPY(" ",1, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

	//Init Display
	//Aufruf Komponenten-Makro: Start()
	FCD_LCDDisplay0_Start();

	//Init RF Module
	//Aufruf Komponenten-Makro: Init_RF_Module()
	FCD_RF0_Init_RF_Module();

	//Wait to End Initphase
	//Warten: 200 ms
	Wdt_Delay_Ms(200);

	//Clear the Display
	//Aufruf Komponenten-Makro: Clear()
	FCD_LCDDisplay0_Clear();

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

		//Set All Variables to Zero
		//Berechnung:
		//  Abteilung = 0
		//  Taster = 0
		//  RF_BYTE_READ = 0
		//  Stoerung = 0
		FCV_ABTEILUNG = 0;
		FCV_TASTER = 0;
		FCV_RF_BYTE_READ = 0;
		FCV_STOERUNG = 0;

		//Set String to Blank
		//Berechnung:
		//  Abteilung_Text = " "
		FCI_SCOPY(" ",1, FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);

		//Aufruf Komponenten-Makro
		//Aufruf Komponenten-Makro: RF_BYTE_READ=Receive_Byte(250)
		FCV_RF_BYTE_READ = FCD_RF0_Receive_Byte(250);

		//Aufruf Komponenten-Makro
		//Aufruf Komponenten-Makro: Clear()
		FCD_LCDDisplay0_Clear();

		//Makro-Aufruf
		//Makro-Aufruf: Split_Buffer()
		FCM_Split_Buffer();

		//Entscheidung
		//Entscheidung: Stoerung = 1?
		if (FCV_STOERUNG == 1)
		{

			//Makro-Aufruf
			//Makro-Aufruf: Error()
			FCM_Error();

		} else {

			//Makro-Aufruf
			//Makro-Aufruf: Show()
			FCM_Show();

			//Makro-Aufruf
			//Makro-Aufruf: Buzzer()
			FCM_Buzzer();

			//Warten
			//Warten: 120 s
			Wdt_Delay_S(120);

			//Aufruf Komponenten-Makro
			//Aufruf Komponenten-Makro: Clear()
			FCD_LCDDisplay0_Clear();

			//Output
			//Output: 0 -> PORTC
			trisc = trisc & 0xF0;
			portc = (portc & 0xF0) | ((0) & 0x0F);

		}


	}

	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}



