//************************************************************************************
//**  
//**  File name:     H:\Kundendaten\Strunk\Projekt Rufsystem\Flowcode Software\Code_is_ready\Empfangseinheit_mit Klartextnamen_und Klartextabteilungen\07-06-2012\16F887_Empfaenger.c
//**  Generated by:  Flowcode v4.5.18.74
//**  Date:          Thursday, June 07, 2012 18:42:35
//**  Licence:       Professional
//**  Registered to: Ing. Buero REMANE
//**  
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_PIC

//Definitionen für Microcontroller
#define P16F887
#define MX_EE
#define MX_EE_TYPE2
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_C
#define MX_SPI_SDI 4
#define MX_SPI_SDO 5
#define MX_SPI_SCK 3
#define MX_UART
#define MX_UART_C
#define MX_UART_TX 6
#define MX_UART_RX 7
#define MX_I2C
#define MX_MI2C
#define MX_I2C_C
#define MX_I2C_SDA 4
#define MX_I2C_SCL 3
#define MX_PWM
#define MX_PWM_CNT 2
#define MX_PWM_TRIS1 trisc
#define MX_PWM_1 2
#define MX_PWM_TRIS2 trisc
#define MX_PWM_2 1

//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:\Programme\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//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
char FCV_RF_BYTE_READ;
char FCV_ABTEILUNG;
char FCV_ABTEILUNG_TEXT[FCSZ_ABTEILUNG_TEXT];
char FCV_STOERUNG;
char FCV_PERSON[FCSZ_PERSON];
char FCV_TASTER;
char FCV_BUFFER;

char FCLV_LOOP1;



//RF(0): //Defines:

/**** Macro Substitutions ****
0 = SPI Bus HW / SW mode 0-SW / 1-HW SPI1 / 2-HW SPI2 / 3-HW SPI3
d = SPI Port Letter
3 = FSEL Pin
4 = SPI MOSI Pin
7 = SPI MISO Pin
6 = SPI Clock Pin
5 = SPI Chip Select Pin
2 = Frequency Selection	1-433MHz  2-868MHz 3-915MHz
2000 = Centre Frequency 		Channel selection - 96-3903	See Calculation p28
17 = Baud Rate 				See Calculation p37
3 = Receiver Bandwidth
0 = Receiver Gain
0 = Receiver Threshold
7 = Transmitter Deviation
0 = Transmitter Power Output
100 = Transmitter Duty Cycle Setting
0 = Data Mode
85 = Preamble Sync ID Value
1 = Extended Preamble Sync ID Enable
******************************/

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

//common defines
#define MX_RF_SPI_HW	0			//SPI Hardware or Bitbanged Port Control
#define MX_RF_PORT		portd		//Port Connection
//#define MX_RF_PIN		latd		//Port Connection
#define MX_RF_TRIS		trisd		//DDR Connection
#define MX_RF_FSEL		3			//RFmodule - FSEL

#define MX_RF_SDO		4			//SPI - Data Out
#define MX_RF_SDI	  	7			//SPI - Data In
#define MX_RF_SCK  		6			//SPI - Clock

#define MX_RF_SCS  		5			//SPI - Chip Select
#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_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_DUTY		100
#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

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




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

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


//LCDDisplay(0): //Defines:

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

	//component connections
	#define LCD_459202_PORT0    porta
	#define LCD_459202_TRIS0    trisa
	#define LCD_459202_PORT1    porta
	#define LCD_459202_TRIS1    trisa
	#define LCD_459202_PORT2    porta
	#define LCD_459202_TRIS2    trisa
	#define LCD_459202_PORT3    porta
	#define LCD_459202_TRIS3    trisa
	#define LCD_459202_PORT4    porta
	#define LCD_459202_TRIS4    trisa
	#define LCD_459202_PORT5    porta
	#define LCD_459202_TRIS5    trisa
	#define LCD_459202_BIT0    	2
	#define LCD_459202_BIT1    	3
	#define LCD_459202_BIT2    	4
	#define LCD_459202_BIT3    	5
	#define LCD_459202_RS      	0
	#define LCD_459202_E       	1
	#define LCD_459202_ROWCNT	2
	#define LCD_459202_COLCNT	16

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

	#define ModIDLCD_459202LCD_459202 (((trisa << 5) + porta) << 9)




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

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



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


char FCD_RF0_SPI_Byte(char Data)
{
	
		char retVal = 0;

		#if (MX_RF_SPI_HW == 0)
			char idx;
			for (idx = 0; idx < 8; idx++)
			{
				if (test_bit(Data, 7))
					set_bit(MX_RF_PORT, MX_RF_SDO);		// Set SDO bit
				else
					clear_bit(MX_RF_PORT, MX_RF_SDO);	// Clear SDO bit

				Data = Data << 1;

				set_bit(MX_RF_PORT, MX_RF_SCK);			// SCK Output 1

				delay_us(1);

				retVal = retVal << 1;

				if(test_bit(MX_RF_PORT, MX_RF_SDI))
					retVal = retVal | 0x01;

				clear_bit(MX_RF_PORT, MX_RF_SCK);		// SCK Output 0

				delay_us(1);
			}
		#endif

		#if (MX_RF_SPI_HW == 1)

			#ifndef MX_SPI
				#error Chip does not have SPI capability
			#endif

			MX_RF_SPIBUF = Data;						//send a dummy byte
			while (MX_RF_SPISTATbits.SPIRBF == 0);		//wait until data has been sent
			retVal = MX_RF_SPIBUF;						//receive the byte
		#endif


	  return(retVal);

}

void FCD_RF0_SPI_Byte16(short spicmd)
{
	
		FCD_RF0_SPI_Byte ((spicmd & 0xFF00) >> 8);					// Send Upper Command Byte
		FCD_RF0_SPI_Byte ((spicmd & 0x00FF));						// Send Lower Command Byte

}

short FCD_RF0_SPI_Command(short spicmd)
{
	
		unsigned int retval;

		clear_bit(MX_RF_PORT,MX_RF_SCS);							// Clear Chip Select bit
		delay_us(1);
		retval = ( FCD_RF0_SPI_Byte ((spicmd & 0xFF00) >> 8) << 8);			// Send Upper Command Byte
		retval = retval | FCD_RF0_SPI_Byte ((spicmd & 0x00FF));				// Send Lower Command Byte
		delay_us(1);
		set_bit(MX_RF_PORT,MX_RF_SCS);								// Set Chip Select bit
		delay_us(1);
		return retval;

}

void FCD_RF0_Wait_For_SDI()
{
	
	#if (MX_RF_SPI_HW == 0)
		while(test_bit(MX_RF_PORT, MX_RF_SDI) == 0);			//Wait for SDI Input
	#else
		while(test_bit(MX_RF_SDI_PORT, MX_RF_SDI_PIN) == 0);
	#endif

}

short FCD_RF0_Init_RF_Module()
{
	
		unsigned int Retval;

		set_bit(MX_RF_PORT, MX_RF_SCS);
		clear_bit(MX_RF_TRIS, MX_RF_SCS);

	  #if (MX_RF_SPI_HW == 0)
		// Configure the I/O Pins
		clear_bit(MX_RF_TRIS, MX_RF_SDO);
		clear_bit(MX_RF_TRIS, MX_RF_SCK);
		set_bit(MX_RF_TRIS, MX_RF_SDI);

		clear_bit(MX_RF_PORT, MX_RF_SDO);
		clear_bit(MX_RF_PORT, MX_RF_SCK);
	  #else

		// Configure the I/O Pins
		clear_bit(MX_RF_SDO_TRIS, MX_RF_SDO_PIN);
		clear_bit(MX_RF_SCK_TRIS, MX_RF_SCK_PIN);
		set_bit(MX_RF_SDI_TRIS, MX_RF_SDI_PIN);

		//configure SPI
		sspstat = 64;							// Configure SPI Peripheral

		#ifdef _BOOSTC
			#ifdef SSPCON							// SPI Low Speed for Initialise
				sspcon = 2;
				st_bit(sspcon, SSPEN);
			#endif
			#ifdef SSPCON1
				sspcon1 = 2;
				st_bit(sspcon1, SSPEN);
			#endif
		#endif

		#ifdef HI_TECH_C
			#ifdef sspcon							// SPI Low Speed for Initialise
				SSPCON = 2;
				st_bit(SSPCON, SSPEN);
			#endif
			#ifdef sspcon1
				SSPCON1 = 2;
				st_bit(SSPCON1, SSPEN);
			#endif
		#endif
	  #endif

		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 character 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

	  #if (MX_RF_DATAMODE == 1)
		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

		set_bit(MX_RF_PORT, MX_RF_FSEL);
		clear_bit(MX_RF_TRIS, MX_RF_FSEL);
		MX_RF_Mode = 0;
	  #else
		set_bit(MX_RF_TRIS, MX_RF_FSEL);
		FCD_RF0_SPI_Command(GENCREG);						//Leave the FIFO disabled
		MX_RF_Mode = 2;
	  #endif

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

		return (Retval);

}

void FCD_RF0_Uninit_RF_Module()
{
	
		FCD_RF0_SPI_Command(PDOWN);

}

void FCD_RF0_Send_Byte(char Data)
{
	
		FCD_RF0_Send_String (&Data, 1);

}

void FCD_RF0_Send_String(char* String, char MSZ_String)
{
	
		char ch;
		char Ptr = 0;
		char NextByte = 1;

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

		if(MSZ_String)
		{
			set_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 1
			clear_bit(MX_RF_PORT, MX_RF_SCS);		// Clear Chip Select bit
			delay_us(1);

			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

			ch = String[Ptr++];

			if(ch)												//Atleast 1 character to send?
			{
				while(NextByte)
				{
					FCD_RF0_Wait_For_SDI();								//Wait for SDI Input
					FCD_RF0_SPI_Byte16(TXBREG | ch);

					ch = String[Ptr];

					if(ch == 0)
						NextByte = 0;

					if((Ptr == 0) || (Ptr > MSZ_String))
						NextByte = 0;

					Ptr = Ptr + 1;
				}

				FCD_RF0_Wait_For_SDI();										//Wait for SDI Input
				FCD_RF0_SPI_Byte16(TXBREG | 0x00);

				FCD_RF0_Wait_For_SDI();										//Wait for SDI Input
				FCD_RF0_SPI_Byte16(TXBREG | 0x00);

				FCD_RF0_Wait_For_SDI();										//Wait for SDI Input
			}
			set_bit(MX_RF_PORT, MX_RF_SCS);						// Chip select high, end transmission
		}
		MX_RF_Mode = 0;
		FCD_RF0_Activate_RX_Mode();									//Switch to receive mode

}

char FCD_RF0_Receive_Byte(char Timeout)
{
	
		char retVal;

		FCD_RF0_Receive_String(&retVal, 1, 1, Timeout);

		return retVal;

}

void FCD_RF0_Receive_String(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char Length, char Timeout)
{
	
		char ByteRx, ch;
		char LoopCount;
		char Ptr = 0;
		char NextByte = 1;

		if (MX_RF_Mode != 0)					//If we are in transmit mode
		{
			MX_RF_Mode = 0;						//Set data receive mode
			FCD_RF0_Activate_RX_Mode();					//Activate selected mode
		}

		if (Length > FCR_RETVAL_SIZE)
			Length = FCR_RETVAL_SIZE;

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

			while((LoopCount < Timeout) && (ByteRx == 0))
			{
				clear_bit(MX_RF_PORT, MX_RF_SCS);	// Clear Chip Select bit
				delay_us(1);
			  #if (MX_RF_SPI_HW == 0)
				ByteRx = (test_bit(MX_RF_PORT, MX_RF_SDI));
			  #else
				ByteRx = (test_bit(MX_RF_SDI_PORT, MX_RF_SDI_PIN));
			  #endif
				set_bit(MX_RF_PORT, MX_RF_SCS);								// Set Chip Select bit

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

			if(ByteRx)
			{
				clear_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 0
				delay_us(1);

				ch = FCD_RF0_SPI_Byte(0);

				if (ch)
				{
					FCR_RETVAL[Ptr] = ch;
					Ptr = Ptr + 1;
				}
				else
				{
					NextByte = 0;
				}
				set_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 1
			}
			else
			{
				NextByte = 0;
			}

			if(Ptr == Length)
				NextByte = 0;
		}

		if(Ptr < FCR_RETVAL_SIZE)
			FCR_RETVAL[Ptr] = 0;

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

		set_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 1
		set_bit(MX_RF_PORT, MX_RF_SCS);			// Chip select high, end transmission

}

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

			set_bit(MX_RF_PORT, MX_RF_FSEL);
			clear_bit(MX_RF_TRIS, MX_RF_FSEL);	//FSEL pin as output
		}
		else
		{
			set_bit(MX_RF_TRIS, MX_RF_FSEL);	//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

		set_bit(MX_RF_PORT, MX_RF_FSEL);
		clear_bit(MX_RF_TRIS, MX_RF_FSEL);	//FSEL pin as output

}

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

		if (Frequency > 3903)
			Frequency = 3903;

		FCD_RF0_SPI_Command(CFSREG | Frequency);

}

void FCD_RF0_Set_Sync_Pattern(char Mode, char 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(char Bandwidth, char Gain, char 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(char Deviation, char Power)
{
	
		char 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(char Rate)
{
	
		char 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 | (char)r);

}

char 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(char State)
{
	
		if(MX_RF_Mode != 3)
		{
			MX_RF_Mode = 3;							//Set system mode value
			FCD_RF0_Activate_TX_Mode();
		}

		if(State)
			set_bit(MX_RF_PORT, MX_RF_FSEL);
		else
			clear_bit(MX_RF_PORT, MX_RF_FSEL);

}

char FCD_RF0_FSK_Read()
{
	
		if (MX_RF_Mode != 2)
		{
			MX_RF_Mode = 2;
			FCD_RF0_Activate_RX_Mode();
		}

		return(test_bit(MX_RF_PORT, MX_RF_FSEL));

}

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

}

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

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

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

			MX_RF_TX_Buffer[Ptr] = Csum;

			//Include count and checksum
			Count = 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
			}

			set_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 1
			clear_bit(MX_RF_PORT, MX_RF_SCS);		// 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];

			Ptr = Ptr + 1;

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

				Ptr = Ptr + 1;

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

			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

			set_bit(MX_RF_PORT, MX_RF_SCS);				// Chip select high, end transmission

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

}

char FCD_RF0_Check_Buffer(char Timeout)
{
	
		char ByteRx, Data;
		char LoopCount;
		char Ptr = 0;
		char NextByte = 1;
		char Count;
		char retVal = 255;

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

		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))
		{
			clear_bit(MX_RF_PORT, MX_RF_SCS);	// Clear Chip Select bit
			delay_us(1);

			#if (MX_RF_SPI_HW == 0)
				ByteRx = (test_bit(MX_RF_PORT, MX_RF_SDI));
			#else
				ByteRx = (test_bit(MX_RF_PORT, MX_SPI_SDI));
			#endif

			set_bit(MX_RF_PORT, MX_RF_SCS);								// Set Chip Select bit

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

			LoopCount++;
		}

		if(ByteRx)
		{
			retVal = 254;		//Count received: default = count error
			clear_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 0
			delay_us(1);

			Count = FCD_RF0_SPI_Byte(0);

			set_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 1

			if (Count <= MX_RF_BUFFER_MAX)
			{
				retVal = 253;		//Receiving data: default = count match error
				MX_RF_RX_Buff1[Ptr] = Count;
				Ptr = Ptr + 1;

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

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

					while((LoopCount < Timeout) && (ByteRx == 0))
					{
						clear_bit(MX_RF_PORT, MX_RF_SCS);	// Clear Chip Select bit
						delay_us(1);

						#if (MX_RF_SPI_HW == 0)
							ByteRx = (test_bit(MX_RF_PORT, MX_RF_SDI));
						#else
							ByteRx = (test_bit(MX_RF_PORT, MX_SPI_SDI));
						#endif

						set_bit(MX_RF_PORT, MX_RF_SCS);								// Set Chip Select bit

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

					if(ByteRx)
					{
						clear_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 0
						delay_us(1);

						MX_RF_RX_Buff1[Ptr] = FCD_RF0_SPI_Byte(0);
						Ptr = Ptr + 1;
						set_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 1
					}
					else
					{
						NextByte = 0;
					}

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

						for(Ptr = 0; Ptr < Count; Ptr++)
							MX_RF_RX_Buffer[Ptr] = MX_RF_RX_Buff1[Ptr];

						retVal = Count - 2;
					}
				}
			}
	//		set_bit(MX_RF_PORT, MX_RF_FSEL);		// FSEL Output 1

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

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

		set_bit(MX_RF_PORT, MX_RF_FSEL);			// FSEL Output 1
		set_bit(MX_RF_PORT, MX_RF_SCS);				// Chip select high, end transmission

		return (retVal);

}

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

}

char FCD_RF0_Get_Buffer_Data(char 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(char in, char mask)
{
	
	#ifndef MX_MIAC_SYSTEM
		unsigned char pt;

		clear_bit(LCD_459202_PORT0, LCD_459202_BIT0);
		clear_bit(LCD_459202_PORT1, LCD_459202_BIT1);
		clear_bit(LCD_459202_PORT2, LCD_459202_BIT2);
		clear_bit(LCD_459202_PORT3, LCD_459202_BIT3);
		clear_bit(LCD_459202_PORT4, LCD_459202_RS);
		clear_bit(LCD_459202_PORT5, LCD_459202_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_459202_PORT0, LCD_459202_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_459202_PORT1, LCD_459202_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_459202_PORT2, LCD_459202_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_459202_PORT3, LCD_459202_BIT3);
		if (mask)
		    set_bit(LCD_459202_PORT4, LCD_459202_RS);
		LCD_459202_DELAY;
		set_bit (LCD_459202_PORT5, LCD_459202_E);
		LCD_459202_DELAY;
		clear_bit (LCD_459202_PORT5, LCD_459202_E);
		pt = (in & 0x0f);
		LCD_459202_DELAY;
		clear_bit(LCD_459202_PORT0, LCD_459202_BIT0);
		clear_bit(LCD_459202_PORT1, LCD_459202_BIT1);
		clear_bit(LCD_459202_PORT2, LCD_459202_BIT2);
		clear_bit(LCD_459202_PORT3, LCD_459202_BIT3);
		clear_bit(LCD_459202_PORT4, LCD_459202_RS);
		clear_bit(LCD_459202_PORT5, LCD_459202_E);
		if (pt & 0x01)
		    set_bit(LCD_459202_PORT0, LCD_459202_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_459202_PORT1, LCD_459202_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_459202_PORT2, LCD_459202_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_459202_PORT3, LCD_459202_BIT3);
		if (mask)
		    set_bit(LCD_459202_PORT4, LCD_459202_RS);
		LCD_459202_DELAY;
		set_bit (LCD_459202_PORT5, LCD_459202_E);
		LCD_459202_DELAY;
		clear_bit (LCD_459202_PORT5, LCD_459202_E);
		LCD_459202_DELAY;

	#endif

}

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

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

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

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

	  #endif
	#else

		clear_bit(LCD_459202_TRIS0, LCD_459202_BIT0);
		clear_bit(LCD_459202_TRIS1, LCD_459202_BIT1);
		clear_bit(LCD_459202_TRIS2, LCD_459202_BIT2);
		clear_bit(LCD_459202_TRIS3, LCD_459202_BIT3);
		clear_bit(LCD_459202_TRIS4, LCD_459202_RS);
		clear_bit(LCD_459202_TRIS5, LCD_459202_E);

		Wdt_Delay_Ms(12);

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

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

}

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

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

}

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



		MIAC_CAN_TX[0] = Character;

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

}

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

		MIAC_CAN_TX[0] = in;

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

}

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

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

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

	#else

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

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

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

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

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

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

}

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

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

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

	#else

		short tmp_int;
		char tmp_byte;

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

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

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

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

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

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

}

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

	#ifdef MX_MIAC_SYSTEM
	  #if (porta != MX_MIAC_MM_MIAC_BASE)

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

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

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

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

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

}

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

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

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

		char cmd = 0;
		char count;

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

				cmd = 0x18;
				break;

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

				cmd = 0x1C;
				break;

			default:
				break;
		}

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

}

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

		MIAC_CAN_TX[0] = Line;

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

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

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

		#if (LCD_459202_ROWCNT == 4)
			#if (LCD_459202_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_459202_COLCNT == 20)
				rowcount=20;
			#endif
		#endif

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

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

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

}

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

	#ifdef MX_MIAC_SYSTEM
	  #if (porta != MX_MIAC_MM_MIAC_BASE)

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

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

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

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

	  #endif
	#else

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

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

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

}

//Makro-Implementierungen

void FCM_Split_Buffer()
{
	//Teilt den RF_Byte_Read in Abteilung und Taster auf
	
	//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
			//String Manipulation:
			//  Abteilung_Text = "AV"
			FCI_CONCATENATE("AV",2,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			

			break;
		}

		case 2:
		{
			//String Manipulation
			//String Manipulation:
			//  Abteilung_Text = "Reparaturen"
			FCI_CONCATENATE("Reparaturen",11,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			

			break;
		}

		case 3:
		{
			//String Manipulation
			//String Manipulation:
			//  Abteilung_Text = "Kunststoff"
			FCI_CONCATENATE("Kunststoff",10,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			

			break;
		}

		case 4:
		{
			//String Manipulation
			//String Manipulation:
			//  Abteilung_Text = "Edelmetall"
			FCI_CONCATENATE("Edelmetall",10,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			

			break;
		}

		case 5:
		{
			//String Manipulation
			//String Manipulation:
			//  Abteilung_Text = "Modellguss"
			FCI_CONCATENATE("Modellguss",10,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			

			break;
		}

		case 6:
		{
			//String Manipulation
			//String Manipulation:
			//  Abteilung_Text = "Keramik Labor"
			FCI_CONCATENATE("Keramik Labor",13,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			

			break;
		}

		case 7:
		{
			//String Manipulation
			//String Manipulation:
			//  Abteilung_Text = "Keramik Brennen"
			FCI_CONCATENATE("Keramik Brennen",15,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			

			break;
		}

		case 8:
		{
			//String Manipulation
			//String Manipulation:
			//  Abteilung_Text = "CAD/CAM"
			FCI_CONCATENATE("CAD/CAM",7,"",0,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
			//String Manipulation:
			//  Abteilung_Text = " "
			FCI_CONCATENATE(" ",1,"",0,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
			//String Manipulation:
			//  Person = "Petra Zahn"
			FCI_CONCATENATE("Petra Zahn",10,"",0,FCV_PERSON,FCSZ_PERSON);
			

			break;
		}

		case 2:
		{
			//String Manipulation
			//String Manipulation:
			//  Person = "Dirk Mueller"
			FCI_CONCATENATE("Dirk Mueller",12,"",0,FCV_PERSON,FCSZ_PERSON);
			

			break;
		}

		case 3:
		{
			//String Manipulation
			//String Manipulation:
			//  Person = "Markus Jung"
			FCI_CONCATENATE("Markus Jung",11,"",0,FCV_PERSON,FCSZ_PERSON);
			

			break;
		}

		case 4:
		{
			//String Manipulation
			//String Manipulation:
			//  Person = "Vertretung"
			FCI_CONCATENATE("Vertretung",10,"",0,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
			//String Manipulation:
			//  Abteilung_Text = " "
			//  Person = " "
			FCI_CONCATENATE(" ",1,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
			FCI_CONCATENATE(" ",1,"",0,FCV_PERSON,FCSZ_PERSON);
			

		}
	}


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

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


}

void FCM_Show()
{
	//Zeigt Abteilung und Taste
	
	//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: LCDDisplay(0)::PrintString(Abteilung_Text)
	FCD_LCDDisplay0_PrintString(FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);


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


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


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


}

void FCM_Buzzer()
{
	//Piepton zur Aufmerksamkeitserzeugung
	
	//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: RF(0)::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
	//String Manipulation:
	//  Abteilung_Text = " "
	FCI_CONCATENATE(" ",1,"",0,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: RF(0)::Init_RF_Module
	FCD_RF0_Init_RF_Module();


}

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


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


	//C-Kode
	//C-Kode:
	/*
	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
	//String Manipulation:
	//  Abteilung_Text = " "
	FCI_CONCATENATE(" ",1,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
	

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


	//Init RF Module
	//Aufruf Komponenten-Makro: RF(0)::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: LCDDisplay(0)::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
		//String Manipulation:
		//  Abteilung_Text = " "
		FCI_CONCATENATE(" ",1,"",0,FCV_ABTEILUNG_TEXT,FCSZ_ABTEILUNG_TEXT);
		

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


		//Aufruf Komponenten-Makro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::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: LCDDisplay(0)::Clear
			FCD_LCDDisplay0_Clear();


			//Output
			//Output: 0 -> PORTC
			trisc = trisc & 0xf0;
			portc = (portc & 0xf0) | (0 & 0x0f);


		}


	}


	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}



