
#define	F_CPU	8000000			// Órajel frekvencia, akkor szüksédes az időzítéshez ha AtmelStudiot használsz.
#include	<util/delay.h>		// Szintén Atmelstudio-ban az időzítéshez szükséges.
#include	<avr/io.h>			// Az AVR portjait tartalmazza.

//
// Ezeket a define-okat úgy állítod be, ahogy neked szükséges, én csak találomra belőttem őket a CPORT-ra.
//
#define CONTROL_DDR		DDRC	// Ezell a regiszterrel állítod be a vezérlőlábak irányát.
#define	DATA_DDR		DDRC1	// Ezzel a dittel állítod be a CPORT 1-es lábát be vagy kimenetnek.
#define	CK_DDR			DDRC2	// Ezzel a dittel állítod be a CPORT 2-es lábát be vagy kimenetnek.
#define	ST_DDR			DDRC3	// Ezzel a dittel állítod be a CPORT 3-as lábát be vagy kimenetnek.
#define	CONTROL_PORT	PORTC	// Ezen a porton helyezkednek el a vezétlő lábak.
#define	DATA_PIN		PC1		// A CPORT 1-es lába az adat láb.
#define	CK_PIN			PC2		// A CPORT 2-es lába az órajel.
#define	ST_PIN			PC3		// A CPORT 3-as lába a nyugtázó.

//
// Ezek a szükséges függvények.
//
void SwitchControlInit(void);		// Ezzel a függvénnyel inicializálod a portokat (az előtt hívd meg a saját kódodban hogy használnád a többi függvényt).
void Clock(void);					// Ez a függvény generálja az órajelet.
void SwitchControl(uint16_t data);	// Ez a függvény hajtja a vezérlő lábakat. Bemenete a szükséges küldendő adat.

//
// Itt írom le az inicializáló függvényt.
//
void SwitchControlInit(void)
{
	CONTROL_DDR |= (1 << DATA_DDR)	// Az adat láb kimenet.
				|  (1 << CK_DDR)	// Az órajel láb kimenet.
				|  (1 << ST_DDR);	// A nyugtázó láb kimenet.
}

//
// It írom le az Órajel adó függvényt.
//
void Clock(void)
{
	_delay_us(5);						// 5 us késleltetés.
	CONTROL_PORT |= (1 << CK_PIN);		// CK láb magas szintre.
	_delay_us(5);						// 5 us késleltetés.
	CONTROL_PORT &= ~(1 << CK_PIN);		// CK láb alacsony szintre.
	_delay_us(5);						// 5 us késleltetés.
}

//
// Itt írom le a kimeneteket vezérlő függvényt.
//
// Az adat a következő képpen épül fel bitenkén ha binárisan írod be:
// 0b(SW1)(SW2)(SW3)(SW4)(SW5)(SW6)(SW7)(SW8)(CHR)(CHL)(C0)(C1)(C2)(C3)00  (Az otolsó két bit mindíg nulla.)
// Tehát ha ezt hívod meg a sajáz main kódodban:
// SwitchControl(0b1000000010000000);
// Akkor az egyes kapcsolót bekapcsolod a jobb csatornán és az IC típusa TC9162AN.
//
void SwitchControl(uint16_t data)
{
	for(uint8_t i=0; i<14; i++)	// Ebben a ciklusban kiküldjük a 14 adatbitet. 
	{
		if(data & 0x8000)		// Megvizsgálom hogy az adat és a 0b1000000000000000 bintenkénti és kapcsolata igaz-e, azaz hogy a legfelső bit 1-es-e.
		{
			CONTROL_PORT |= (1 << DATA_PIN);	// Ha igen akkor az datbitet magas szintűre állítjuk.
			Clock();							// és adunk egy órajelet.
		}
		else
		{
			CONTROL_PORT &= ~(1 << DATA_PIN);	// Ha nem akkor alacsony szintűre állítom az adat lábat,
			Clock();							// majd adok egy órajelet.
		}
		data = (data << 1);		// Etután balra forgatom az adatot, így már felülröl a második bitetet vizagálom.
	}
	
	CONTROL_PORT |= (1 << ST_PIN);	// Ha végetért az adatbitek kiküldése, akkor küldünk egy nyubtázó impulzust, ilyenkot kapcsolnak a kapcsolók.
	_delay_us(5);
	CONTROL_PORT &= ~(1 << ST_PIN);
}