/*
 * Experience.c
 *
 *  Created on: 31.03.2013
 *      Author: FreshMan
 */


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//#include "rtc.h"

#define AnodRazryda0 (PORTB|=(1<<4))
#define AnodRazryda1 (PORTB|=(1<<5))
#define AnodRazryda2 (PORTB|=(1<<6))
#define AnodRazryda3 (PORTB|=(1<<7))

#define DotsOn (PORTC|=(1<<0))
#define DotsOff (PORTC&=~(1<<0))

#define BuzzerOn (PORTC|=(1<<1))
#define BuzzerOff (PORTC&=~(1<<1))


#define kn_1 (PIND&(1<<5))
#define kn_2 (PIND&(1<<6))
#define kn_3 (PIND&(1<<7))

#define StartSound TCCR0|=(1<<2)|(0<<1)|(0<<0);
#define StopSound TCCR0=0x00;

#define drebezg 10
#define ChangeOfNumbers 300
#define stop 700
#define time_blink 240

unsigned char mode=5;
unsigned char sec;
unsigned char min;
unsigned char hour;
unsigned char MinAlarm;
unsigned char HourAlarm;
unsigned char tmp;
unsigned char blink;
unsigned char flag,metka;
unsigned char beep;
unsigned char effect;
unsigned char counter;
unsigned char flagSC;
unsigned char mark;
unsigned char number;
unsigned char fl,flg;
//unsigned char var;
signed char var;

signed char   iocr1=50;
signed char   iocr=0;
unsigned char fr[4];                    //какой разряд
unsigned char TimeScreen[4];            //массив временного экрана
unsigned char Screen[4];                //массив экрана
unsigned char  bright[5]={240,1,1,1,1}; //яркость для каждого разряда, включая точки

unsigned int  bright1[4]; //яркость для каждого разряда, включая точки
unsigned char psc[25]={1,21,42,63,84,105,126,147,168,189,210,231,245,231,210,189,168,147,126,105,84,63,42,21,1};
unsigned char mas[50]={5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,95,200,205,210,215,220,225,230,235,240,245,250};

// Timer 1 output compare A interrupt service routine
ISR (TIMER1_COMPA_vect)
{
if(++sec>=60) {sec=0;min++;DotsOn;};
if(min>=60) {min=0;hour++;};
if(hour>=24) hour=0;
flag=1;
metka=1;

}
//************************************************************************
// Timer 2 overflow interrupt service routine
ISR (TIMER2_OVF_vect)
{
    //static unsigned char i;
    static unsigned char t=1;

    if (++var>=5) var=0;
    if (++t>=5) t=0;

    //DotsOff;                                //гасим разделительные точки
    PORTB=0x0A;                             //выключаем анодный драйвер(гасим индикаторы)
    OCR2=bright[t];

}

//*****************************************************************************

//Timer 2 output compare interrupt service routine
ISR (TIMER2_COMP_vect)
{

    if (var<=3)
    	{
			PORTB=Screen[var];
    	}
    switch (var)
    	{
    		case 0: if (!((mode==8)&&(blink==0)))
    	        		{
    		    			AnodRazryda0;
    	        		};
    				break;
    		case 1: if (!((mode==8)&&(blink==0)))
    					{
        	    			AnodRazryda1;
    					};
        			break;
    		case 2: if (!((mode==9)&&(blink==0)))
                		{
        	    			AnodRazryda2;
                		};
        	    	break;
    		case 3: if (!((mode==9)&&(blink==0)))
                		{
        	    			AnodRazryda3;
                		};
        	    	break;
    		case 4: if ((((mode<2)&&(blink==0))||(((mode>1)&&(mode<6))&&(blink==1)))||(mode>6))
               	   	    {
//       	    				DotsOn;
               	   	    };
        	    	break;
    		default:break;
    	}

//     if (++v>=5)
//     {
//     	v=0;
//     };
 // var++;
   //OCR2=bright[v];
}
//***********************************************************************************
void SetScreen (char raz1_2, char raz3_4)
{

 static unsigned char i;
        if (mode<=3)
        	{
        		TimeScreen[0]=raz1_2/10;
        		TimeScreen[1]=raz1_2%10;
        		TimeScreen[2]=raz3_4/10;
        		TimeScreen[3]=raz3_4%10;


        		for (i=0; i<=3; i++)
        			{
        				if (TimeScreen[i]!=Screen[i]) //узнаём в каком разряде изменялась цифра
        					{
        						fr[i]=1;
        					}
        				else
        					{
        						fr[i]=0;
        					}
        			}
        	}
        else
        	{
        		Screen[0]=raz1_2/10;
        		Screen[1]=raz1_2%10;
        		Screen[2]=raz3_4/10;
        		Screen[3]=raz3_4%10;

        	}


  //  flag=0; //сбрасываем флаг чтения
   // mark=1;
   // flagSC=1;
}

//***********************************************************************************

int main(void)
{
DDRB =0b11111111;//The Port B Data Direction Registe   0-пин порта на вход               1-пин порта на выход
PORTB=0b00000000;//The Port B Data Register            1/0 - on/off pull-up resistor

DDRC= 0b00111111;
PORTC=0b00000000;

DDRD =0b00000000;
PORTD=0b11100000;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 31.250 kHz
//TCCR0=0x04;
TCNT0=0xEF;
TCCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x7A;
OCR1AL=0x11;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x4C;
TCNT2=0x00;
OCR2=0xCA;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0xD0;

// Global enable interrupts
sei ();

 while (1)
	{

 		if (flag==0)                                  //если прошла 1с
 		{

 			SetScreen(93,75);
//     		switch (mode)                                 //выбираем режим отображения времени
//         	{
//                 case 0: effect=0; SetScreen(hour,min); break; //плавная смена цифр (ч:м)
//             	case 1: effect=0; SetScreen(min,sec);  break; //плавная смена цифр (м:с)
//
//             	case 2: effect=1; SetScreen(hour,min); break; //перелив цифр(ч:м)
//             	case 3: effect=1; SetScreen(min,sec);  break; //перелив цифр(м:с)
//
//                 case 4: effect=2; SetScreen(hour,min); break; //перебор цифр (ч:м)
//             	case 5: effect=2; SetScreen(min,sec);  break; //перебор цифр (м:с)
//
//             	case 6: effect=3; SetScreen(hour,min); break;           //обычная смена цифр (ч:м)
//             	case 7: effect=3; SetScreen(min,sec);  break;           //обычная смена цифр (м:с)
//
//                 default: break;
//         	}
     	}



	}


}
