short int viewport_top = 0;
short int viewport_left = 0;
short int viewport_right = 127;
short int viewport_bottom = 63;

#include <avr/io.h> 
#include <avr/interrupt.h>
#include "ks0108.h"
#include <util/delay.h>
#include "avrlcd.h"

#include "avrlcd_fonts.h"
#include "avrlcd_ctrls.h"
#include "font.h"


int b=1;			//
int krok=10;		//
int smer;			//		konstatny a pomocné proměnné
int x=60;			//
int y=30;			//



int main( void )
{

DDRA = 0xff;				//
DDRD = 0xff;				//nastavení portů
DDRB = 0xf0;				//


TCCR1B = 0b000000100; 		//nastavení předděličky čítače1/časovače1
TIMSK = 0b00000100;			//povolení přerusení čítače1/časovače1


ks0108ClearScreen();	// vymazání LCD
ks0108SetReset(1);		// Reset LCD
_delay_ms(1000);				// Čekám než LCD "naběhne:"
ks0108Init(NON_INVERTED);	// Inicializace LCD	

current_font=font13;		//nastavení písma


draw_text(40,5, 80, 20, "PACMAN", DT_NORMAL);				//
circle(60, 30, 10, BLACK);									//
triangle(60, 30, 60+10, 30+3, 60+10, 30-3, BLACK);			//zobrazení úvodní obrazovky
draw_text(34,50, 90, 20, "press any key", DT_NORMAL);		//


while (b==1)						//čekaní na stisk tlačítka pro spuštění hry
	{

	PORTB=0b00000000;																			//výběr řádků maticové klávecnice

	if (bit_is_clear(PINB,0)^bit_is_clear(PINB,1)^bit_is_clear(PINB,2)^bit_is_clear(PINB,3)) 	//testování stisku tlačítek
		{
		b=0;						
		}
		
	}

_delay_ms(5000);





smer=0;									// počátetční směr pohybu
ks0108ClearScreen();					// vymazání displeje

circle(20 , 10, 2, BLACK);				
circle(40 , 30, 2, BLACK);				
circle(110, 30, 2, BLACK);				
circle(80 , 10, 2, BLACK);				
circle(70 , 30, 2, BLACK);				// vykreslení bodů
circle(90 , 40, 2, BLACK);	
circle(60 , 20, 2, BLACK);
circle(110, 50, 2, BLACK);
circle(30 , 50, 2, BLACK);
circle(10 , 40, 2, BLACK);





circle(x, y, 10, BLACK);							//
triangle(x, y, x+10, y+3, x+10, y-3, BLACK);		//   výchozí pozice pacmana



sei();												// povolení globálního přerušení

//-----------------------------------------------------------------------------------------------------------------


while( 1 )											// nekonečná smyčka pro testování stisku tlačítek
			{

		PORTB=0b01110000;							// výběř 1. řádku
		_delay_ms (30);

			if (bit_is_clear(PINB,2))				// testování stisku příslušného tlačítka (4)
					{

					
					circle(x, y, 10, WHITE);						//
					_delay_ms (5);
					triangle(x, y, x-10, y+3, x-10, y-3, WHITE);	//
					_delay_ms (5);
					triangle(x, y, x+3, y+10, x-3, y+10, WHITE);	// překreslení (vymazání) pacmana pro všechny možné směry pohybu
					_delay_ms (5);
					triangle(x, y, x+3, y-10, x-3, y-10, WHITE);	//
					_delay_ms (5);
					triangle(x, y, x+10, y+3, x+10, y-3, WHITE);	//

					_delay_ms (10);
					circle(x, y, 10, BLACK);						// 
					triangle(x, y, x-10, y+3, x-10, y-3, BLACK);	// vykreslení pacmana pro danný směr (vlevo)
					
					smer=1;											// nastavení směru (vlevo)
					}


		PORTB=0b10110000;							// výběř 2. řádku
		_delay_ms (30);

			if (bit_is_clear(PINB,2))				// testování stisku příslušného tlačítka (5)
					{
					
					
					circle(x, y, 10, WHITE);						//
					_delay_ms (5);
					triangle(x, y, x-10, y+3, x-10, y-3, WHITE);	//
					_delay_ms (5);
					triangle(x, y, x+3, y+10, x-3, y+10, WHITE);	// překreslení (vymazání) pacmana pro všechny možné směry pohybu
					_delay_ms (5);
					triangle(x, y, x+3, y-10, x-3, y-10, WHITE);	//
					_delay_ms (5);
					triangle(x, y, x+10, y+3, x+10, y-3, WHITE);	//

					_delay_ms (10);
					circle(x, y, 10, BLACK);						//
					triangle(x, y, x+3, y+10, x-3, y+10, BLACK);	// vykreslení pacmana pro danný směr (dolu)
					
					smer=2;											// nastavení směru (dolů)
					}

			if (bit_is_clear(PINB,3))				// testování stisku příslušného tlačítka (2)
					{
					
					
					circle(x, y, 10, WHITE);						//
					_delay_ms (5);
					triangle(x, y, x-10, y+3, x-10, y-3, WHITE);	//
					_delay_ms (5);
					triangle(x, y, x+3, y+10, x-3, y+10, WHITE);	// překreslení (vymazání) pacmana pro všechny možné směry pohybu
					_delay_ms (5);
					triangle(x, y, x+3, y-10, x-3, y-10, WHITE);	//
					_delay_ms (5);
					triangle(x, y, x+10, y+3, x+10, y-3, WHITE);	//

					_delay_ms (10);
					circle(x, y, 10, BLACK);						//
					triangle(x, y, x+3, y-10, x-3, y-10, BLACK);	// vykreslení pacmana pro danný směr (nahoru)
					
					smer=3;											// nastavení směru (nahoru)				
					}


			
		PORTB=0b11010000;							// výběř 3. řádku
		_delay_ms (30);

			if (bit_is_clear(PINB,2))				// testování stisku příslušného tlačítka (6)
					{

					
					circle(x, y, 10, WHITE);						//
					_delay_ms (5);
					triangle(x, y, x-10, y+3, x-10, y-3, WHITE);	//
					_delay_ms (5);
					triangle(x, y, x+3, y+10, x-3, y+10, WHITE);	// překreslení (vymazání) pacmana pro všechny možné směry pohybu
					_delay_ms (5);
					triangle(x, y, x+3, y-10, x-3, y-10, WHITE);	//
					_delay_ms (5);
					triangle(x, y, x+10, y+3, x+10, y-3, WHITE);	//

					_delay_ms (10);
					circle(x, y, 10, BLACK);						// 
					triangle(x, y, x+10, y+3, x+10, y-3, BLACK);	// vykreslení pacmana pro danný směr (vpravo)
					
					smer=0;											// nastavení směru (vpravo)	
					}
			}


	
		


		
		 
}

//---------------------------------------------------------------------------------------------------- Preruseni


ISR( TIMER1_OVF_vect )					// přerušení při přetečení časovače1/čítače1
{
	
	

				

			if (smer==1)													// testování směru pohybu
					{
					if (x>10) 												// testování levého okraje obrazovky
						{
						x=x-krok;											// dekrementace kroku ve směru x (phyb směrem vlevo)


						
						circle(x, y, 2, WHITE);								// překreslení (vymazání) sebraného bodu

						circle(x+krok, y, 10, WHITE);									//
						triangle(x+krok, y, x-10+krok, y+3, x-10+krok, y-3, WHITE);		// překreslení (vymazání) pacmana v daném směru pro předchozí krok
						

						circle(x, y, 10, BLACK);							//
						triangle(x, y, x-10, y+3, x-10, y-3, BLACK);		// vykreslení pacmana se změněným krokem v daném směru
						}	
					}

	
			if (smer==2)													// testování směru pohybu
					{
					if (y<50) 												// testování spodního okraje obrazovky
						{
						y=y+krok;											// inkrementace kroku ve směru y (pohym směrem dolu)


						
						circle(x, y, 2, WHITE);								// překreslení (vymazání) sebraného bodu

						circle(x, y-krok, 10, WHITE);									//
						triangle(x, y-krok, x+3, y+10-krok, x-3, y+10-krok, WHITE);		// překreslení (vymazání) pacmana v daném směru pro předchozí krok
						

						circle(x, y, 10, BLACK);							//
						triangle(x, y, x+3, y+10, x-3, y+10, BLACK);		// vykreslení pacmana se změněným krokem v daném směru
						}
		  			}


	
			if (smer==3)													// testování směru pohybu
					{				
					if (y>10) 												// testování horního okraje obrazovky
						{
						y=y-krok;											// dekrementace kroku ve směru y (pohym směrem nahoru)


						
						circle(x, y, 2, WHITE);								// překreslení (vymazání) sebraného bodu

						circle(x, y+krok, 10, WHITE);									//
						triangle(x, y+krok, x+3, y-10+krok, x-3, y-10+krok, WHITE);		// překreslení (vymazání) pacmana v daném směru pro předchozí krok
					
						circle(x, y, 10, BLACK);							//
						triangle(x, y, x+3, y-10, x-3, y-10, BLACK);		// vykreslení pacmana se změněným krokem v daném směru
						}
					}


	
			if (smer==0)													// testování směru pohybu
					{
					if (x<110)												// testování spodního okraje obrazovky
						{
						x=x+krok;											// inkrementace kroku ve směru x (pohyb směrem vpravo)


					
						circle(x, y, 2, WHITE);								// překreslení (vymazání) sebraného bodu

						circle(x-krok, y, 10, WHITE);									//
						triangle(x-krok, y, x+10-krok, y+3, x+10-krok, y-3, WHITE);		// překreslení (vymazání) pacmana v daném směru pro předchozí krok

						circle(x, y, 10, BLACK);							//
						triangle(x, y, x+10, y+3, x+10, y-3, BLACK);		// vykreslení pacmana se změněným krokem v daném směru
						}
					}
			
		
}

