/* riaszto -main.c */

#include <inttypes.h>
#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom8.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <compat/deprecated.h>


#define Be	1
#define Ki	0

#define  OSCB  20;              // Oszcillator bazis frekvencia


#define VeryShortWait	20
#define ShortWait	200
#define LongWait	1000
#define LED		5

#define LCDPORT	PORTD
#define LCD_D3	0
#define LCD_D2	1
#define LCD_D1	2
#define LCD_D0	3
#define LCD_M	4
#define LCD_XCK	5
#define LCD_LP	6
#define LCD_FR	7

#define szorzo	1

unsigned char status=0;
unsigned char ertek=0;

 
unsigned cnt0=0;                 // Idozito szamlalok
unsigned cnt1=0;
unsigned cnt2=0;
unsigned cnt3=0;
unsigned cnt4=0;
unsigned cnt5=0;
unsigned cnto=OSCB;
unsigned char osc=0;             // Oszcillator bit

static volatile unsigned int LedWait = ShortWait;
void delay_1ms(unsigned int time);

void  timinit(void);             // Timer inicializalo rutin
void put_data(unsigned char adata);		// Cp2, data shift
void start_new_line(void);	// CP1, LP, data latch
void start_frame(void);		// S, FR, frame start

void sLP(void);
void cLP(void);
void sXCK(void);
void cXCK(void);
void sFR(void);
void cFR(void);

void  timinit(void)              // Timer inicializalasa
  {
  sbi(TCCR1B,WGM12);              //Timer/Counter1 Control Register A: CTC mode  (135.o)
  cbi(TCCR1B,CS12);               //Timer/Counter1 Control Register B: clk/1 (139.o)
  cbi(TCCR1B,CS11);
  sbi(TCCR1B,CS10);
  OCR1A=10000;                    // 10MHz 10000 1ms
  sbi(TIMSK,OCIE1A);             //Interrupt mask register:Output Compare A Match Interrupt Enable(142.o)
  cnto=2;
  }
 
ISR (TIMER1_COMPA_vect)          //Timer1 Compare Match A Interrupt Vector
{
 
  if(cnt0)  cnt0--;              // Ha a szamlalo erteke nem null, akkor 
  if(cnt1)  cnt1--;              // csokkentjuk. 
  if(cnt2)  cnt2--;              // Ha nulla, akkor lejart az ido
  if(cnt3)  cnt3--;
  if(cnt4)  cnt4--;
  if(cnt5)  cnt5--;
 
  cnto--;                        // Oszcillator szekcio
  if(cnto==0)                    // Lejart-e az ido?   
    {
    osc^=1;                      // Az oszcillator bitet invertalja
    cnto=OSCB;                   // Ujra toltjuk az oszcillator szamlalojat
		if(osc) sbi(PORTD,LCD_M);             // Ha a osc igaz, bekapcsolja a LCD_M-et 
    else    cbi(PORTD,LCD_M);             // Ha nem kikapcsolja
    }
}    
 


void delay_1ms(unsigned int time)
{
 	while (time--)
	{
  	  _delay_ms(1);
	}
}




void setup_data(unsigned char aertek)
{
	aertek &= 0x0f;	// felso negy bit eltunik
	status &= 0xf0; // kinullazzuk status also negy bitjet
	status |= aertek;	// hozza VAGY-oljuk 
}

// Csak az adatot kirakjuk a portra
void put_data(unsigned char adata)
{
	adata &= 0x0f;	// Csak az also bitjei kellenek
	status &= 0xf0;	// Also bitjeit toroljuk
	status |= adata;	// statushoz VAGY-oljuk az adatot
	LCDPORT = status;
}



int main(void)
{
    /* INITIALIZE */
	timinit ();

	DDRD = 0B11111111;	// PortD minden bitje kimenet
	status = 0;
	LCDPORT = status;
	
	sei();
	

	while (1)
	{
		ertek = 0x0;
		cbi(status, LCD_FR);
		LCDPORT = status;
		_delay_us(10*szorzo);
		sbi(status, LCD_FR);
		LCDPORT = status;
		_delay_us(10*szorzo);
		
		for (int lp=0; lp<10; lp++)
		{
			sbi(status,LCD_LP);	// uj frame indul
			LCDPORT=status;
			_delay_us(10*szorzo);
		
			cbi(status,LCD_LP);
			for (int xck=0; xck<10; xck++)
			{
				sbi(status,LCD_XCK);// felfuto el, hogy legyen minek lefutni
				LCDPORT=status;
				put_data(ertek);	// adatot kitesszuk
				_delay_us(10*szorzo);
		
				cbi(status,LCD_XCK);
				LCDPORT=status;		// most ervenyesitette az adatot
				_delay_us(10*szorzo);
			}
		}
		

	}
	
	
	return 0;
}

