//************************************************************************************
//**  
//**  File name:     C:\Downloads\Door Lock.c
//**  Generated by:  Flowcode v4.3.7.63
//**  Date:          Wednesday, June 16, 2010 22:53:36
//**  Licence:       Professional
//**  Registered to: Hmmm, that will be telling :P
//**  
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_PIC

//Defines for microcontroller
#define P16F877A
#define MX_EE
#define MX_EE_TYPE2
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_C
#define MX_SPI_SDI 4
#define MX_SPI_SDO 5
#define MX_SPI_SCK 3
#define MX_UART
#define MX_UART_C
#define MX_UART_TX 6
#define MX_UART_RX 7
#define MX_I2C
#define MX_MI2C
#define MX_I2C_C
#define MX_I2C_SDA 4
#define MX_I2C_SCL 3
#define MX_PWM
#define MX_PWM_CNT 2
#define MX_PWM_TRIS1 trisc
#define MX_PWM_1 2
#define MX_PWM_TRIS2 trisc
#define MX_PWM_2 1

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

//Macro function declarations


//Variable declarations
char FCV_CURSORPOS_X;
char FCV_PLACE;
char FCV_DEGCALC[4];
char FCV_KEY;
char FCV_DIGCOUNT;
short FCV_RESULT;
short FCV_PASS_CODE;


//Defines:

/**** Macro Substitutions ****
{'1','4','7','*','2','5','8','0','3','6','9','#'} = Key List (Numbers)
{1,4,7,10,2,5,8,0,3,6,9,11} = Key List (Characters)
trisb = Row Data Direction Register
portb = Row Port Register
3 = Number Of Columns
4 = Number Of Rows
trisb = Column Data Direction Register
portb = Column Port Register
1 = Column 1 mask
2 = Column 2 mask
4 = Column 3 mask
16 = Column 4 mask
16 = Row 1 mask
32 = Row 2 mask
64 = Row 3 mask
128 = Row 4 mask
******************************/




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

char FCD_KeyPad0_GetKeypadNumber();
char FCD_KeyPad0_GetKeypadAscii();
//Defines:

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

	//component connections
	#define LCD_133184_PORT0    portc
	#define LCD_133184_TRIS0    trisc
	#define LCD_133184_PORT1    portc
	#define LCD_133184_TRIS1    trisc
	#define LCD_133184_PORT2    portc
	#define LCD_133184_TRIS2    trisc
	#define LCD_133184_PORT3    portc
	#define LCD_133184_TRIS3    trisc
	#define LCD_133184_PORT4    portc
	#define LCD_133184_TRIS4    trisc
	#define LCD_133184_PORT5    portc
	#define LCD_133184_TRIS5    trisc
	#define LCD_133184_BIT0    	0
	#define LCD_133184_BIT1    	1
	#define LCD_133184_BIT2    	2
	#define LCD_133184_BIT3    	3
	#define LCD_133184_RS      	4
	#define LCD_133184_E       	5
	#define LCD_133184_ROWCNT	2
	#define LCD_133184_COLCNT	16

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




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

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

/**** Macro Substitutions ****
porta = LED Port Register
trisa = LED Data Direction Register
1 = LED Pin Mask
1 = LED Active Polarity
******************************/




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

void FCD_LED0_LEDOn();
void FCD_LED0_LEDOff();
//Defines:

/**** Macro Substitutions ****
porta = LED Port Register
trisa = LED Data Direction Register
4 = LED Pin Mask
1 = LED Active Polarity
******************************/




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

void FCD_LED1_LEDOn();
void FCD_LED1_LEDOff();



//KeyPad(0): //Macro implementations


char FCD_KeyPad0_GetKeypadNumber()
{
		//get matrices for rows and columns
		#if (3 == 1)
			#define KPAD_COL_MTX {1}
			#define KPAD_COL_MASK (1)
		#endif
		#if (3 == 2)
			#define KPAD_COL_MTX {1,2}
			#define KPAD_COL_MASK (1|2)
		#endif
		#if (3 == 3)
			#define KPAD_COL_MTX {1,2,4}
			#define KPAD_COL_MASK (1|2|4)
		#endif
		#if (3 == 4)
			#define KPAD_COL_MTX {1,2,4,16}
			#define KPAD_COL_MASK (1|2|4|16)
		#endif
		#if (4 == 1)
			#define KPAD_ROW_MTX {16}
			#define KPAD_ROW_MASK (16)
		#endif
		#if (4 == 2)
			#define KPAD_ROW_MTX {16,32}
			#define KPAD_ROW_MASK (16|32)
		#endif
		#if (4 == 3)
			#define KPAD_ROW_MTX {16,32,64}
			#define KPAD_ROW_MASK (16|32|64)
		#endif
		#if (4 == 4)
			#define KPAD_ROW_MTX {16,32,64,128}
			#define KPAD_ROW_MASK (16|32|64|128)
		#endif

		#ifndef KPAD_COL_MTX
	  		#ifdef _BOOSTC
	  			#pragma error "Keypad error: column count is not 1-4"
	  		#endif
	  		#ifdef HI_TECH_C
	  			#error Keypad error: column count is not 1-4
			#endif
		#endif
		#ifndef KPAD_ROW_MTX
	  		#ifdef _BOOSTC
	  			#pragma error "Keypad error: row count is not 1-4"
	  		#endif
	  		#ifdef HI_TECH_C
	  			#error Keypad error: row count is not 1-4
			#endif
		#endif

		//store keys and pin connections into a constant array
		#ifdef _BOOSTC
			rom char* mtxKeysAsNumbers = {1,4,7,10,2,5,8,0,3,6,9,11};
			rom char* mtxCols = KPAD_COL_MTX;
			rom char* mtxRows = KPAD_ROW_MTX;
		#endif
		#ifdef HI_TECH_C
			const char mtxKeysAsNumbers[] = {1,4,7,10,2,5,8,0,3,6,9,11};
			const char mtxCols[] = KPAD_COL_MTX;
			const char mtxRows[] = KPAD_ROW_MTX;
		#endif

		//set up i/o of port (rows = inputs, columns = outputs)
		trisb = (trisb | KPAD_ROW_MASK);
		trisb = (trisb & ~KPAD_COL_MASK);		//BR

		char iCol;
		char iRow;
		char c_ip;
		for (iCol=0; iCol<3; iCol++)
		{
			//output the appropriate column high
			portb = mtxCols[iCol];

			//delay
			delay_us(10);

			//read the port
			c_ip = portb;

			//check for a hit
			for (iRow=0; iRow<4; iRow++)
			{
				if ((c_ip & mtxRows[iRow]) != 0)
				{
					//found it!
					goto found_key;
				}
			}
		}

		//if it gets here, it has not been found...
		return (255);

	  found_key:
		return (mtxKeysAsNumbers[(iCol*4) + iRow]);

	  #undef KPAD_COL_MTX
	  #undef KPAD_ROW_MTX
	  #undef KPAD_COL_MASK
	  #undef KPAD_ROW_MASK

}

char FCD_KeyPad0_GetKeypadAscii()
{
		//get matrices for rows and columns
		#if (3 == 1)
			#define KPAD_COL_MTX {1}
			#define KPAD_COL_MASK (1)
		#endif
		#if (3 == 2)
			#define KPAD_COL_MTX {1,2}
			#define KPAD_COL_MASK (1|2)
		#endif
		#if (3 == 3)
			#define KPAD_COL_MTX {1,2,4}
			#define KPAD_COL_MASK (1|2|4)
		#endif
		#if (3 == 4)
			#define KPAD_COL_MTX {1,2,4,16}
			#define KPAD_COL_MASK (1|2|4|16)
		#endif
		#if (4 == 1)
			#define KPAD_ROW_MTX {16}
			#define KPAD_ROW_MASK (16)
		#endif
		#if (4 == 2)
			#define KPAD_ROW_MTX {16,32}
			#define KPAD_ROW_MASK (16|32)
		#endif
		#if (4 == 3)
			#define KPAD_ROW_MTX {16,32,64}
			#define KPAD_ROW_MASK (16|32|64)
		#endif
		#if (4 == 4)
			#define KPAD_ROW_MTX {16,32,64,128}
			#define KPAD_ROW_MASK (16|32|64|128)
		#endif

		#ifndef KPAD_COL_MTX
	  		#ifdef _BOOSTC
	  			#pragma error "Keypad error: column count is not 1-4"
	  		#endif
	  		#ifdef HI_TECH_C
	  			#error Keypad error: column count is not 1-4
			#endif
		#endif
		#ifndef KPAD_ROW_MTX
	  		#ifdef _BOOSTC
	  			#pragma error "Keypad error: row count is not 1-4"
	  		#endif
	  		#ifdef HI_TECH_C
	  			#error Keypad error: row count is not 1-4
			#endif
		#endif

		//store keys and pin connections into a constant array
		#ifdef _BOOSTC
			rom char* mtxKeysAsChars = {'1','4','7','*','2','5','8','0','3','6','9','#'};
			rom char* mtxCols = KPAD_COL_MTX;
			rom char* mtxRows = KPAD_ROW_MTX;
		#endif
		#ifdef HI_TECH_C
			const char mtxKeysAsChars[] = {'1','4','7','*','2','5','8','0','3','6','9','#'};
			const char mtxCols[] = KPAD_COL_MTX;
			const char mtxRows[] = KPAD_ROW_MTX;
		#endif

		//set up i/o of port (rows = inputs, columns = outputs)
		trisb = (trisb | KPAD_ROW_MASK);
		trisb = (trisb & ~KPAD_COL_MASK);

		char iCol;
		char iRow;
		char c_ip;
		for (iCol=0; iCol<3; iCol++)
		{
			//output the appropriate column high
			portb = mtxCols[iCol];

			//delay
			delay_us(10);

			//read the port
			c_ip = portb;

			//check for a hit
			for (iRow=0; iRow<4; iRow++)
			{
				if ((c_ip & mtxRows[iRow]) != 0)
				{
					//found it!
					goto found_key;
				}
			}
		}

		//if it gets here, it has not been found...
		return (255);

	  found_key:
		return (mtxKeysAsChars[(iCol*4) + iRow]);

	  #undef KPAD_COL_MTX
	  #undef KPAD_ROW_MTX
	  #undef KPAD_COL_MASK
	  #undef KPAD_ROW_MASK

}



//LCDDisplay(0): //Macro implementations


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

		clear_bit(LCD_133184_PORT0, LCD_133184_BIT0);
		clear_bit(LCD_133184_PORT1, LCD_133184_BIT1);
		clear_bit(LCD_133184_PORT2, LCD_133184_BIT2);
		clear_bit(LCD_133184_PORT3, LCD_133184_BIT3);
		clear_bit(LCD_133184_PORT4, LCD_133184_RS);
		clear_bit(LCD_133184_PORT5, LCD_133184_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_133184_PORT0, LCD_133184_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_133184_PORT1, LCD_133184_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_133184_PORT2, LCD_133184_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_133184_PORT3, LCD_133184_BIT3);
		if (mask)
		    set_bit(LCD_133184_PORT4, LCD_133184_RS);
		LCD_133184_DELAY;
		set_bit (LCD_133184_PORT5, LCD_133184_E);
		LCD_133184_DELAY;
		clear_bit (LCD_133184_PORT5, LCD_133184_E);
		pt = (in & 0x0f);
		LCD_133184_DELAY;
		clear_bit(LCD_133184_PORT0, LCD_133184_BIT0);
		clear_bit(LCD_133184_PORT1, LCD_133184_BIT1);
		clear_bit(LCD_133184_PORT2, LCD_133184_BIT2);
		clear_bit(LCD_133184_PORT3, LCD_133184_BIT3);
		clear_bit(LCD_133184_PORT4, LCD_133184_RS);
		clear_bit(LCD_133184_PORT5, LCD_133184_E);
		if (pt & 0x01)
		    set_bit(LCD_133184_PORT0, LCD_133184_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_133184_PORT1, LCD_133184_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_133184_PORT2, LCD_133184_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_133184_PORT3, LCD_133184_BIT3);
		if (mask)
		    set_bit(LCD_133184_PORT4, LCD_133184_RS);
		LCD_133184_DELAY;
		set_bit (LCD_133184_PORT5, LCD_133184_E);
		LCD_133184_DELAY;
		clear_bit (LCD_133184_PORT5, LCD_133184_E);
		LCD_133184_DELAY;
}

void FCD_LCDDisplay0_Start()
{
	
		clear_bit(LCD_133184_TRIS0, LCD_133184_BIT0);
		clear_bit(LCD_133184_TRIS1, LCD_133184_BIT1);
		clear_bit(LCD_133184_TRIS2, LCD_133184_BIT2);
		clear_bit(LCD_133184_TRIS3, LCD_133184_BIT3);
		clear_bit(LCD_133184_TRIS4, LCD_133184_RS);
		clear_bit(LCD_133184_TRIS5, LCD_133184_E);

		Wdt_Delay_Ms(12);

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

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

}

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

}

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

}

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

}

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

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

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

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

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

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

}

void FCD_LCDDisplay0_PrintNumber(short Number)
{
	
		short tmp_int;
		char tmp_byte;
		if (Number < 0)
		{
			FCD_LCDDisplay0_RawSend('-', 0x10);
			Number = 0 - Number;
		}

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

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

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

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

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

}

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

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

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

}

void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions)
{
	
		char cmd = 0;
		char count;

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

				cmd = 0x18;
				break;

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

				cmd = 0x1C;
				break;

			default:
				break;
		}

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

}

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

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

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

		#if (LCD_133184_ROWCNT == 4)
			#if (LCD_133184_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_133184_COLCNT == 20)
				rowcount=20;
			#endif
		#endif

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

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

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

}

void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7)
{
	   //set CGRAM address
	   FCD_LCDDisplay0_RawSend(64 + (nIdx << 3), 0);
	   delay_ms(2);

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

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



//LED(0): //Macro implementations


void FCD_LED0_LEDOn()
{
	
		#ifdef MX_10F_TRIS
			tvar = tvar & ~1;
			asm("movf(_tvar),w");
			asm("tris 6");
		#else
			trisa = trisa & ~1;			//Convert pin to output
		#endif

			if( 1 )					//Active high polarity
				porta = porta | 1;
			else					//Active low polarity
				porta = porta & ~1;

}

void FCD_LED0_LEDOff()
{
	
		#ifdef MX_10F_TRIS
			tvar = tvar & ~1;
			asm("movf(_tvar),w");
			asm("tris 6");
		#else
			trisa = trisa & ~1;			//Convert pin to output
		#endif

			if( 1 )					//Active high polarity
				porta = porta & ~1;
			else					//Active low polarity
				porta = porta | 1;

}



//LED(1): //Macro implementations


void FCD_LED1_LEDOn()
{
	
		#ifdef MX_10F_TRIS
			tvar = tvar & ~4;
			asm("movf(_tvar),w");
			asm("tris 6");
		#else
			trisa = trisa & ~4;			//Convert pin to output
		#endif

			if( 1 )					//Active high polarity
				porta = porta | 4;
			else					//Active low polarity
				porta = porta & ~4;

}

void FCD_LED1_LEDOff()
{
	
		#ifdef MX_10F_TRIS
			tvar = tvar & ~4;
			asm("movf(_tvar),w");
			asm("tris 6");
		#else
			trisa = trisa & ~4;			//Convert pin to output
		#endif

			if( 1 )					//Active high polarity
				porta = porta & ~4;
			else					//Active low polarity
				porta = porta | 4;

}

//Macro implementations

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


	//Interrupt initialisation code
	option_reg = 0xC0;


	//Comment:
	//Press * on keypad to re-enter all numbers.
	//Press # on keypad when you have entered 4 digit code.


	//Comment:
	//Allow LCD warm up time


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


	//Comment:
	//Set code value here


	//Calculation
	//Calculation:
	//  Pass_Code = 1234
	FCV_PASS_CODE = 1234;
	

	//Call Component Macro
	//Call Component Macro: LCDDisplay(0)::Start
	FCD_LCDDisplay0_Start();


	//Call Component Macro
	//Call Component Macro: LED(0)::LEDOn
	FCD_LED0_LEDOn();


	//Call Component Macro
	//Call Component Macro: LED(1)::LEDOff
	FCD_LED1_LEDOff();


	//Calculation
	//Calculation:
	//  key = 0
	//  digcount = 0
	FCV_KEY = 0;
	FCV_DIGCOUNT = 0;
	

	//Loop
	//Loop: While 1
	while (1)
	{
		//Call Component Macro
		//Call Component Macro: LCDDisplay(0)::Cursor(0, 0)
		FCD_LCDDisplay0_Cursor(0, 0);


		//Call Component Macro
		//Call Component Macro: LCDDisplay(0)::PrintString("Enter Code:")
		FCD_LCDDisplay0_PrintString("Enter Code:",11);


		//Call Component Macro
		//Call Component Macro: key=KeyPad(0)::GetKeypadAscii
		FCV_KEY = FCD_KeyPad0_GetKeypadAscii();


		//Decision
		//Decision: key <> 255?
		if (FCV_KEY != 255)
		{
			//Comment:
			//Convert ASCII to Integer


			//Calculation
			//Calculation:
			//  key = key - 48
			FCV_KEY = FCV_KEY - 48;
			

			//Comment:
			//250 = * Keypad key


			//digits
			//Decision: (digcount <4) AND (key<>250)?
			if ((FCV_DIGCOUNT <4) & (FCV_KEY!=250))
			{
				//Comment:
				//Set cursor to dispaly number in correct postion


				//Calculation
				//Calculation:
				//  CursorPos_x = digcount + 11
				FCV_CURSORPOS_X = FCV_DIGCOUNT + 11;
				

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


				//Call Component Macro
				//Call Component Macro: LCDDisplay(0)::PrintNumber(key)
				FCD_LCDDisplay0_PrintNumber(FCV_KEY);


				//Calculation
				//Calculation:
				//  degcalc[digcount] = key
				//  digcount = digcount + 1
				FCV_DEGCALC[FCV_DIGCOUNT] = FCV_KEY;
				FCV_DIGCOUNT = FCV_DIGCOUNT + 1;
				

			} else {
				//Comment:
				//243 = # Keypad key 


				//Decision
				//Decision: key=243?
				if (FCV_KEY==243)
				{
					//Comment:
					//Convert all arrays to Int


					//Calculation
					//Calculation:
					//  Result = degcalc[0]*1000+degcalc[1]*100+degcalc[2]*10+degcalc[3]
					FCV_RESULT = FCV_DEGCALC[0]*1000+FCV_DEGCALC[1]*100+FCV_DEGCALC[2]*10+FCV_DEGCALC[3];
					

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


					//Comment:
					//Compare entered code with numbers set in Pass_Code


					//Decision
					//Decision: Result=Pass_Code?
					if (FCV_RESULT==FCV_PASS_CODE)
					{
						//Call Component Macro
						//Call Component Macro: LCDDisplay(0)::PrintString("Door Unlocked!")
						FCD_LCDDisplay0_PrintString("Door Unlocked!",14);


						//Call Component Macro
						//Call Component Macro: LED(0)::LEDOff
						FCD_LED0_LEDOff();


						//Call Component Macro
						//Call Component Macro: LED(1)::LEDOn
						FCD_LED1_LEDOn();


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


						//Call Component Macro
						//Call Component Macro: LED(0)::LEDOn
						FCD_LED0_LEDOn();


						//Call Component Macro
						//Call Component Macro: LED(1)::LEDOff
						FCD_LED1_LEDOff();


					} else {
						//Call Component Macro
						//Call Component Macro: LCDDisplay(0)::PrintString("Wrong Code!")
						FCD_LCDDisplay0_PrintString("Wrong Code!",11);


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


					}


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


					//Comment:
					//Reset Variables so can start again.


					//Calculation
					//Calculation:
					//  key = 0
					//  digcount = 0
					FCV_KEY = 0;
					FCV_DIGCOUNT = 0;
					

				} else {
					//Decision
					//Decision: key=250?
					if (FCV_KEY==250)
					{
						//Calculation
						//Calculation:
						//  key = 0
						//  digcount = 0
						FCV_KEY = 0;
						FCV_DIGCOUNT = 0;
						

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


					}


				}


			}


			//Comment:
			//Wait here if key is still pressed.
			//Stops same key entered muliple times whilst finger is still pressing key


			//Loop
			//Loop: While key=255
			while (1)
			{
				//Call Component Macro
				//Call Component Macro: key=KeyPad(0)::GetKeypadAscii
				FCV_KEY = FCD_KeyPad0_GetKeypadAscii();


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


		}


	}


	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}



