//************************************************************************************
//**  
//**  File name:     D:\Users\igorka\Desktop\Do_12poly- final\Do_12poly- final\Do_12poly- final.c
//**  Generated by:  Flowcode v4.3.9.65
//**  Date:          Friday, March 01, 2013 18:23:49
//**  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 "D:\Program Files\Matrix Multimedia\Flowcode AVR V4\FCD\internals.h"

//Объявление макроса
void FCM_UPDATE_VALUES();
void FCM_1sec();


//Объявление переменных
volatile char FCV_SWITCH;
volatile char FCV_CURRENT_VALUE;
volatile char FCV_DO1SEC;
volatile char FCV_COUNT;
volatile char FCV_SEG0;
volatile char FCV_SEG1;
volatile char FCV_FLAG_;


//Defines:

/**** Macro Substitutions ****
B = Segment Port
D = Common Port
192 = Pattern 0
249 = Pattern 1
164 = Pattern 2
176 = Pattern 3
153 = Pattern 4
146 = Pattern 5
130 = Pattern 6
248 = Pattern 7
128 = Pattern 8
152 = Pattern 9
127 = Pattern DP
32 = Common Mask
223 = Common Mask Inverted
0 = Segment Mask Inverted
0 = Common Anode Display Type
******************************/




//led7seg(0): //Объявление макроса

static void FCD_led7seg0_ShowDigit(char Value, char DecimalPoint);
static void FCD_led7seg0_ClearDigit();
//Defines:

/**** Macro Substitutions ****
B = Segment Port
D = Common Port
192 = Pattern 0
249 = Pattern 1
164 = Pattern 2
176 = Pattern 3
153 = Pattern 4
146 = Pattern 5
130 = Pattern 6
248 = Pattern 7
128 = Pattern 8
152 = Pattern 9
127 = Pattern DP
16 = Common Mask
239 = Common Mask Inverted
0 = Segment Mask Inverted
0 = Common Anode Display Type
******************************/




//led7seg(1): //Объявление макроса

static void FCD_led7seg1_ShowDigit(char Value, char DecimalPoint);
static void FCD_led7seg1_ClearDigit();



//led7seg(0): //Реализация макроса


static void FCD_led7seg0_ShowDigit(char Value, char DecimalPoint)
{
	
	    //Segment Port Definitions
	    #define MX_7SEG1_SEGMENT_PORT  PORTB
	    #define MX_7SEG1_SEGMENT_DDR  DDRB


	    //Common Port Definitions
	    #define MX_7SEG1_COMMON_PORT   PORTD
	    #define MX_7SEG1_COMMON_DDR   DDRD


	    //set pattern array for the display
		const char cSegmentArray[] = {192, 249, 164, 176, 153, 146, 130, 248, 128, 152};

		//get pattern for digit
		char cSegmentValue = cSegmentArray[Value % 10];
		if (DecimalPoint)
			cSegmentValue = cSegmentValue & 127;

		//set up ports
		MX_7SEG1_COMMON_DDR = MX_7SEG1_COMMON_DDR | ~223;
		MX_7SEG1_SEGMENT_DDR = MX_7SEG1_SEGMENT_DDR | ~0;

		//display the digit
	    #if (0 == 1)

			//common anode
			MX_7SEG1_SEGMENT_PORT = (MX_7SEG1_SEGMENT_PORT & 0) | cSegmentValue;
			MX_7SEG1_COMMON_PORT = (MX_7SEG1_COMMON_PORT | 32);

		#else

			//common cathode
			MX_7SEG1_SEGMENT_PORT = (MX_7SEG1_SEGMENT_PORT & 0) | ~cSegmentValue;
			MX_7SEG1_COMMON_PORT = (MX_7SEG1_COMMON_PORT & 223);

		#endif

		//undefine symbols
	    #undef MX_7SEG1_SEGMENT_PORT
	    #undef MX_7SEG1_SEGMENT_DDR
	    #undef MX_7SEG1_COMMON_PORT
	    #undef MX_7SEG1_COMMON_DDR

}

static void FCD_led7seg0_ClearDigit()
{
	
	    //Segment Port Definitions
	    #define MX_7SEG1_SEGMENT_PORT  PORTB
	    #define MX_7SEG1_SEGMENT_DDR  DDRB


	    //Common Port Definitions
	    #define MX_7SEG1_COMMON_PORT   PORTD
	    #define MX_7SEG1_COMMON_DDR   DDRD


	    //clear the digit
		#if (0 == 1)

			//common anode
			MX_7SEG1_SEGMENT_PORT = 0xFF;
			MX_7SEG1_COMMON_PORT = (MX_7SEG1_COMMON_PORT & 223);

		#else

			//common cathode
			MX_7SEG1_SEGMENT_PORT = 0x00;
			MX_7SEG1_COMMON_PORT = (MX_7SEG1_COMMON_PORT | 32);

		#endif

		//undefine symbols
	    #undef MX_7SEG1_SEGMENT_PORT
	    #undef MX_7SEG1_SEGMENT_DDR
	    #undef MX_7SEG1_COMMON_PORT
	    #undef MX_7SEG1_COMMON_DDR

}



//led7seg(1): //Реализация макроса


static void FCD_led7seg1_ShowDigit(char Value, char DecimalPoint)
{
	
	    //Segment Port Definitions
	    #define MX_7SEG1_SEGMENT_PORT  PORTB
	    #define MX_7SEG1_SEGMENT_DDR  DDRB


	    //Common Port Definitions
	    #define MX_7SEG1_COMMON_PORT   PORTD
	    #define MX_7SEG1_COMMON_DDR   DDRD


	    //set pattern array for the display
		const char cSegmentArray[] = {192, 249, 164, 176, 153, 146, 130, 248, 128, 152};

		//get pattern for digit
		char cSegmentValue = cSegmentArray[Value % 10];
		if (DecimalPoint)
			cSegmentValue = cSegmentValue & 127;

		//set up ports
		MX_7SEG1_COMMON_DDR = MX_7SEG1_COMMON_DDR | ~239;
		MX_7SEG1_SEGMENT_DDR = MX_7SEG1_SEGMENT_DDR | ~0;

		//display the digit
	    #if (0 == 1)

			//common anode
			MX_7SEG1_SEGMENT_PORT = (MX_7SEG1_SEGMENT_PORT & 0) | cSegmentValue;
			MX_7SEG1_COMMON_PORT = (MX_7SEG1_COMMON_PORT | 16);

		#else

			//common cathode
			MX_7SEG1_SEGMENT_PORT = (MX_7SEG1_SEGMENT_PORT & 0) | ~cSegmentValue;
			MX_7SEG1_COMMON_PORT = (MX_7SEG1_COMMON_PORT & 239);

		#endif

		//undefine symbols
	    #undef MX_7SEG1_SEGMENT_PORT
	    #undef MX_7SEG1_SEGMENT_DDR
	    #undef MX_7SEG1_COMMON_PORT
	    #undef MX_7SEG1_COMMON_DDR

}

static void FCD_led7seg1_ClearDigit()
{
	
	    //Segment Port Definitions
	    #define MX_7SEG1_SEGMENT_PORT  PORTB
	    #define MX_7SEG1_SEGMENT_DDR  DDRB


	    //Common Port Definitions
	    #define MX_7SEG1_COMMON_PORT   PORTD
	    #define MX_7SEG1_COMMON_DDR   DDRD


	    //clear the digit
		#if (0 == 1)

			//common anode
			MX_7SEG1_SEGMENT_PORT = 0xFF;
			MX_7SEG1_COMMON_PORT = (MX_7SEG1_COMMON_PORT & 239);

		#else

			//common cathode
			MX_7SEG1_SEGMENT_PORT = 0x00;
			MX_7SEG1_COMMON_PORT = (MX_7SEG1_COMMON_PORT | 16);

		#endif

		//undefine symbols
	    #undef MX_7SEG1_SEGMENT_PORT
	    #undef MX_7SEG1_SEGMENT_DDR
	    #undef MX_7SEG1_COMMON_PORT
	    #undef MX_7SEG1_COMMON_DDR

}

//Реализация макроса

void FCM_UPDATE_VALUES()
{
	//Update the seven seg. values
	
	//Вычисление
	//Вычисление:
	//  current_value = current_value + 1
	FCV_CURRENT_VALUE = FCV_CURRENT_VALUE + 1;
	

	//Условие
	//Условие: current_value = 1?
	if (FCV_CURRENT_VALUE == 1)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 1
		//  SEG1 = 0
		FCV_SEG0 = 1;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 2?
	if (FCV_CURRENT_VALUE == 2)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 2
		//  SEG1 = 0
		FCV_SEG0 = 2;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 3?
	if (FCV_CURRENT_VALUE == 3)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 3
		//  SEG1 = 0
		FCV_SEG0 = 3;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 4?
	if (FCV_CURRENT_VALUE == 4)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 4
		//  SEG1 = 0
		FCV_SEG0 = 4;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 5?
	if (FCV_CURRENT_VALUE == 5)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 5
		//  SEG1 = 0
		FCV_SEG0 = 5;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 6?
	if (FCV_CURRENT_VALUE == 6)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 6
		//  SEG1 = 0
		FCV_SEG0 = 6;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 7?
	if (FCV_CURRENT_VALUE == 7)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 7
		//  SEG1 = 0
		FCV_SEG0 = 7;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 8?
	if (FCV_CURRENT_VALUE == 8)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 8
		//  SEG1 = 0
		FCV_SEG0 = 8;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 9?
	if (FCV_CURRENT_VALUE == 9)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 9
		//  SEG1 = 0
		FCV_SEG0 = 9;
		FCV_SEG1 = 0;
		

	}


	//Условие
	//Условие: current_value = 10?
	if (FCV_CURRENT_VALUE == 10)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 0
		//  SEG1 = 1
		FCV_SEG0 = 0;
		FCV_SEG1 = 1;
		

	}


	//Условие
	//Условие: current_value = 11?
	if (FCV_CURRENT_VALUE == 11)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 1
		//  SEG1 = 1
		FCV_SEG0 = 1;
		FCV_SEG1 = 1;
		

	}


	//Условие
	//Условие: current_value = 12?
	if (FCV_CURRENT_VALUE == 12)
	{
		//Вычисление
		//Вычисление:
		//  SEG0 = 2
		//  SEG1 = 1
		FCV_SEG0 = 2;
		FCV_SEG1 = 1;
		

	}


}

void FCM_1sec()
{
	
	//Вычисление
	//Вычисление:
	//  do1sec = do1sec + 1
	FCV_DO1SEC = FCV_DO1SEC + 1;
	

}

int main()
{
	//Quad seven segment counter using multiplexing
	
	//Инициализация
	MCUCR=0x0a;
	MCUSR=0x00;
	wdt_disable();


	//Инициализация кода прерывания
	GIMSK=0x00;


	//Initialise COUNT
	//Вычисление:
	//  COUNT = 0
	FCV_COUNT = 0;
	

	//Initialise Segments
	//Вычисление:
	//  SEG0 = 0
	//  SEG1 = 0
	FCV_SEG0 = 0;
	FCV_SEG1 = 0;
	

	//Вычисление
	//Вычисление:
	//  do1sec = 0
	FCV_DO1SEC = 0;
	

	//Прерывание
	//Прерывание: Разрешено TMR0
	TCCR0B &= 0xf8;
	TCCR0B |= 0x04;
	sei();
	TIMSK |= (1 << TOIE0);


	//Infinite Loop
	//Цикл: While 1
	while (1)
	{
		//Комментарий:
		//Организация опроса кнопок - защелка на "пролете".
		//По флагу организуется разовый заход в (Calculation COUNT = COUNT + 1).
		//Таким образом устраняется дребезг и не прерывается вычисление.


		//Вход
		//Вход: A0 -> SWITCH
		DDRA = DDRA & 0xfe;
		FCV_SWITCH = ((PINA & 0x01) == 0x01);


		//Decision
		//Условие: SWITCH=0 AND flag_=0?
		if (FCV_SWITCH==0 & FCV_FLAG_==0)
		{
			//Calculation
			//Вычисление:
			//  flag_ = 1
			FCV_FLAG_ = 1;
			

		}


		//Комментарий:
		//"Кнопка"


		//Решение
		//Условие: SWITCH=1 AND flag_=1?
		if (FCV_SWITCH==1 & FCV_FLAG_==1)
		{
			//Вычисление
			//Вычисление:
			//  flag_ = 0
			FCV_FLAG_ = 0;
			

			//Комментарий:
			//На исполнение счета.


			//Вычисление
			//Вычисление:
			//  COUNT = COUNT + 1
			FCV_COUNT = FCV_COUNT + 1;
			

			//Вычисление
			//Вычисление:
			//  do1sec = 0
			FCV_DO1SEC = 0;
			

		}


		//1 full cycle
		//Условие: COUNT >= 1?
		if (FCV_COUNT >= 1)
		{
			//Reset COUNT
			//Вычисление:
			//  COUNT = 0
			FCV_COUNT = 0;
			

			//Update the Segment values
			//Макрос: UPDATE_VALUES
			FCM_UPDATE_VALUES();


		} else {
			//Условие
			//Условие: current_value >= 12 OR do1sec >= 60?
			if (FCV_CURRENT_VALUE >= 12 | FCV_DO1SEC >= 60)
			{
				//Вычисление
				//Вычисление:
				//  current_value = 0
				FCV_CURRENT_VALUE = 0;
				

			}


			//Условие
			//Условие: do1sec >= 60?
			if (FCV_DO1SEC >= 60)
			{
				//Вычисление
				//Вычисление:
				//  do1sec = 0
				FCV_DO1SEC = 0;
				

			}


		}


		//Refresh Segment 0
		//Макрос компонента: led7seg(0)::Показать цифру(SEG0, 0)
		FCD_led7seg0_ShowDigit(FCV_SEG0, 0);


		//Задержка
		//Задержка: 1 мс
		delay_ms(1);


		//Output
		//Выход: 255 -> PORT D
		DDRD = DDRD | 0x30;
		PORTD = (PORTD & 0xcf) | 255;


		//Комментарий:
		//Гашение индикатора SEG1,пока SEG1 = 0.


		//Условие
		//Условие: SEG1 = 1?
		if (FCV_SEG1 == 1)
		{
			//Refresh Segment 1
			//Макрос компонента: led7seg(1)::Показать цифру(SEG1, 0)
			FCD_led7seg1_ShowDigit(FCV_SEG1, 0);


			//Задержка
			//Задержка: 1 мс
			delay_ms(1);


			//Output
			//Выход: 255 -> PORT D
			DDRD = DDRD | 0x30;
			PORTD = (PORTD & 0xcf) | 255;


		} else {
			//Задержка
			//Задержка: 1 мс
			delay_ms(1);


		}


	}


	mainendloop: goto mainendloop;
}

	//Handler code for [TMR0]
	#ifndef MX_TIMER0OVF_HANDLER
	#define MX_TIMER0OVF_HANDLER
	ISR(TIMER0_OVF_vect)
	{
		FCM_1sec();
	}
	#else
	#warning The <TIMER0 OVF> interrupt has previously been enabled, so the macro <1sec> may never get called.
	#endif




