// FCPU = 8.000.000 MHz
// CPU: ATMEGA8-PU

//	PD0	- Shift clock pulse SCP
//	PD1	- Enable data row and latch pulse LP
// 	PD2	- DATA IN Horizontal row FR
//	PD3	- DATA IN Vertical line

// Minden bemenet lefuto elre aktiv
// SCP --> Lepteti a DATA bemenetet [1..240]
// LP ---> Sorvaltas [1..64]
// FR ---> Uj kep


#include <avr/io.h>

#define SCP	0x01
#define LP	0x02	// orajel lefuto elnel olvas
#define FR	0x40	// uj kep
#define DATA	0x80	// keppont

#define SET_FR()	{PORTD |= FR;}
#define CLR_FR()	{PORTD &= ~FR;}

#define SET_LP()	{PORTD |= LP;}
#define CLR_LP()	{PORTD &= ~LP;}

#define SET_SCP()	{PORTD |= SCP;}
#define CLR_SCP()	{PORTD &= ~SCP;}

#define SET_DATA()	{PORTD |= DATA;}
#define CLR_DATA()	{PORTD &= ~DATA;}

#define SET_LED()	{PORTB |= (1<<PB0);}	// A bitek beallitasara ez a modszer fentebb nem mukodik 
#define CLR_LED()	{PORTB &= ~(1<<PB0);}	// Nem ertem miert, de majd rajovok.

#define LP_DELAY	1
#define SCP_DELAY	1

#define _delay(adelay) {for (unsigned long i=1; i<adelay; i++){	__asm__ ( "nop" );	}}

char fr_state = 1;

void toggle_fr(void)
{	
		fr_state ^= 1;
		if (fr_state)
	 		SET_FR()
		else
	 		CLR_FR();
}

#define pulse_lp() {	SET_LP();_delay(LP_DELAY);CLR_LP();}
#define pulse_scp() {	SET_SCP();_delay(SCP_DELAY);CLR_SCP();}



int main(void)
{
	DDRD = 0xff;	// Csak kimenetek vannak
	PORTD = 0x00;	// Minden bit magasban
	DDRB = 0xff;
	PORTB = 0x00;
	
	while (1)
	{
	for (int j=1;j<65;j++)
	{
	 for (int i=1; i<65; i++)	// valtas a kovetkezo sorra
	 {
	 	for (int k=1; k<241; k++)	// egy sor feltoltese
	 	{
	 		SET_SCP();	// SCP fel
	 			if ((k==10) || (k==30) || (k==70) || (k==130))
	 				SET_DATA()
 				else
 					CLR_DATA();
			_delay(SCP_DELAY);
			CLR_SCP();	// SCP le
			if (k==1)	// Minden elso SCP-nel kuldunk LP-t is
			{
				SET_LP();
				_delay(LP_DELAY);
				CLR_LP();
			}
	 	}
//	 	if (i==1)	// minden elso LP utan kuldunk egy FR-t is. Ez gyanus azert egy kicsit!
	 	{
	 		toggle_fr();
	 	}
	 }
	 }
	}
	
	
	return 0;
}
