//************************************************************************************
//**  
//**  File name:     C:\Documents and Settings\uros\Desktop\flowcode\rs232 com.c
//**  Generated by:  Flowcode v4.3.7.63
//**  Date:          Saturday, December 25, 2010 17:03:25
//**  Licence:       Student
//**  Registered to: urosrutar1 
//**  
//**  
//**     NOT FOR COMMERCIAL USE
//**  
//**  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 4000000
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

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

//Internal functions
#include "C:\Program Files\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Macro function declarations


//Variable declarations
short FCV_NEKI;
short FCV_NEKI2;


//Defines:

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

	//component connections
	#define LCD_460032_PORT0    portb
	#define LCD_460032_TRIS0    trisb
	#define LCD_460032_PORT1    portb
	#define LCD_460032_TRIS1    trisb
	#define LCD_460032_PORT2    portb
	#define LCD_460032_TRIS2    trisb
	#define LCD_460032_PORT3    portb
	#define LCD_460032_TRIS3    trisb
	#define LCD_460032_PORT4    portb
	#define LCD_460032_TRIS4    trisb
	#define LCD_460032_PORT5    portb
	#define LCD_460032_TRIS5    trisb
	#define LCD_460032_BIT0    	0
	#define LCD_460032_BIT1    	1
	#define LCD_460032_BIT2    	2
	#define LCD_460032_BIT3    	3
	#define LCD_460032_RS      	4
	#define LCD_460032_E       	5
	#define LCD_460032_ROWCNT	2
	#define LCD_460032_COLCNT	16

	#ifdef _BOOSTC
	  #define LCD_460032_DELAY   delay_10us(10)
	#endif
	#ifdef _C2C_
	  #define LCD_460032_DELAY   delay_us(100)
	#endif
	#ifdef HI_TECH_C
	  #define LCD_460032_DELAY   __delay_us(120)
	#endif
	#ifndef LCD_460032_DELAY
	  #define LCD_460032_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 ****
portc = RTS Port
trisc = RTS Data Direction
portc = CTS Port
trisc = CTS Data Direction
0 = RTS Pin
4 = CTS Pin
0 = UART Selection		(0-SW / 1-UART1 / 2-UART2)
0 = Flow Control		(0-Off / 1-On)
0 = Debug Enable		(0-Off / 1-On)
0 = Echo Enable		(0-Off / 1-On)
4 = UART TXSTA Value
25 = UART SPBRG Value
RS232_525556 = Unique ID
portd = Bitbanged Receive Port Register
trisd = Bitbanged Receive Data Direction Register
2 = Bitbanged Receive Pin
3 = Bitbanged Transmit Pin
3 = Bitbanged BAUD Rate Delay
0 = Timout	Selection	(0-Legacy / 1-MS Timeout)
2 = Data Size			(0-8 bits / 1-9 bits / 2-7 bits & Only available on BitBanged components)
0 = Parity Enable		(0-No Parity / 1-Odd Parity / 2-Even Parity)
1 = Legacy Return		(0-Legacy mode return 255 / 1-New mode return MSB err flags)
portd = Bitbanged Transmit Port Register
trisd = Bitbanged Transmit Data Direction Register
******************************/

#define RS232_525556_RTS_PORT			portc
#define RS232_525556_RTS_TRIS			trisc
#define RS232_525556_CTS_PORT			portc
#define RS232_525556_CTS_TRIS			trisc
#define RS232_525556_RTS_PIN			0
#define RS232_525556_CTS_PIN			4
#define RS232_525556_UART				0
#define RS232_525556_TOUT  			0
#define RS232_525556_DATASIZE			2
#define RS232_525556_PARITY			0
#define RS232_525556_LEGACY_RV			1

#if (0 == 1)
  	#define RS232_525556_HARDWARE
#endif

#if (0 == 1)
  	#define RS232_525556_DEBUG
#endif

#if (0 == 1)
  	#define RS232_525556_ECHO
#endif

#if (RS232_525556_UART == 0)
	#define RS232_525556_RX_PORT		portd
	#define RS232_525556_RX_TRIS		trisd
	#define RS232_525556_SW_RX		2
	#define RS232_525556_SW_TX		3
	#define RS232_525556_SW_BAUD		3
	#define RS232_525556_TX_PORT		portd
	#define RS232_525556_TX_TRIS		trisd
#else
	#define RS232_525556_TXSTA_VAL  	4
	#define RS232_525556_SPBRG_VAL  	25
	#define RS232_525556_SW_BAUD		0
#endif

#if (RS232_525556_LEGACY_RV == 0)
	#if (RS232_525556_DATASIZE == 1)
		#ifdef _BOOSTC
			#pragma error "Chip does not have second UART capability"
		#endif
		#ifdef HI_TECH_C
			#error "Chip does not have second UART capability"
		#endif
	#endif
#endif

#define RS232_525556_STATUS_LOOP		0
#define RS232_525556_STATUS_TIMEOUT	1
#define RS232_525556_STATUS_RXBYTE	2





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

void FCD_RS2320_SendRS232Char(short nChar);
void FCD_RS2320_SendRS232String(char* String, char MSZ_String);
short FCD_RS2320_ReceiveRS232Char(short nTimeout);
void FCD_RS2320_ReceiveRS232String(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char nTimeout, char NumBytes);
void FCD_RS2320_RS232_Delay(char mode);



//LCDDisplay(0): //Macro implementations


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

		clear_bit(LCD_460032_PORT0, LCD_460032_BIT0);
		clear_bit(LCD_460032_PORT1, LCD_460032_BIT1);
		clear_bit(LCD_460032_PORT2, LCD_460032_BIT2);
		clear_bit(LCD_460032_PORT3, LCD_460032_BIT3);
		clear_bit(LCD_460032_PORT4, LCD_460032_RS);
		clear_bit(LCD_460032_PORT5, LCD_460032_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_460032_PORT0, LCD_460032_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_460032_PORT1, LCD_460032_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_460032_PORT2, LCD_460032_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_460032_PORT3, LCD_460032_BIT3);
		if (mask)
		    set_bit(LCD_460032_PORT4, LCD_460032_RS);
		LCD_460032_DELAY;
		set_bit (LCD_460032_PORT5, LCD_460032_E);
		LCD_460032_DELAY;
		clear_bit (LCD_460032_PORT5, LCD_460032_E);
		pt = (in & 0x0f);
		LCD_460032_DELAY;
		clear_bit(LCD_460032_PORT0, LCD_460032_BIT0);
		clear_bit(LCD_460032_PORT1, LCD_460032_BIT1);
		clear_bit(LCD_460032_PORT2, LCD_460032_BIT2);
		clear_bit(LCD_460032_PORT3, LCD_460032_BIT3);
		clear_bit(LCD_460032_PORT4, LCD_460032_RS);
		clear_bit(LCD_460032_PORT5, LCD_460032_E);
		if (pt & 0x01)
		    set_bit(LCD_460032_PORT0, LCD_460032_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_460032_PORT1, LCD_460032_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_460032_PORT2, LCD_460032_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_460032_PORT3, LCD_460032_BIT3);
		if (mask)
		    set_bit(LCD_460032_PORT4, LCD_460032_RS);
		LCD_460032_DELAY;
		set_bit (LCD_460032_PORT5, LCD_460032_E);
		LCD_460032_DELAY;
		clear_bit (LCD_460032_PORT5, LCD_460032_E);
		LCD_460032_DELAY;
}

void FCD_LCDDisplay0_Start()
{
	
		clear_bit(LCD_460032_TRIS0, LCD_460032_BIT0);
		clear_bit(LCD_460032_TRIS1, LCD_460032_BIT1);
		clear_bit(LCD_460032_TRIS2, LCD_460032_BIT2);
		clear_bit(LCD_460032_TRIS3, LCD_460032_BIT3);
		clear_bit(LCD_460032_TRIS4, LCD_460032_RS);
		clear_bit(LCD_460032_TRIS5, LCD_460032_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_460032_ROWCNT == 1)
	    y=0x80;
	  #endif

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

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

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

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

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

		#if (LCD_460032_ROWCNT == 4)
			#if (LCD_460032_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_460032_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);
}



//RS232(0): //Macro implementations


void FCD_RS2320_SendRS232Char(short nChar)
{
	//This licence of FlowCode does not produce code for this component
	#warning "RS232(0): This licence of FlowCode does not produce code for this component"
}

void FCD_RS2320_SendRS232String(char* String, char MSZ_String)
{
}

short FCD_RS2320_ReceiveRS232Char(short nTimeout)
{
	return (0);
}

void FCD_RS2320_ReceiveRS232String(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char nTimeout, char NumBytes)
{
	return ("");
}

void FCD_RS2320_RS232_Delay(char mode)
{
}

//Macro implementations

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

	
	#if (RS232_525556_UART == 0)
		set_bit(RS232_525556_RX_TRIS, RS232_525556_SW_RX);				// Receive pin is a input
		clear_bit(RS232_525556_TX_TRIS, RS232_525556_SW_TX);			// Transmit pin is a output
		set_bit(RS232_525556_TX_PORT, RS232_525556_SW_TX);				// Transmit pin is default high
	#endif

	#if (RS232_525556_UART == 1)
		txsta = RS232_525556_TXSTA_VAL;   					// 8-bit, async, low speed, off
		spbrg = RS232_525556_SPBRG_VAL;   					// set the baud rate
		rcsta = 0;                    				// 8-bit, disabled

		if(RS232_525556_DATASIZE == 1)
		{
			st_bit(txsta, TX9);   					// 9-bit TX
			st_bit(rcsta, RX9);                    	// 9-bit RX
		}

		st_bit(rcsta, SPEN);         				// turn on serial interface
	#endif

	#if (RS232_525556_UART == 2)

		txsta2 = RS232_525556_TXSTA_VAL;   					// 8-bit, async, low speed, off
		spbrg2 = RS232_525556_SPBRG_VAL;   					// set the baud rate
		rcsta2 = 0;                    				// 8-bit, disabled

		if(RS232_525556_DATASIZE == 1)
		{
			st_bit(txsta2, TX9);   					// 9-bit TX
			st_bit(rcsta2, RX9);                    // 9-bit RX
		}

		st_bit(rcsta2, SPEN);         				// turn on serial interface
	#endif

	#ifdef RS232_525556_HARDWARE
		set_bit( RS232_525556_CTS_TRIS, RS232_525556_CTS_PIN);			//CTS is an input
		clear_bit( RS232_525556_RTS_TRIS, RS232_525556_RTS_PIN);		//RTS is an output
		set_bit( RS232_525556_RTS_PORT, RS232_525556_RTS_PIN); 			//not ready to accept data
	#endif


	//Interrupt initialisation code
	option_reg = 0xC0;


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


	//Loop
	//Loop: While 1
	while (1)
	{
		//Delay
		//Delay: 20 ms
		delay_ms(20);


		//Calculation
		//Calculation:
		//  neki = neki+1
		FCV_NEKI = FCV_NEKI+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)::PrintNumber(neki)
		FCD_LCDDisplay0_PrintNumber(FCV_NEKI);


		//Call Component Macro
		//Call Component Macro: RS232(0)::SendRS232Char(neki)
		FCD_RS2320_SendRS232Char(FCV_NEKI);


		//Call Component Macro
		//Call Component Macro: neki2=RS232(0)::ReceiveRS232Char(1)
		FCV_NEKI2 = FCD_RS2320_ReceiveRS232Char(1);


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


		//Call Component Macro
		//Call Component Macro: LCDDisplay(0)::PrintNumber(neki2)
		FCD_LCDDisplay0_PrintNumber(FCV_NEKI2);


	}


	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}



