//************************************************************************************
//**  
//**  File name:     F:\flowcode\FK\adcproba.c
//**  Generated by:  Flowcode v4.3.7.63
//**  Date:          Wednesday, January 23, 2013 20:24:55
//**  Licence:       Professional
//**  
//**        ***UNREGISTERED***
//**  
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_PIC

//Mikrovezérl? definíciók
#define P16F819
#define MX_EE
#define MX_EE_TYPE2
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_B
#define MX_SPI_SDI 1
#define MX_SPI_SDO 2
#define MX_SPI_SCK 4
#define MX_I2C
#define MX_I2C_B
#define MX_I2C_SDA 1
#define MX_I2C_SCL 4
#define MX_PWM
#define MX_PWM_CNT 1
#define MX_PWM_TRIS1 trisb
#define MX_PWM_1 3

//Függvények
#define MX_CLK_SPEED 20000000
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Konfigurációs adatok
#ifdef _BOOSTC
#pragma DATA 0x2007, 0x3f4a
#endif
#ifdef HI_TECH_C
__CONFIG(0x3f4a);
#endif

//Bels? függvények
#include "F:\flowcode\Flowcode_pic_v4.3.7.63\FCD\internals.h"

//Makró deklarációk


//Változó deklarációk
char FCV_ADC0;
char FCV_X;


//Defines:

/**** Macro Substitutions ****
0 = Which ADC Channel
40 = Acquisition time
3 = Conversion Speed
0 = VRef+ Option
500 = VRef Voltage x 0.01V
******************************/




//ADC(0): //Makró deklarációk

void FCD_ADC0_SampleADC();
char FCD_ADC0_ReadAsByte();
short FCD_ADC0_ReadAsInt();
float FCD_ADC0_ReadAsVoltage();
void FCD_ADC0_ReadAsString(char* FCR_RETVAL, char FCR_RETVAL_SIZE);
//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_3081330 = Unique Component Reference Number
2 = Row Count
16 = Column Count
******************************/

	//component connections
	#define LCD_3081330_PORT0    portb
	#define LCD_3081330_TRIS0    trisb
	#define LCD_3081330_PORT1    portb
	#define LCD_3081330_TRIS1    trisb
	#define LCD_3081330_PORT2    portb
	#define LCD_3081330_TRIS2    trisb
	#define LCD_3081330_PORT3    portb
	#define LCD_3081330_TRIS3    trisb
	#define LCD_3081330_PORT4    portb
	#define LCD_3081330_TRIS4    trisb
	#define LCD_3081330_PORT5    portb
	#define LCD_3081330_TRIS5    trisb
	#define LCD_3081330_BIT0    	0
	#define LCD_3081330_BIT1    	1
	#define LCD_3081330_BIT2    	2
	#define LCD_3081330_BIT3    	3
	#define LCD_3081330_RS      	4
	#define LCD_3081330_E       	5
	#define LCD_3081330_ROWCNT	2
	#define LCD_3081330_COLCNT	16

	#ifdef _BOOSTC
	  #define LCD_3081330_DELAY   delay_10us(10)
	#endif
	#ifdef _C2C_
	  #define LCD_3081330_DELAY   delay_us(100)
	#endif
	#ifdef HI_TECH_C
	  #define LCD_3081330_DELAY   __delay_us(120)
	#endif
	#ifndef LCD_3081330_DELAY
	  #define LCD_3081330_DELAY   delay_us(100)
	#endif




//LCDDisplay(0): //Makró deklarációk

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);



//ADC(0): //Makró implementációk


void FCD_ADC0_SampleADC()
{
	
	/*******Supported Devices******************************************************************
	// 16C72, 16C72A, 16CR72, 16F72, 16C73, 16C73A, 16C73B, 16F73, 16C74, 16C74A, 16C74B, 16F74,
	// 16C76, 16F76, 16C77, 16F77, 16F818, 16F819, 16F870, 16F871, 16F872, 16F873, 16F873A,
	// 16F874, 16F874A, 16F876, 16F876A, 16F877, 16F877A,
	******************************************************************************************/

		#define MX_ADC_CHANNEL		0
		#define MX_ADC_SAMP_TIME 	40
		#define MX_ADC_CONV_SP		3
		#define MX_ADC_VREF_OPT		0

		//set up ADC conversion
		char old_tris, cnt;

		//find appropriate bit
		#if (MX_ADC_CHANNEL == 0)
			#define MX_ADC_TRIS_MSK  0x01
			#define MX_ADC_TRIS_REG  trisa
			#if (MX_ADC_VREF_OPT == 0)
				adcon1 = 0x0E;
			#else
				adcon1 = 0x05;
			#endif
		#endif
		#if (MX_ADC_CHANNEL == 1)
			#define MX_ADC_TRIS_MSK  0x02
			#define MX_ADC_TRIS_REG  trisa
			#if (MX_ADC_VREF_OPT == 0)
				adcon1 = 0x04;
			#else
				adcon1 = 0x05;
			#endif
		#endif
		#if (MX_ADC_CHANNEL == 2)
			#define MX_ADC_TRIS_MSK  0x04
			#define MX_ADC_TRIS_REG  trisa
			#if (MX_ADC_VREF_OPT == 0)
				adcon1 = 0x02;
			#else
				adcon1 = 0x03;
			#endif
		#endif
		#if (MX_ADC_CHANNEL == 3)
			#define MX_ADC_TRIS_MSK  0x08
			#define MX_ADC_TRIS_REG  trisa
			#if (MX_ADC_VREF_OPT == 0)
				adcon1 = 0x04;
			#else
				#ifdef _BOOSTC
					#pragma error "Target device is currently using AN3 for VREF+"
				#endif
				#ifdef HI_TECH_C
					#error Target device is currently using AN3 for VREF+
				#endif
			#endif
		#endif
		#if (MX_ADC_CHANNEL == 4)
			#define MX_ADC_TRIS_MSK  0x20
			#define MX_ADC_TRIS_REG  trisa
			#if (MX_ADC_VREF_OPT == 0)
				adcon1 = 0x02;
			#else
				adcon1 = 0x03;
			#endif
		#endif
		#if (MX_ADC_CHANNEL == 5)
			#define MX_ADC_TRIS_MSK  0x01
			#define MX_ADC_TRIS_REG  trise
			#if (MX_ADC_VREF_OPT == 0)
				adcon1 = 0x09;
			#else
				adcon1 = 0x01;
			#endif
		#endif
		#if (MX_ADC_CHANNEL == 6)
			#define MX_ADC_TRIS_MSK  0x02
			#define MX_ADC_TRIS_REG  trise
			#if (MX_ADC_VREF_OPT == 0)
				adcon1 = 0x00;
			#else
				adcon1 = 0x01;
			#endif
		#endif
		#if (MX_ADC_CHANNEL == 7)
			#define MX_ADC_TRIS_MSK  0x04
			#define MX_ADC_TRIS_REG  trise
			#if (MX_ADC_VREF_OPT == 0)
				adcon1 = 0x00;
			#else
				adcon1 = 0x01;
			#endif
		#endif

		//sanity check
		#ifndef MX_ADC_TRIS_REG
			#ifdef _BOOSTC
				#pragma error "ADC Type 1 conversion code error - please contact technical support"
			#endif
			#ifdef HI_TECH_C
				#error ADC Type 1 conversion code error - please contact technical support
			#endif
		#endif

		//assign conversion speed
		#if (MX_ADC_CONV_SP > 3)
			st_bit(adcon1, ADCS2);
		#endif

		//store old tris value, and set the i/o pin as an input
		old_tris = MX_ADC_TRIS_REG;
		MX_ADC_TRIS_REG = MX_ADC_TRIS_REG | MX_ADC_TRIS_MSK;

		//turn ADC on
		adcon0 = (0x01 | (MX_ADC_CONV_SP << 6)) | (MX_ADC_CHANNEL << 3);

		//wait the acquisition time
		cnt = 0;
		while (cnt < MX_ADC_SAMP_TIME) cnt++;

		//begin conversion and wait until it has finished
		adcon0 = adcon0 | 0x04;
		while (adcon0 & 0x04);

		//restore old tris value, and reset adc registers
		MX_ADC_TRIS_REG = old_tris;
		adcon1 = 0x07;
		adcon0 = 0x00;

		#undef MX_ADC_CHANNEL
		#undef MX_ADC_TRIS_REG
		#undef MX_ADC_TRIS_MSK
		#undef MX_ADC_SAMP_TIME
		#undef MX_ADC_CONV_SP
		#undef MX_ADC_VREF_OPT

}

char FCD_ADC0_ReadAsByte()
{
	
		FCD_ADC0_SampleADC();

		return adresh;

}

short FCD_ADC0_ReadAsInt()
{
	
		short iRetVal;

		FCD_ADC0_SampleADC();

		iRetVal = (adresh << 2);
		iRetVal = iRetVal | (adresl >> 6);

		return (iRetVal);

}

float FCD_ADC0_ReadAsVoltage()
{
	

		int iSample;
		float fSample, fVoltage, fVperDiv;

		#define MX_ADC_VREF_V		500

		iSample = FCD_ADC0_ReadAsInt();											//Read as 10-bit Integer

		#ifdef _BOOSTC
			fVoltage = float32_from_int32(MX_ADC_VREF_V);					//Convert reference voltage count to floating point (0 - 500 x 10mV)
			fVoltage = float32_mul(fVoltage, 0.01);							//Convert reference voltage count to actual voltage (0 - 5)
			fVperDiv = float32_mul(fVoltage, 0.000976);						//Convert actual voltage to voltage per division (VRef / 1024)
			fSample = float32_from_int32(iSample);							//Convert to floating point variable
			fVoltage = float32_mul(fSample, fVperDiv);						//Calculate floating point voltage
		#endif

		#ifdef HI_TECH_C
			fVoltage = MX_ADC_VREF_V;										//Convert reference voltage count to floating point (0 - 500 x 10mV)
			fVoltage = fVoltage * 0.01;										//Convert reference voltage count to actual voltage (0 - 5)
			fVperDiv = fVoltage * 0.000976;									//Convert actual voltage to voltage per division (VRef / 1024)
			fSample = iSample;												//Convert to floating point variable
			fVoltage = fSample * fVperDiv;									//Calculate floating point voltage
		#endif

		#undef MX_ADC_VREF_V
		return (fVoltage);

}

void FCD_ADC0_ReadAsString(char* FCR_RETVAL, char FCR_RETVAL_SIZE)
{
	
		float fVoltage;

		fVoltage = FCD_ADC0_ReadAsVoltage();
		FCI_FLOAT_TO_STRING(fVoltage, 2, FCR_RETVAL, FCR_RETVAL_SIZE);	//Convert to String

}



//LCDDisplay(0): //Makró implementációk


void FCD_LCDDisplay0_RawSend(char in, char mask)
{
		unsigned char pt;

		clear_bit(LCD_3081330_PORT0, LCD_3081330_BIT0);
		clear_bit(LCD_3081330_PORT1, LCD_3081330_BIT1);
		clear_bit(LCD_3081330_PORT2, LCD_3081330_BIT2);
		clear_bit(LCD_3081330_PORT3, LCD_3081330_BIT3);
		clear_bit(LCD_3081330_PORT4, LCD_3081330_RS);
		clear_bit(LCD_3081330_PORT5, LCD_3081330_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_3081330_PORT0, LCD_3081330_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_3081330_PORT1, LCD_3081330_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_3081330_PORT2, LCD_3081330_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_3081330_PORT3, LCD_3081330_BIT3);
		if (mask)
		    set_bit(LCD_3081330_PORT4, LCD_3081330_RS);
		LCD_3081330_DELAY;
		set_bit (LCD_3081330_PORT5, LCD_3081330_E);
		LCD_3081330_DELAY;
		clear_bit (LCD_3081330_PORT5, LCD_3081330_E);
		pt = (in & 0x0f);
		LCD_3081330_DELAY;
		clear_bit(LCD_3081330_PORT0, LCD_3081330_BIT0);
		clear_bit(LCD_3081330_PORT1, LCD_3081330_BIT1);
		clear_bit(LCD_3081330_PORT2, LCD_3081330_BIT2);
		clear_bit(LCD_3081330_PORT3, LCD_3081330_BIT3);
		clear_bit(LCD_3081330_PORT4, LCD_3081330_RS);
		clear_bit(LCD_3081330_PORT5, LCD_3081330_E);
		if (pt & 0x01)
		    set_bit(LCD_3081330_PORT0, LCD_3081330_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_3081330_PORT1, LCD_3081330_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_3081330_PORT2, LCD_3081330_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_3081330_PORT3, LCD_3081330_BIT3);
		if (mask)
		    set_bit(LCD_3081330_PORT4, LCD_3081330_RS);
		LCD_3081330_DELAY;
		set_bit (LCD_3081330_PORT5, LCD_3081330_E);
		LCD_3081330_DELAY;
		clear_bit (LCD_3081330_PORT5, LCD_3081330_E);
		LCD_3081330_DELAY;
}

void FCD_LCDDisplay0_Start()
{
	
		clear_bit(LCD_3081330_TRIS0, LCD_3081330_BIT0);
		clear_bit(LCD_3081330_TRIS1, LCD_3081330_BIT1);
		clear_bit(LCD_3081330_TRIS2, LCD_3081330_BIT2);
		clear_bit(LCD_3081330_TRIS3, LCD_3081330_BIT3);
		clear_bit(LCD_3081330_TRIS4, LCD_3081330_RS);
		clear_bit(LCD_3081330_TRIS5, LCD_3081330_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_3081330_ROWCNT == 1)
	    y=0x80;
	  #endif

	  #if (LCD_3081330_ROWCNT == 2)
		if (y==0)
			y=0x80;
		else
			y=0xc0;
	  #endif

	  #if (LCD_3081330_ROWCNT == 4)
		if (y==0)
			y=0x80;
		else if (y==1)
			y=0xc0;

		#if (LCD_3081330_COLCNT == 16)
			else if (y==2)
				y=0x90;
			else
				y=0xd0;
		#endif

		#if (LCD_3081330_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_3081330_ROWCNT == 1)
			rowcount=80;
		#endif

		#if (LCD_3081330_ROWCNT == 2)
			rowcount=40;
		#endif

		#if (LCD_3081330_ROWCNT == 4)
			#if (LCD_3081330_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_3081330_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);
}

//Makró implementációk

void main()
{
	
	//Inicializálások
	adcon1 = 0x07;


	//Megszakítás inicializáló kód
	option_reg = 0xC0;


	//Késleltetés
	//Késleltetés: 1 ms
	delay_ms(1);


	//Komponens makró hívása
	//Komponens makró hívása: LCDDisplay(0)::Start
	FCD_LCDDisplay0_Start();


	//Ciklus
	//Ciklus: Amíg1
	while (1)
	{
		//Komponens makró hívása
		//Komponens makró hívása: LCDDisplay(0)::Clear
		FCD_LCDDisplay0_Clear();


		//Komponens makró hívása
		//Komponens makró hívása: adc0=ADC(0)::ReadAsByte
		FCV_ADC0 = FCD_ADC0_ReadAsByte();


		//Számítás
		//Számítás:
		//  x = adc0/2.55
		FCV_X = FCV_ADC0/2.55;
		

		//Komponens makró hívása
		//Komponens makró hívása: LCDDisplay(0)::Cursor(6, 0)
		FCD_LCDDisplay0_Cursor(6, 0);


		//Komponens makró hívása
		//Komponens makró hívása: LCDDisplay(0)::PrintNumber(x)
		FCD_LCDDisplay0_PrintNumber(FCV_X);


	}


	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}



