//************************************************************************************
//**  
//**  File name:     D:\display.c
//**  Generated by:  Flowcode v4.3.9.65
//**  Date:          Sunday, January 22, 2012 01:09:59
//**  Licence:       Free version
//**  
//**        ***For users exUSSR ***
//**  
//**  
//**     Не для коммерческого использования
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_AVR

//Определения для микроконтроллера
#define MX_AVR
#define MX_TINY
#define MX_EE
#define MX_EE_SIZE 128
#define MX_USI
#define MX_SPI
#define MX_SPI_B
#define MX_SPI_SDI 5
#define MX_SPI_SDO 6
#define MX_SPI_SCK 7
#define MX_UART
#define MX_UART_UCSRC
#define MX_UART_D
#define MX_UART_TX 1
#define MX_UART_RX 0
#define MX_MI2C
#define MX_I2C_B
#define MX_I2C_SDA 5
#define MX_I2C_SCL 7
#define MX_PWM
#define MX_PWM_PORT PORTB
#define MX_PWM_CNT 2
#define MX_PWM_TRIS1 DDRB
#define MX_PWM_1 3
#define MX_PWM_TRIS2 DDRB
#define MX_PWM_2 4
#define MX_PWMTYPE 1

//Функции
#define F_CPU 4000000UL
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\eeprom.h>
#include <avr\wdt.h>
#include <MX_util\delay.h>
#include <MX_util\bit_cmds.h>

//Конфигурация
#pragma DATA 0x0, 0xdf
#pragma DATA 0x1, 0xff
#pragma DATA 0x2, 0xff

//Внутренние функции
#include "C:\Program Files\Matrix Multimedia\Flowcode AVR V4\FCD\internals.h"

//Объявление макроса


//Объявление переменных


//Defines:

/**** Macro Substitutions ****
PORTB = D1 Port
DDRB = D1 Data Direction
PORTB = D2 Port
DDRB = D2 Data Direction
PORTB = D3 Port
DDRB = D3 Data Direction
PORTB = D4 Port
DDRB = D4 Data Direction
PORTB = RS Port
DDRB = RS Data Direction
PORTB = E Port
DDRB = 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_1638574 = Unique Component Reference Number
2 = Row Count
16 = Column Count
******************************/

	//component connections
	#define LCD_1638574_PORT0    PORTB
	#define LCD_1638574_DDR0    DDRB
	#define LCD_1638574_PORT1    PORTB
	#define LCD_1638574_DDR1    DDRB
	#define LCD_1638574_PORT2    PORTB
	#define LCD_1638574_DDR2    DDRB
	#define LCD_1638574_PORT3    PORTB
	#define LCD_1638574_DDR3    DDRB
	#define LCD_1638574_PORT4    PORTB
	#define LCD_1638574_DDR4    DDRB
	#define LCD_1638574_PORT5    PORTB
	#define LCD_1638574_DDR5    DDRB
	#define LCD_1638574_BIT0    	0
	#define LCD_1638574_BIT1    	1
	#define LCD_1638574_BIT2    	2
	#define LCD_1638574_BIT3    	3
	#define LCD_1638574_RS      	4
	#define LCD_1638574_E       	5
	#define LCD_1638574_ROWCNT	2
	#define LCD_1638574_COLCNT	16

    #define LCD_1638574_DELAY   delay_us(100)




//LCDDisplay(0): //Объявление макроса

static void FCD_LCDDisplay0_RawSend(char in, char mask);
static void FCD_LCDDisplay0_Start();
static void FCD_LCDDisplay0_Clear();
static void FCD_LCDDisplay0_PrintASCII(char Character);
static void FCD_LCDDisplay0_Command(char in);
static void FCD_LCDDisplay0_Cursor(char x, char y);
static void FCD_LCDDisplay0_PrintNumber(short Number);
static void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String);
static void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions);
static void FCD_LCDDisplay0_ClearLine(char Line);
static void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7);



//LCDDisplay(0): //Реализация макроса


static void FCD_LCDDisplay0_RawSend(char in, char mask)
{
		unsigned char pt;

		clear_bit(LCD_1638574_PORT0, LCD_1638574_BIT0);
		clear_bit(LCD_1638574_PORT1, LCD_1638574_BIT1);
		clear_bit(LCD_1638574_PORT2, LCD_1638574_BIT2);
		clear_bit(LCD_1638574_PORT3, LCD_1638574_BIT3);
		clear_bit(LCD_1638574_PORT4, LCD_1638574_RS);
		clear_bit(LCD_1638574_PORT5, LCD_1638574_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_1638574_PORT0, LCD_1638574_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_1638574_PORT1, LCD_1638574_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_1638574_PORT2, LCD_1638574_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_1638574_PORT3, LCD_1638574_BIT3);
		if (mask)
		    set_bit(LCD_1638574_PORT4, LCD_1638574_RS);
		LCD_1638574_DELAY;
		set_bit (LCD_1638574_PORT5, LCD_1638574_E);
		LCD_1638574_DELAY;
		clear_bit (LCD_1638574_PORT5, LCD_1638574_E);
		pt = (in & 0x0f);
		LCD_1638574_DELAY;
		clear_bit(LCD_1638574_PORT0, LCD_1638574_BIT0);
		clear_bit(LCD_1638574_PORT1, LCD_1638574_BIT1);
		clear_bit(LCD_1638574_PORT2, LCD_1638574_BIT2);
		clear_bit(LCD_1638574_PORT3, LCD_1638574_BIT3);
		clear_bit(LCD_1638574_PORT4, LCD_1638574_RS);
		clear_bit(LCD_1638574_PORT5, LCD_1638574_E);
		if (pt & 0x01)
		    set_bit(LCD_1638574_PORT0, LCD_1638574_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_1638574_PORT1, LCD_1638574_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_1638574_PORT2, LCD_1638574_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_1638574_PORT3, LCD_1638574_BIT3);
		if (mask)
		    set_bit(LCD_1638574_PORT4, LCD_1638574_RS);
		LCD_1638574_DELAY;
		set_bit (LCD_1638574_PORT5, LCD_1638574_E);
		LCD_1638574_DELAY;
		clear_bit (LCD_1638574_PORT5, LCD_1638574_E);
		LCD_1638574_DELAY;
}

static void FCD_LCDDisplay0_Start()
{
	
		set_bit(LCD_1638574_DDR0, LCD_1638574_BIT0);
		set_bit(LCD_1638574_DDR1, LCD_1638574_BIT1);
		set_bit(LCD_1638574_DDR2, LCD_1638574_BIT2);
		set_bit(LCD_1638574_DDR3, LCD_1638574_BIT3);
		set_bit(LCD_1638574_DDR4, LCD_1638574_RS);
		set_bit(LCD_1638574_DDR5, LCD_1638574_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);

}

static void FCD_LCDDisplay0_Clear()
{
	
		FCD_LCDDisplay0_RawSend(0x01, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x02, 0);
		Wdt_Delay_Ms(2);

}

static void FCD_LCDDisplay0_PrintASCII(char Character)
{
	
		FCD_LCDDisplay0_RawSend(Character, 0x10);

}

static void FCD_LCDDisplay0_Command(char in)
{
	
		FCD_LCDDisplay0_RawSend(in, 0);
		Wdt_Delay_Ms(2);

}

static void FCD_LCDDisplay0_Cursor(char x, char y)
{
	
	  #if (LCD_1638574_ROWCNT == 1)
	    y=0x80;
	  #endif

	  #if (LCD_1638574_ROWCNT == 2)
		if (y==0)
			y=0x80;
		else
			y=0xc0;
	  #endif

	  #if (LCD_1638574_ROWCNT == 4)
		if (y==0)
			y=0x80;
		else if (y==1)
			y=0xc0;

		#if (LCD_1638574_COLCNT == 16)
			else if (y==2)
				y=0x90;
			else
				y=0xd0;
		#endif

		#if (LCD_1638574_COLCNT == 20)
			else if (y==2)
				y=0x94;
			else
				y=0xd4;
		#endif
	  #endif

		FCD_LCDDisplay0_RawSend(y+x, 0);
		Wdt_Delay_Ms(2);

}

static 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);

}

static void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String)
{
	
		char idx;
		for (idx=0; idx<MSZ_String; idx++)
		{
			if (String[idx]==0)
			{
				break;
			}
			FCD_LCDDisplay0_RawSend(String[idx], 0x10);
		}

}

static 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);
		}

}

static void FCD_LCDDisplay0_ClearLine(char Line)
{
	
		char count;
		char rowcount;

		//Define number of columns per line
		#if (LCD_1638574_ROWCNT == 1)
			rowcount=80;
		#endif

		#if (LCD_1638574_ROWCNT == 2)
			rowcount=40;
		#endif

		#if (LCD_1638574_ROWCNT == 4)
			#if (LCD_1638574_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_1638574_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);

}

static 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);
}

//Реализация макроса

int main()
{
	
	//Инициализация
	MCUCR=0x0a;
	MCUSR=0x00;
	wdt_disable();


	//Инициализация кода прерывания
	GIMSK=0x00;


	//Макрос компонента
	//Макрос компонента: LCDDisplay(0)::Старт
	FCD_LCDDisplay0_Start();


	//Макрос компонента
	//Макрос компонента: LCDDisplay(0)::Вывод строки("±pe!")
	FCD_LCDDisplay0_PrintString("±pe!",7);


	mainendloop: goto mainendloop;
}



