/* riaszto -main.c */

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


#define Be	1
#define Ki	0

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

#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_SP	5
#define LCD_LP	6
#define LCD_S	7

#define szorzo	1

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

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

void enable(void);			// M, enable
void disable(void);			// M, disable
void put_data(void);		// Cp2, data shift
void start_new_line(void);	// CP1, LP, data latch
void start_frame(void);		// S, FR, frame start


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

void refresh(void)
{
	cbi(status, LCD_M);
	LCDPORT = status;
	sbi(status, LCD_M);
	LCDPORT = status;
}

// Kep megjelenites kezdete
void enable()
{
	sbi(status, LCD_M);
	LCDPORT = status;
//	delay_1ms(szorzo*1);
}

void disable()
{
	cbi(status, LCD_M);
	LCDPORT = status;
//	delay_1ms(szorzo*1);
}


// Sor megjelenites kezdete
void start_new_line()
{
	sbi(status, LCD_LP);
	LCDPORT = status;
	_delay_us(szorzo*1);
	cbi(status, LCD_LP);
	LCDPORT = status;
	_delay_us(szorzo*1);
}

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

void put_data()
{
	sbi(status, LCD_SP);
	LCDPORT = status;

	cbi(status, LCD_SP);
	LCDPORT = status;
}

void start_frame()
{
	cbi(status, LCD_S);
	LCDPORT = status;
	delay_1ms(szorzo*1);
	sbi(status, LCD_S);
	LCDPORT = status;
	delay_1ms(szorzo*1);
}

int main(void)
{

          /* INITIALIZE */

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

	disable();
	while (1)
	{

		ertek = 1;

		start_frame();
		delay_1ms(szorzo*1);
		for (int sorok=0;sorok<10;sorok++)
		{
			disable();
			start_new_line();
			enable();
			//delay_1ms(szorzo*1);
			for (int oszlopok=0;oszlopok<40;oszlopok++)
			{
				setup_data(ertek);
				put_data();
			}
		}
	}
	
	
	return 0;
}

