/*
 * lesson15.1.c
 *
 * Created: 15.10.2025 8:05:17
 * Author : Maxim
 */ 

# define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

unsigned int res_1000 = 0, res_100 = 0, res_10 = 0, res_1 = 0, z = 0, count = 0, timer_count = 0;

void obrabotka(int cifra)
{
	PORTC &= ~((1<<3) | (1<<2) | (1<<1) | (1<<0));
	PORTD &= ~((1<<7) | (1<<6) | (1<<5) | (1<<4));
	switch(cifra)
	{
		case 0: PORTC |= (1<<3) | (1<<2) | (1<<1) | (1<<0); PORTD |= (1<<5) | (1<<4); break;
		case 1: PORTC |= (1<<2) | (1<<1); break;
		case 2: PORTC |= (1<<3) | (1<<1) | (1<<0); PORTD |= (1<<6) | (1<<4); break;
		case 3: PORTC |= (1<<3) | (1<<2) | (1<<1) | (1<<0); PORTD |= (1<<6); break;
		case 4: PORTC |= (1<<2) | (1<<1); PORTD |= (1<<5) | (1<<6); break;
		case 5: PORTC |= (1<<3) | (1<<2) | (1<<0); PORTD |= (1<<5) | (1<<6); break;
		case 6: PORTC |= (1<<3) | (1<<2) | (1<<0); PORTD |= (1<<6) | (1<<5) | (1<<4); break;
		case 7: PORTC |= (1<<2) | (1<<1) | (1<<0); break;
		case 8: PORTC |= (1<<3) | (1<<2) | (1<<1) | (1<<0); PORTD |= (1<<6) | (1<<5) | (1<<4); break;
		case 9: PORTC |= (1<<3) | (1<<2) | (1<<1) | (1<<0); PORTD |= (1<<6) | (1<<5); break;
		default: break;
	}
}

void chislo(unsigned int result)
{
	res_1000 = result / 1000;
	res_100 = result % 1000 / 100;
	res_10  = result % 100/10;
	res_1   = result % 10;
}

ISR(TIMER0_OVF_vect)
{
	if (++z > 4) {z = 1;}
		
	if (z==1)
	{
		PORTB &= ~(1<<2);
		PORTB |= (1<<5) | (1<<4) | (1<<3);
		obrabotka(res_1000);
	}
	if (z==2)
	{
		PORTB &= ~(1<<3);
		PORTB |= (1<<5) | (1<<4) | (1<<2);
		obrabotka(res_100);
	}
	if (z==3)
	{
		PORTB &= ~(1<<4);
		PORTB |= (1<<5) | (1<<3) | (1<<2);
		obrabotka(res_10);
	}
	if (z==4)
	{
		PORTB &= ~(1<<5);
		PORTB |= (1<<4) | (1<<3) | (1<<2);
		obrabotka(res_1);
	}
}

// ISR(INT0_vect)
// {
// 	timer_count = TCNT1 + (count*65536);
// 	TCNT1 = 0;
// 	count = 0;
// }
// 
// ISR(TIMER1_OVF_vect)
// {
// 	count++;
// }

int main(void)
{
	DDRC |= (1<<3) | (1<<2) | (1<<1) | (1<<0);
	PORTC &= ~((1<<3) | (1<<2) | (1<<1) | (1<<0));
	
	DDRD |= (1<<7) | (1<<6) | (1<<5) | (1<<4);
	PORTD &= ~((1<<7) | (1<<6) | (1<<5) | (1<<4));
	
	//У нас 7сегментник с общим катодом, по умолчанию "земля закрыта"
	DDRB |= (1<<5) | (1<<4) | (1<<3) | (1<<2);
	PORTB &= ~((1<<5) | (1<<4) | (1<<3) | (1<<2));
	
	//Выход частотомера
	DDRD &= ~(1<<2);
	PORTD |= (1<<2);
	
	//Настраиваем 0 и 1 таймер-счётчик
	TCCR0 |= (1<<CS01); //Запуск 0го таймера-счётчика с частотоой деления f МК на 8
	TIMSK |= (1<<TOIE0); //разрешить прерывание
	//TCNT0 = 0x00;
	
	TCCR1B |= (1<<CS10); //Запуск 1го таймера-счётчика без делителя
	TIMSK |= (1<<TOIE1); //разрешить прерывание
	//TCNT1 = 0x0000;
	
	//По спадающему фронту сигнала на выводе INT0 (PD2)
	MCUCR |= (1<<ISC01);
	MCUCR &= (1<<ISC00);
	GICR |= (1<<INT0); //разрешить прерывание на INT0 (PD2)
	sei();
    
    while (1) 
    {
		chislo(9578);
    }
}

