

#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>

// Shift register
#define PORT_DATA PORTD
#define PinData PIND1 
#define PinReadData PIND3 
#define PinShowData PIND4 

// DIC
unsigned char Sotni = 1;
unsigned char Desyatki = 2;
unsigned char Edinici = 3;

int  digits[10]=       //создаём массив с цифрами
{	//hfaedcgb
	0b10000010,                   //0
	0b11111010,                   //1
	0b11000100,                   //2
	0b11010000,                   //3
	0b10111000,                   //4
	0b10010001,                   //5
	0b10000001,                   //6
	0b11011010,                   //7
	0b10000000,                   //8
	0b10010000,                   //9
};

volatile unsigned char Kod_Znaka = 0;	// Код цифры
volatile unsigned char Kod_Vklucheniya = 0;	// Код разряда
volatile unsigned char i = 0;			// Счетчик, который используется сдвиговым регистром
volatile unsigned int SRData = 0;		// Значение этой переменной выводится на сдвиговый регистр
volatile unsigned char SRData1 = 0;



int main(void)
{
	DDRD = 0b00011110;
	DDRB = 0b00000100;
	
	PORTB = 0x00;
	PORTD = 0x04;
	
	PORT_DATA &= (~(1<<PinReadData));
	PORT_DATA &= (~(1<<PinShowData));
    /* Replace with your application code */
	
	 while (1) 
    {							   //321
			Kod_Vklucheniya = 0b00000000;
						//hfaedcgb
			Kod_Znaka = digits[Sotni];
			
			//SRData = (Kod_Vklucheniya << 8) + Kod_Znaka;
			
			
			Kod_Znaka = digits[Sotni];
			Kod_Vklucheniya = 0b11111110;
			SR();
			_delay_us(500);
			
			Kod_Znaka = digits[Desyatki];
			Kod_Vklucheniya = 0b11111101;
			SR();
			_delay_us(500);
			
			Kod_Znaka = digits[Edinici];
			Kod_Vklucheniya = 0b11111011;
			SR();
			_delay_us(500);
			
				
				//_delay_ms(500);
				PORTB ^= (1 << PINB2);
				PORTD ^= (1 << PIND2);
				//
				//if (Sotni<9)
				//{
					//Sotni++;
				//}
				//else
				//{
					//Sotni = 0;
				//}
				
				
			
		
		
    }
}

void SR(void)
{
	SRData = Kod_Vklucheniya;
	SRData1 = Kod_Znaka;
	
	PORT_DATA &= (~(1<<PinReadData));			// Опускаем контрольные выводы в 0
	PORT_DATA &= (~(1<<PinShowData));

	for (i=0; i<8; i++)
	{
		if (SRData & 0x80)					// Выводим логический уровень вывода передачи данных в соответствие со значением старшего бита в Data
		{
			PORT_DATA |= (1<<PinData);
		}
		else
		{
			PORT_DATA &= (~(1<<PinData));
		}
		
		_delay_us(100);
		PORT_DATA |= (1<<PinReadData);		// Запись бита в сдвиговый регистр
		_delay_us(100);
		PORT_DATA &= (~(1<<PinReadData));
		
		SRData <<= 1;							// Сдвиг битов влево, чтобы обновить выводимые данные.
		
	}
	
	
	
	for (i=0; i<8; i++)
	{
		if (SRData1 & 0x80)					// Выводим логический уровень вывода передачи данных в соответствие со значением старшего бита в Data
		{
			PORT_DATA |= (1<<PinData);
		}
		else
		{
			PORT_DATA &= (~(1<<PinData));
		}
		
		_delay_us(100);
		PORT_DATA |= (1<<PinReadData);		// Запись бита в сдвиговый регистр
		_delay_us(100);
		PORT_DATA &= (~(1<<PinReadData));
		
		SRData1 <<= 1;							// Сдвиг битов влево, чтобы обновить выводимые данные.
		
	}

	PORT_DATA |= (1<<PinShowData);
	_delay_us(100);
	PORT_DATA &= (~(1<<PinShowData));	// Запись бита в сдвиговый регистр
}

	
	