#define MX_PIC

//Definiciones para el microcontrolador
#define P16F886
#define MX_EE
#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

//Funciones
#define MX_CLK_SPEED 12000000
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Datos de configuración
#ifdef _BOOSTC
#pragma DATA 0x2007, 0xf2
#endif
#ifdef HI_TECH_C
__CONFIG(0xf2);
#endif
#ifdef _BOOSTC
#pragma DATA 0x2008, 0x3fff
#endif
#ifdef HI_TECH_C
__CONFIG(0x3fff);
#endif

//Funciones internas
#include "C:\Archivos de programa\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Macro function declarations
void FCM_INTERRUPT_TMR0();
void FCM_INTERRUPT_RB0INT();
void FCM_INTERRUPT_PORTB();
void FCM_HELLO();


//Variable declarations


//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
3 = Data 1_Pin
2 = Data 2 Pin
1 = Data 3 Pin
0 = Data 4 Pin
5 = RS Pin
4 = Enable Pin
LCD_1050154 = Unique Component Reference Number
1 = Row Count
16 = Column Count
******************************/

	//component connections
	#define LCD_1050154_PORT0    portb
	#define LCD_1050154_TRIS0    trisb
	#define LCD_1050154_PORT1    portb
	#define LCD_1050154_TRIS1    trisb
	#define LCD_1050154_PORT2    portb
	#define LCD_1050154_TRIS2    trisb
	#define LCD_1050154_PORT3    portb
	#define LCD_1050154_TRIS3    trisb
	#define LCD_1050154_PORT4    portb
	#define LCD_1050154_TRIS4    trisb
	#define LCD_1050154_PORT5    portb
	#define LCD_1050154_TRIS5    trisb
	#define LCD_1050154_BIT0    	3
	#define LCD_1050154_BIT1    	2
	#define LCD_1050154_BIT2    	1
	#define LCD_1050154_BIT3    	0
	#define LCD_1050154_RS      	5
	#define LCD_1050154_E       	4
	#define LCD_1050154_ROWCNT	1
	#define LCD_1050154_COLCNT	16

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




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

void FCD_LCDDisplay1_RawSend(char in, char mask);
void FCD_LCDDisplay1_Start();
void FCD_LCDDisplay1_Clear();
void FCD_LCDDisplay1_PrintASCII(char Character);
void FCD_LCDDisplay1_Command(char in);
void FCD_LCDDisplay1_Cursor(char x, char y);
void FCD_LCDDisplay1_PrintNumber(short Number);
void FCD_LCDDisplay1_PrintString(char* String, char MSZ_String);
void FCD_LCDDisplay1_ScrollDisplay(char Direction, char Num_Positions);
void FCD_LCDDisplay1_ClearLine(char Line);
void FCD_LCDDisplay1_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7);



//LCDDisplay(1): //Macro implementations


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

		clear_bit(LCD_1050154_PORT0, LCD_1050154_BIT0);
		clear_bit(LCD_1050154_PORT1, LCD_1050154_BIT1);
		clear_bit(LCD_1050154_PORT2, LCD_1050154_BIT2);
		clear_bit(LCD_1050154_PORT3, LCD_1050154_BIT3);
		clear_bit(LCD_1050154_PORT4, LCD_1050154_RS);
		clear_bit(LCD_1050154_PORT5, LCD_1050154_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_1050154_PORT0, LCD_1050154_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_1050154_PORT1, LCD_1050154_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_1050154_PORT2, LCD_1050154_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_1050154_PORT3, LCD_1050154_BIT3);
		if (mask)
		    set_bit(LCD_1050154_PORT4, LCD_1050154_RS);
		LCD_1050154_DELAY;
		set_bit (LCD_1050154_PORT5, LCD_1050154_E);
		LCD_1050154_DELAY;
		clear_bit (LCD_1050154_PORT5, LCD_1050154_E);
		pt = (in & 0x0f);
		LCD_1050154_DELAY;
		clear_bit(LCD_1050154_PORT0, LCD_1050154_BIT0);
		clear_bit(LCD_1050154_PORT1, LCD_1050154_BIT1);
		clear_bit(LCD_1050154_PORT2, LCD_1050154_BIT2);
		clear_bit(LCD_1050154_PORT3, LCD_1050154_BIT3);
		clear_bit(LCD_1050154_PORT4, LCD_1050154_RS);
		clear_bit(LCD_1050154_PORT5, LCD_1050154_E);
		if (pt & 0x01)
		    set_bit(LCD_1050154_PORT0, LCD_1050154_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_1050154_PORT1, LCD_1050154_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_1050154_PORT2, LCD_1050154_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_1050154_PORT3, LCD_1050154_BIT3);
		if (mask)
		    set_bit(LCD_1050154_PORT4, LCD_1050154_RS);
		LCD_1050154_DELAY;
		set_bit (LCD_1050154_PORT5, LCD_1050154_E);
		LCD_1050154_DELAY;
		clear_bit (LCD_1050154_PORT5, LCD_1050154_E);
		LCD_1050154_DELAY;
}

void FCD_LCDDisplay1_Start()
{
	
		clear_bit(LCD_1050154_TRIS0, LCD_1050154_BIT0);
		clear_bit(LCD_1050154_TRIS1, LCD_1050154_BIT1);
		clear_bit(LCD_1050154_TRIS2, LCD_1050154_BIT2);
		clear_bit(LCD_1050154_TRIS3, LCD_1050154_BIT3);
		clear_bit(LCD_1050154_TRIS4, LCD_1050154_RS);
		clear_bit(LCD_1050154_TRIS5, LCD_1050154_E);

		Wdt_Delay_Ms(12);

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

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

}

void FCD_LCDDisplay1_Clear()
{
	
		FCD_LCDDisplay1_RawSend(0x01, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay1_RawSend(0x02, 0);
		Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay1_PrintASCII(char Character)
{
	
		FCD_LCDDisplay1_RawSend(Character, 0x10);

}

void FCD_LCDDisplay1_Command(char in)
{
	
		FCD_LCDDisplay1_RawSend(in, 0);
		Wdt_Delay_Ms(2);

}

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

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

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

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

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

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

}

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

		tmp_int = Number;
		if (Number >= 10000)
		{
			tmp_byte = tmp_int / 10000;
			FCD_LCDDisplay1_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_LCDDisplay1_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_LCDDisplay1_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_LCDDisplay1_RawSend('0' + tmp_byte, 0x10);

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

}

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

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

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

}

void FCD_LCDDisplay1_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_LCDDisplay1_Command(cmd);
		}

}

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

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

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

		#if (LCD_1050154_ROWCNT == 4)
			#if (LCD_1050154_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_1050154_COLCNT == 20)
				rowcount=20;
			#endif
		#endif

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

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

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

}

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

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

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

//Macro implementations

void FCM_INTERRUPT_TMR0()
{
	
}

void FCM_INTERRUPT_RB0INT()
{
	
}

void FCM_INTERRUPT_PORTB()
{
	
}

void FCM_HELLO()
{
	//Display HELLO WORLD
	
	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('H')
	FCD_LCDDisplay1_PrintASCII('H');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('E')
	FCD_LCDDisplay1_PrintASCII('E');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('L')
	FCD_LCDDisplay1_PrintASCII('L');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('L')
	FCD_LCDDisplay1_PrintASCII('L');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('O')
	FCD_LCDDisplay1_PrintASCII('O');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII(' ')
	FCD_LCDDisplay1_PrintASCII(' ');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('W')
	FCD_LCDDisplay1_PrintASCII('W');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('O')
	FCD_LCDDisplay1_PrintASCII('O');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('R')
	FCD_LCDDisplay1_PrintASCII('R');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('L')
	FCD_LCDDisplay1_PrintASCII('L');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('D')
	FCD_LCDDisplay1_PrintASCII('D');


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintASCII('.')
	FCD_LCDDisplay1_PrintASCII('.');


}

void main()
{
	//Using the LCD display
	
	//Inicialización
	ansel = 0;
anselh = 0;


	//Inicialización del Código de Interrupción
	option_reg = 0xC0;


	//Call Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::Start
	FCD_LCDDisplay1_Start();


	//Call Component Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintString("Hello World")
	FCD_LCDDisplay1_PrintString("Hello World",11);


	//Call Component Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintString("Hello World")
	FCD_LCDDisplay1_PrintString("Hello World",11);


	//Llamar a Macro de Componente
	//Llamar a Macro de Componente: LCDDisplay(1)::Cursor(8, 0)
	FCD_LCDDisplay1_Cursor(8, 0);


	//Call Component Macro
	//Llamar a Macro de Componente: LCDDisplay(1)::PrintString("Hello World")
	FCD_LCDDisplay1_PrintString("Hello World",11);


	//Demora
	//Demora: 5 s
	Wdt_Delay_S(5);


	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}