#include <tiny2313.h>
#include <delay.h>

unsigned char msec=1;
unsigned char sec=1;
unsigned char min=1;
unsigned char hour=1;
char i=10;
eeprom char mode=0; //режимы отображения. 1 часы, 2 часы, с интервалом 1 час, .. а дальше всякие анимации
eeprom char DelayTime=10;

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
msec++;
if (msec>99) 
    {
        msec=0;
        sec++;
        if (sec>59)
            {
                sec=0;
                min++;
                if (min>59)
                    {
                        min=0;
                        hour++; 
                        if (hour>11)
                            {
                                hour=0;
                            }
                    }
            }
    }
    

}

// Declare your global variables here
void SetLed(char LedN, char ColorLed, char b)
{
    PORTD.0=ColorLed;
    switch(LedN)
    {
    case 0:  PORTB.3=b; break;
    case 1:  PORTB.2=b; break;
    case 2:  PORTB.1=b; break;
    case 3:  PORTB.0=b; break;
    case 4:  PORTD.6=b; break;
    case 5:  PORTD.5=b; break;
    case 6:  PORTD.4=b; break;
    case 7:  PORTD.3=b; break;
    case 8:  PORTD.2=b; break;
    case 9:  PORTD.1=b; break;
    case 10: PORTB.5=b; break;
    case 11: PORTB.4=b; break;
    case 12: PORTB.3=b; break;
    case 99:  {PORTB=0b11111111; PORTD=0b01111110; break;}
    case 50:  {PORTB=0b11000000; PORTD=0b00000000; break;}
    break;
    }
}

// Pin change 0-7 interrupt service routine
interrupt [PC_INT] void pin_change_isr0(void)
{
// Place your code here
      if (!PINB.6)
        {
            if (mode==1) { min+=5; if (min>59) min=0;}
            if (mode==0) { hour+=1; if (hour>11) hour=0;}
            if (mode>1) {DelayTime-=1; if (DelayTime<1) DelayTime=1;}
            delay_ms(300);
        }
      if (!PINB.7)
        {
            if (mode==1) { sec+=5; if (sec>59) sec=0;}
            if (mode==0) { min+=5; if (min>59) min=0;}
            if (mode>1) {DelayTime+=1; if (DelayTime>100) DelayTime=100;}
            delay_ms(300);
        
      
          if (!PINB.6)
            {
                mode++;
                if (mode>13) mode=0;
                delay_ms(100);
            }
        }

}

void animate1(void )
{       
        i=1;
        SetLed(50,1,0);
        delay_ms(DelayTime*7);
//        PORTD.0=0; 
         for (i=1;i<13;i++) 
         {
            SetLed(i,1,1);
            delay_ms(DelayTime*4);
         };
         for (i=1;i<13;i++) 
         {
            SetLed(13-i,1,0);
            delay_ms(DelayTime*4);
         };
        SetLed(99,0,0); 
        delay_ms(DelayTime*7);
//        PORTD.0=1;
         for (i=1;i<13;i++) 
         {
            SetLed(i,0,0);
            delay_ms(DelayTime*4);
         };
         for (i=1;i<13;i++) 
         {
            SetLed(13-i,0,1);
            delay_ms(DelayTime*4);
         };

}

void animate2(void )
{
i=1;
for (i=1;i<13;i++)
    {
        SetLed(99,0,0);
        SetLed(i,0,0); 
        delay_ms(DelayTime*10);
    }
}

void animate3(void )
{
i=1;
for (i=1;i<13;i++)
    {
        SetLed(50,1,0);
        SetLed(i,1,1); 
        delay_ms(DelayTime*10);
    }
}

void animate4(void )   //одна на 360
{
i=10;
for (i=10;i<130;i++)
    {
        SetLed(50,1,0);
        SetLed(i/10,1,1); 
        delay_ms(DelayTime);

        SetLed(99,0,0);
        SetLed(i/10,0,0); 
        delay_ms(DelayTime);
    }
}
void animate6(void )    //три по 120 градусов
{
i=11;
for (i=11;i<129;i++)
    {
        SetLed(50,1,0);
        SetLed(i/10,1,1); 
        SetLed((i/10+3)%12+1,1,1); 
        SetLed((i/10+7)%12+1,1,1); 
        delay_ms(DelayTime);

        SetLed(99,0,0);
        SetLed(i/10,0,0); 
        SetLed((i/10+3)%12+1,0,0); 
        SetLed((i/10+7)%12+1,0,0); 
        delay_ms(DelayTime);
    }
}
void animate7(void ) //четыре по 90 градусов
{
i=11;
for (i=11;i<129;i++)
    {
        SetLed(50,1,0);
        SetLed(i/10,1,1); 
        SetLed((i/10+2)%12+1,1,1); 
        SetLed((i/10+5)%12+1,1,1); 
        SetLed((i/10+8)%12+1,1,1); 
        delay_ms(DelayTime);

        SetLed(99,0,0);
        SetLed(i/10,0,0); 
        SetLed((i/10+2)%12+1,0,0); 
        SetLed((i/10+5)%12+1,0,0); 
        SetLed((i/10+8)%12+1,0,0); 
        delay_ms(DelayTime);
    }
}
void animate5(void )   //две по 180градусов
{
i=11;
for (i=11;i<129;i++)
    {
        SetLed(50,1,0);
        SetLed(i/10,1,1); 
        SetLed((i/10+5)%12+1,1,1); 
        delay_ms(DelayTime);

        SetLed(99,0,0);
        SetLed(i/10,0,0); 
        SetLed((i/10+5)%12+1,0,0); 
        delay_ms(DelayTime);
    }
}

void animate9(void )
{
SetLed(50,0,0); 
delay_ms(5);
SetLed(99,1,1); 
PORTD.0=1;
delay_ms(5);
}


void secundomer(void )
{
        SetLed(50,1,0);
        SetLed(msec/8,1,1); 
        delay_ms(5);
        
        SetLed(99,0,0);
        SetLed(sec/5,0,0); 
        delay_ms(5);
}

clock()
{

        SetLed(50,1,0);
        SetLed(hour,1,1); 
        delay_ms(5);

        SetLed(50,1,0);
        SetLed(0,1,1); 
        delay_us(300);
        
        SetLed(99,0,0);
        SetLed(msec/8,0,0); 
        delay_us(300); 

        SetLed(99,0,0);  
        SetLed(min/5,0,0); 
        delay_ms(5);
}
clock1()
{
        SetLed(50,1,0);
        SetLed(min/5,1,1); 
        delay_ms(5);

        SetLed(99,0,0);
        SetLed(msec/8,0,0); 
        delay_us(300); 
        
        SetLed(99,0,0);
        SetLed(sec/5,0,0); 
        delay_ms(5);
}


void main(void)
{

PORTA=0x00;
DDRA=0x00;
PORTB=0b11000000;
 DDRB=0b00111111;
PORTD=0b00111111;
DDRD=0x7F;

TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=((16000000/(64*100)));
OCR1BH=0x00;
OCR1BL=0x00;

GIMSK=0x20;
MCUCR=0x00;
PCMSK=0xC0;
EIFR=0x20;

TIMSK=0x40;

#asm("sei")

while (1)
      {
      // Place your code here 
      if (mode==0) clock(); 
      if (mode==1) clock1(); 
      if (mode==2) secundomer(); 
      if (mode==3) animate9(); 
      if (mode==4) animate2(); 
      if (mode==5) animate3(); 
      if (mode==6) animate4(); 
      if (mode==7) animate5(); 
      if (mode==8) animate6(); 
      if (mode==9) animate7(); 
      if (mode==10) animate1(); 
      if (mode==11) {animate2();animate3();} 
      if (mode==12)  
        {
           animate2(); 
           animate2(); 
           animate3(); 
           animate3(); 
           animate4(); 
           animate4(); 
           animate5(); 
           animate5(); 
           animate6(); 
           animate6(); 
           animate7(); 
           animate7(); 
        }

      }; 
}
