#define F_CPU 1000000UL //  
#include <avr/io.h> //    AVR
#include <avr/iom16.h> //  Atmega8
#include <avr/delay.h> //  


int main(void)
{
    
	//  
	DDRD = 0xFF; //  D   
	DDRC = 0xFF; //  C   		
	DDRB = 0x00; //  B   	
	
				 //  0   1    2    3    4    5    6     7     8     9        -
char SEGMENT[ ] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D, 0x07, 0x7F, 0x6F, 0b01000000};
	int n_1 = 0;
	int n_2 = 0;
	int n_3 = 0;
	int n_4 = 0;
	int n_5 = 0;
	int n_6 = 0;
	int n_7 = 0;
	int n_8 = 0;
	char indickator = '1';
		
    while(1)
    {		
		switch(indickator)
		   {
			case '1': {
                        PORTC = 0b00000001; //   1-  PORTC = 0b00001011;
						PORTD = SEGMENT[n_1];
						_delay_ms(1);
						PORTC = 0b00000010;//   2- 
						PORTD = SEGMENT[n_2];
						_delay_ms(1);
						PORTC = 0b00000100;//   3- 
						PORTD = SEGMENT[n_3];	
						_delay_ms(1);
						PORTC = 0b00001000;//   4- 
						PORTD = SEGMENT[n_4];
						_delay_ms(1);	
						PORTC = 0b00010000;//   5- 
						PORTD = SEGMENT[n_5];
						_delay_ms(1);	
						PORTC = 0b00100000;//   6- 
						PORTD = SEGMENT[n_6];
						_delay_ms(1);		
						PORTC = 0b01000000;//   7- 
						PORTD = SEGMENT[n_7];
						_delay_ms(1);
						PORTC = 0b10000000;//   8- 
						PORTD = SEGMENT[n_8];
						_delay_ms(1);	
				       } break;
			case '2': {
                        PORTC = 0b00000001; //   1-  PORTC = 0b00001011;
						PORTD = SEGMENT[n_1];
						_delay_ms(1);
						PORTC = 0b00000010;//   2- 
						PORTD = SEGMENT[n_2];
						_delay_ms(1);
						PORTC = 0b00000100;//   3- 
						PORTD = SEGMENT[n_3];	
						_delay_ms(1);
						PORTC = 0b00001000;//   4- 
						PORTD = SEGMENT[n_4];
						_delay_ms(1);	
						PORTC = 0b00010000;//   5- 
						PORTD = SEGMENT[n_5];
						_delay_ms(1);	
						PORTC = 0b00100000;//   6- 
						PORTD = SEGMENT[n_6];
						_delay_ms(1);		
						PORTC = 0b01000000;//   7- 
						PORTD = SEGMENT[n_7];
						_delay_ms(1);
						PORTC = 0b10000000;//   8- 
						PORTD = SEGMENT[n_8];
						_delay_ms(1);	
				       } break;
			case '3': {
                        PORTC = 0b00000001; //   1-  PORTC = 0b00001011;
						PORTD = SEGMENT[n_1];
						_delay_ms(1);
						PORTC = 0b00000010;//   2- 
						PORTD = SEGMENT[n_2];
						_delay_ms(1);
						PORTC = 0b00000100;//   3- 
						PORTD = SEGMENT[n_3];	
						_delay_ms(1);
						PORTC = 0b00001000;//   4- 
						PORTD = SEGMENT[n_4];
						_delay_ms(1);	
						PORTC = 0b00010000;//   5- 
						PORTD = SEGMENT[n_5];
						_delay_ms(1);	
						PORTC = 0b00100000;//   6- 
						PORTD = SEGMENT[n_6];
						_delay_ms(1);		
						PORTC = 0b01000000;//   7- 
						PORTD = SEGMENT[n_7];
						_delay_ms(1);
						PORTC = 0b10000000;//   8- 
						PORTD = SEGMENT[n_8];
						_delay_ms(1);	
				       } break;
			case '4': {
                        PORTC = 0b00000001; //   1-  PORTC = 0b00001011;
						PORTD = SEGMENT[n_1];
						_delay_ms(1);
						PORTC = 0b00000010;//   2- 
						PORTD = SEGMENT[n_2];
						_delay_ms(1);
						PORTC = 0b00000100;//   3- 
						PORTD = SEGMENT[n_3];	
						_delay_ms(1);
						PORTC = 0b00001000;//   4- 
						PORTD = SEGMENT[n_4];
						_delay_ms(1);	
						PORTC = 0b00010000;//   5- 
						PORTD = SEGMENT[n_5];
						_delay_ms(1);	
						PORTC = 0b00100000;//   6- 
						PORTD = SEGMENT[n_6];
						_delay_ms(1);		
						PORTC = 0b01000000;//   7- 
						PORTD = SEGMENT[n_7];
						_delay_ms(1);
						PORTC = 0b10000000;//   8- 
						PORTD = SEGMENT[n_8];
						_delay_ms(1);	
				       } break;
		}
		_delay_ms(1);					
		
		 
		if (PINB == 0b11111110) //   
		{
		  switch(indickator)
		  {
			  case '1': {
                        indickator = '2';
						PORTC = 0b11000010;
						PORTD = 0b10111111;						
						}break;
			  case '2':{
                        indickator = '3';
						PORTC = 0b00000100;
						PORTD = 0b10111111;
						}break;
			  case '3': {
                        indickator = '4';
						PORTC = 0b00001000;
						PORTD = 0b10111111;
						}break;
			  case '4': {
                        indickator = '1';
						PORTC = 0b00110001;
						PORTD = 0b10111111;
						}break;

		  }	
		  _delay_ms(200);	 
		}
		
		if (PINB == 0b11111101) //   +
		{
			if (indickator == '1')
			{
				switch(n_1)
				{
					case 0: n_1 = 1; break;
					case 1: n_1 = 2; break;
					case 2: n_1 = 3; break;
					case 3: n_1 = 4; break;
					case 4: n_1 = 5; break;
					case 5: n_1 = 6; break;
					case 6: n_1 = 7; break;
					case 7: n_1 = 8; break;
					case 8: n_1 = 9; break;
					case 9: n_1 = 10; break;
					case 10: n_1 = 0; break;
				}
				if (n_1 > 9) {
                    n_1 = 0;
					n_5++; 
					if (n_5 > 9){
						n_5 = 0;
						n_6++;
					}
				}										
			}
			if (indickator == '2')
			{
				switch(n_2)
				{
					case 0: n_2 = 1; break;
					case 1: n_2 = 2; break;
					case 2: n_2 = 3; break;
					case 3: n_2 = 4; break;
					case 4: n_2 = 5; break;
					case 5: n_2 = 6; break;
					case 6: n_2 = 7; break;
					case 7: n_2 = 8; break;
					case 8: n_2 = 9; break;
					case 9: n_2 = 10; break;
					case 10: n_2 = 0; break;
				}
				if (n_2 > 9) {
                    n_2 = 0;
					n_7++; 
					if (n_7 > 9){
						n_7 = 0;
						n_8++;
					}
				}										
			}
			if (indickator == '3')
			{
				switch(n_3)
				{
					case 0: n_3 = 1; break;
					case 1: n_3 = 2; break;
					case 2: n_3 = 3; break;
					case 3: n_3 = 4; break;
					case 4: n_3 = 5; break;
					case 5: n_3 = 6; break;
					case 6: n_3 = 7; break;
					case 7: n_3 = 8; break;
					case 8: n_3 = 9; break;
					case 9: n_3 = 0; break;					
				}
			}
			if (indickator == '4')
			{
				switch(n_4)
				{
					case 0: n_4 = 1; break;
					case 1: n_4 = 2; break;
					case 2: n_4 = 3; break;
					case 3: n_4 = 4; break;
					case 4: n_4 = 5; break;
					case 5: n_4 = 6; break;
					case 6: n_4 = 7; break;
					case 7: n_4 = 8; break;
					case 8: n_4 = 9; break;
					case 9: n_4 = 0; break;
					}
			}
			
			_delay_ms(200);
		}
		
		if (PINB == 0b11111011) //   -
		{
			if (indickator == '1')
			{
				switch(n_1)
				{
					case 0: n_1 = -1; break;
					case 1: n_1 = 0; break;
					case 2: n_1 = 1; break;
					case 3: n_1 = 2; break;   
					case 4: n_1 = 3; break;
					case 5: n_1 = 4; break;
					case 6: n_1 = 5; break;
					case 7: n_1 = 6; break;
					case 8: n_1 = 7; break;
					case 9: n_1 = 8; break;
					case 10: n_1 = 9; break;
				}
	
					if (n_1 < 0){
						n_1 = 9;
						n_5 --;
						}	
						if (n_5 < 0){
							n_1 = 9;
							n_5 = 9;
							n_6  --;
						}	
						if (n_1 < 0|| n_5 < 0|| n_6 < 0){
						n_1 = 9;
						n_5 = 9;
						n_6 = 9;
						}															
			}
			if (indickator == '2')
			{
				switch(n_2)
				{
					case 0: n_2 = -1; break;
					case 1: n_2 = 0; break;
					case 2: n_2 = 1; break;
					case 3: n_2 = 2; break;
					case 4: n_2 = 3; break;
					case 5: n_2 = 4; break;
					case 6: n_2 = 5; break;
					case 7: n_2 = 6; break;
					case 8: n_2 = 7; break;
					case 9: n_2 = 8; break;
					case 10: n_2 = 9; break;
					}
					if (n_2 < 0){
						n_2 = 9;
						n_7 --;
						}	
						if (n_7 < 0){
							n_2 = 9;
							n_7 = 9;
							n_8  --;
						}	
						if (n_2 < 0|| n_7 < 0|| n_8 < 0){
						n_2 = 9;
						n_7 = 9;
						n_8 = 9;
						}					
			}	
			if (indickator == '3')
			{
				switch(n_3)
				{
					case 0: n_3 = 9; break;
					case 1: n_3 = 0; break;
					case 2: n_3 = 1; break;
					case 3: n_3 = 2; break;
					case 4: n_3 = 3; break;
					case 5: n_3 = 4; break;
					case 6: n_3 = 5; break;
					case 7: n_3 = 6; break;
					case 8: n_3 = 7; break;
					case 9: n_3 = 8; break;					
					}	
				}					
			if (indickator == '4')
			{
				switch(n_4)
				{
					case 0: n_4 = 9; break;
					case 1: n_4 = 0; break;
					case 2: n_4 = 1; break;
					case 3: n_4 = 2; break;
					case 4: n_4 = 3; break;
					case 5: n_4 = 4; break;
					case 6: n_4 = 5; break;
					case 7: n_4 = 6; break;
					case 8: n_4 = 7; break;
					case 9: n_4 = 8; break;
					}
			}			
			_delay_ms(200);
		}
		
		if (PINB == 0b11110111) //   
		{
			n_1 = 0;
			n_2 = 0;
			n_3 = 0;
			n_4 = 0;
			n_5 = 0;
			n_6 = 0;
			n_7 = 0;
			n_8 = 0;
			indickator = '1';
			_delay_ms(100);	
		}
		if (PINB == 0b11110011)
		{
			DDRD = 0x00;
		}   
		if (PINB == 0b11110101)
		{
			DDRD = 0xFF;
		}                     
		
		//  
    }
}