//*******Knihovna pro sedmisegmentovku********//

#include <util/delay.h>


//anody
#define PORTanoda4	PORTC
#define DDRanoda4	DDRC
#define	anoda4		2
#define	anoda4_bin		4//0b00000100 //2^anoda1

#define PORTanoda3	PORTC
#define DDRanoda3	DDRC
#define	anoda3		3
#define	anoda3_bin		8//0b00010000 //2^anoda2

#define PORTanoda2	PORTC
#define DDRanoda2	DDRC
#define	anoda2		4
#define	anoda2_bin		16//0b00001000 //2^anoda3

#define PORTanoda1	PORTC
#define DDRanoda1	DDRC
#define	anoda1		5
#define	anoda1_bin		32//0b00100000 //2^anoda4


//katody
#define PORTkatody	PORTB
#define DDRkatody	DDRB

#define segmentA		1
#define A		2//0b00000001 //2^segmentA
#define segmentB		5
#define B		32//0b00000010 //2^segmentB
#define segmentC		2
#define C		4//0b00000100 //2^segmentC
#define segmentD		4
#define D		16//0b00001000 //2^segmentD
#define segmentE		3
#define E		8//0b00010000 //2^segmentE
#define segmentF		0
#define F		1//0b00100000 //2^segmentF
#define segmentG		6
#define G		64//0b01000000 //2^segmentG
#define segmentDP		7
#define DP		128//0b10000000 //2^segmentB


void LEDdisplay_init(void)//inicializace
{
	PORTanoda1 &= ~(anoda1_bin);
	PORTanoda2 &= ~(anoda2_bin);
	PORTanoda3 &= ~(anoda3_bin);
	PORTanoda4 &= ~(anoda4_bin);

	DDRanoda1 |= (anoda1_bin);
	DDRanoda2 |= (anoda2_bin);
	DDRanoda3 |= (anoda3_bin);
	DDRanoda4 |= (anoda4_bin);

	PORTkatody = 0xFF;
	DDRkatody = 0xFF;
}

char dekoduj(unsigned char hodnota)//dekódování hodnoty
{
	switch(hodnota)
	{
		case 0: hodnota =	A | B | C | D | E | F		;break;
		case 1: hodnota =	B | C						;break;
		case 2: hodnota =	A | B | D | E | G			;break;
		case 3: hodnota =	A | B | C | D | G			;break;
		case 4: hodnota =	B | C | F | G				;break;
		case 5: hodnota =	A | C | D | F | G			;break;
		case 6: hodnota =	A | C | D | E | F | G		;break;
		case 7: hodnota =	A | B | C					;break;
		case 8: hodnota =	A | B | C | D | E | F | G	;break;
		case 9: hodnota =	A | B | C | D | F | G		;break;

		case '0': hodnota =	A | B | C | D | E | F		;break;
		case '1': hodnota =	B | C						;break;
		case '2': hodnota =	A | B | D | E | G			;break;
		case '3': hodnota =	A | B | C | D | G			;break;
		case '4': hodnota =	B | C | F | G				;break;
		case '5': hodnota =	A | C | D | F | G			;break;
		case '6': hodnota =	A | C | D | E | F | G		;break;
		case '7': hodnota =	A | B | C					;break;
		case '8': hodnota =	A | B | C | D | E | F | G	;break;
		case '9': hodnota =	A | B | C | D | F | G		;break;
		case 'A': hodnota =	A | B | C | E | F | G		;break;
		case 'b': hodnota =	C | D | E | F | G			;break;
		case 'C': hodnota =	A | D | E | F				;break;
		case 'c': hodnota = D | E | G					;break;
		case 'd': hodnota =	B | C | D | E | G			;break;
		case 'E': hodnota =	A | D | E | F | G			;break;
		case 'F': hodnota =	A | E | F | G				;break;
		case 'G': hodnota =	A | C | D | E | F | G		;break;
		case 'H': hodnota =	B | C | E | F | G			;break;
		case 'l':
		case 'I': hodnota =	B | C						;break;
		case 'i': hodnota =	E							;break;//zarovnáno nalevo (C pro zarovnání napravo)
		case 'J': hodnota =	A | B | C | D | E			;break;
		case 'L': hodnota =	D | E | F					;break;
		case 'n': hodnota =	C | E | G					;break;
		case 'O': hodnota =	A | B | C | D | E | F		;break;
		case 'o': hodnota =	C | D | E | G				;break;
		case 'P': hodnota =	A | B | E | F | G			;break;
		case 'r': hodnota =	E | G						;break;
		case 'S': hodnota =	A | C | D | F | G			;break;
		case 't': hodnota =	D | E | F | G				;break;
		case 'u': hodnota =	C | D | E					;break;
		case 'U': hodnota =	B | C | D | E | F			;break;
		case 'Y': hodnota =	B | C | D | F | G			;break;
		case '°': hodnota =	A | B | F | G				;break;
		case '´': hodnota = F							;break;
		case 39 : hodnota =	B							;break;// '
		case '_': hodnota =	D							;break;
		case '-': hodnota =	G							;break;
		case '|': hodnota =	E | F						;break;
		case '/': hodnota =	B | E | G					;break;
		case 92 : hodnota =	C | F | G					;break;// '\'
		case '(':
		case '[': hodnota =	A | D | E | F				;break;
		case ')':
		case ']': hodnota =	A | B | C | D				;break;
		case '.': hodnota =	DP							;break;
		case ' ': hodnota = 0							;break;
		default: hodnota =	G							;break;
	}

	return hodnota;
}

void zobraz_cifru(unsigned char hodnota, unsigned char cifra, unsigned char tecka)
{
	if(tecka)
		PORTkatody = ~(hodnota | DP);
	else
		PORTkatody = ~(hodnota);
	
	switch(cifra)
	{
		case 1: PORTanoda1 |= anoda1_bin; 
				_delay_us(prodleva_blik_us); 
				PORTanoda1 &= ~(anoda1_bin);break;

		case 2: PORTanoda2 |= anoda2_bin; 
				_delay_us(prodleva_blik_us); 
				PORTanoda2 &= ~(anoda2_bin);break;

		case 3: PORTanoda3 |= anoda3_bin; 
				_delay_us(prodleva_blik_us); 
				PORTanoda3 &= ~(anoda3_bin);break;

		case 4: PORTanoda4 |= anoda4_bin; 
				_delay_us(prodleva_blik_us); 
				PORTanoda4 &= ~(anoda4_bin);break;
	}
}

void zobraz_cislo(unsigned int cislo)
{
	unsigned char znak;

	znak = cislo%10;
	zobraz_cifru(dekoduj(znak), 1, 0); 

	znak = (cislo/10)%10;
	zobraz_cifru(dekoduj(znak), 2, 0);
	
	znak = (cislo/100)%10;
	if(PINC&0b00000001)
	{
		if(cislo>=1000 || znak!=0)
			zobraz_cifru(dekoduj(znak), 3, 0);
	}
	else
		zobraz_cifru(dekoduj(znak), 3, 0);

	znak = (cislo/1000)%10;
	if(PINC&0b00000001) 
	{
		if(znak!=0)
			zobraz_cifru(dekoduj(znak), 4, 0);
	}	
	else
		zobraz_cifru(dekoduj(znak), 4, 1);
	
}

void zobraz_znaky(unsigned char znak4, unsigned char znak3, unsigned char znak2, unsigned char znak1)
{
	zobraz_cifru(dekoduj(znak1), 1, 0); 
	zobraz_cifru(dekoduj(znak2), 2, 0);
	zobraz_cifru(dekoduj(znak3), 3, 0); 
	zobraz_cifru(dekoduj(znak4), 4, 0); 
}

void zobraz_znaky2(char znak[5])
{
	zobraz_cifru(dekoduj(znak[0]), 4, 0);
	zobraz_cifru(dekoduj(znak[1]), 3, 0); 
	zobraz_cifru(dekoduj(znak[2]), 2, 0);

	if(znak[4]=='.')
		zobraz_cifru(dekoduj(znak[3]), 1, 1);
	else
		zobraz_cifru(dekoduj(znak[3]), 1, 0); 
}
