REKLAMA

zabber.zip

Żabber, czyli przenośna gra na AVR (konkurs)

Jaki wykorzystałaś kompilator ? Avr-gcc, jeśli chodzi o IDE to Eclipse (pod ubuntu). Co było najtrudniejszym/najbardziej czasochłonnym/problematycznym elementem kodu ? Biorąc pod uwagę, że gra jakąś grafikę ma, to największym problemem była dostępna pamięć - cały ekran grafiki to 2,5 kb, czyli ~30% całości. Nie obeszło się więc bez okrajania plansz typu game over, itd. Stricte od strony kodu dużo uwagi wymagał system kolizji, i płynne przesuwanie autek "poza ekran", oczywiście tak, aby nie trzeba było osobnych rysunków na obcięte pojazdy. AVRy uczą oszczędności :). Fusebity dokładnie takie. 7.02.2012 - dorzucam wszystkie pliki źródłowe.


Pobierz plik - link do postu
  • zabber.zip
    • main.h
    • winrar.h
    • zabber.hex
    • odautorki.txt
    • lcd.c
    • napis.h
    • hello_img.h
    • lcd.h
    • zab.h
    • main.c


zabber.zip > winrar.h

0x60,0x7e,0x43,0x45,0x47,0x43,0x63,0xf8,0xa8,0xb8,0x80,0x18,0x70,0xc0,0x38,0x1c,
0x74,0x54,0x5c,0x40,0xff,0x80,0x00,0x00,0x1e,0x30,0x30,0x1e,0x00,0xfc,0x24,0x3c,
0x00,0x3c,0x04,0x3c,0x04,0x38,0x00,0x00,0x26,0x32,0x2a,0x26,0x00,0x3e,0x22,0x22,
0x3e,0x00,0x3e,0x00,0x3e,0x00,0x00,0x00,


zabber.zip > odautorki.txt

Czytasz plik dolaczony do kodu gry zabber na atmege8.

Biblioteki do obslugi lcd zerzniete z http://hobby.abxyz.bplaced.net/. Grafiki robione, i zapisywane jako *.h w Micro LCD Bitmap Editor ze wspomnianej strony.

Nie mam zamiaru grzebac juz przy tym projekcie, takze uwagi sa zbyteczne, ale jezeli cos poprawisz / zrobisz na jego bazie cos nowego, to daj znac.

Wiecej na forum Elektrody, a kiedys moze na http://bzzt-bzzt.blogspot.com/.


zabber.zip > zab.h

0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x04,0x04,0x44,0xcc,0x40,0x00,0x10,0xf0,0x20,
0x10,0x10,0x00,0x00,0xa0,0x50,0x50,0x50,0xe0,0x00,0x10,0xf8,0x10,0x10,0x10,0x80,
0x00,0x10,0xf0,0x00,0x00,0x90,0xf0,0x00,0x00,0x00,0x04,0xfc,0x00,0x00,0x00,0x00,
0xa0,0x50,0x50,0x50,0xe0,0x00,0x00,0xe0,0x10,0x10,0x10,0x30,0x00,0x00,0x10,0x10,
0x14,0xf0,0x00,0x00,0x00,0xe0,0x50,0x50,0x50,0x60,0x00,0x00,0x00,0x00,0x7c,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,
0x00,0x01,0xc1,0x01,0x01,0xe0,0x18,0xe0,0x01,0x81,0x61,0x81,0x01,0x01,0x00,0x00,
0xc1,0x21,0xc1,0x58,0x24,0x24,0x88,0x11,0x91,0x10,0x09,0x25,0x24,0x05,0x19,0xd1,
0x61,0x41,0x80,0x00,0x01,0x81,0x41,0x41,0x41,0x81,0x00,0x00,0x01,0x01,0x81,0x61,
0x80,0x00,0x04,0x04,0x04,0x03,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,
0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,
0x08,0x08,0x04,0x04,0x04,0x1f,0xe0,0x9f,0x04,0x0f,0xf0,0x0f,0x04,0xcf,0x70,0x0f,
0x04,0x04,0x04,0x04,0x05,0x7a,0x85,0x02,0x02,0x02,0x02,0x02,0x02,0x1e,0x22,0x2e,
0x22,0x22,0x22,0x1d,0x00,0x86,0x79,0x2e,0x11,0x88,0x44,0xa0,0x10,0x0f,0x04,0x04,
0x04,0x04,0x3f,0xc0,0x3f,0x7c,0x83,0x7c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
0x04,0x04,0x0c,0x08,0x08,0x08,0x08,0x08,0x18,0x10,0x10,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x40,0xc0,0x40,0x00,0x40,0xc0,0x40,0x03,0x0e,0x08,0x1f,0x10,
0x1e,0x03,0x00,0x3e,0x62,0x43,0x4d,0x4b,0x49,0x45,0x44,0xc5,0x45,0x5a,0x52,0x4e,
0x5a,0x46,0x4a,0x4e,0x52,0x4e,0x4a,0x47,0x41,0x42,0x5c,0x50,0x49,0x71,0x82,0xfa,
0x43,0x7d,0x63,0x3e,0x00,0x00,0x3e,0x43,0xc0,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xa0,0xa0,0xa0,0x1f,0x00,0x00,
0x21,0x3f,0x22,0x21,0x21,0x00,0x00,0x1a,0x25,0x25,0x25,0x3e,0x20,0x00,0x01,0x9f,
0x21,0x21,0x21,0x10,0x00,0x1e,0x21,0x21,0x21,0x1e,0x80,0x81,0x1f,0x21,0x1c,0x21,
0x1f,0x01,0x00,0x1a,0x25,0x25,0x25,0x3e,0x20,0x00,0x28,0xa4,0x3f,0x22,0x21,0x00,
0x00,0x1e,0x25,0x25,0x25,0x26,0x00,0x00,0x32,0x25,0x25,0x25,0x1b,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x46,0x43,0x89,0x8b,0x94,0x98,
0x9e,0xa1,0xc3,0x4e,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x66,0x52,0x4a,0x46,0x62,0x00,0x00,0x34,0x4a,0x4a,0x4a,0x7c,0x40,0x40,0x7f,
0x44,0x42,0x42,0x3c,0x00,0x02,0x06,0x1a,0xe0,0x32,0x0e,0x02,0x00,0x00,0x00,0x4f,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x2a,0x46,0x82,0x3c,
0xe0,0x60,0x50,0xd0,0x48,0x68,0x58,0x88


zabber.zip > main.c

/*
* Zabber - atmega8 + wyswietlacz z nokii 3310
* za kod nie biore zadnej odpowiedzialnosci ;)
* nie bedzie przeze mnie juz poprawiany
* copyleft marysia 2011
*/

#include & lt; avr/io.h & gt;
#define F_CPU 1000000UL
#include & lt; avr/pgmspace.h & gt;

//grafiki

unsigned char hello_img[] PROGMEM = { //sprite'y zab i autek
#include " hello_img.h "
};

unsigned char napis[] PROGMEM = { //zabber, ekran tytulowy
#include " napis.h "
};

unsigned char winrar[] PROGMEM = { //napisy, podpisy
#include " winrar.h "
};

unsigned char zab[] PROGMEM = { //ekran koncowy
#include " zab.h "
};

// srednio wdzieczne rozwiazanie - mnostwo zmiennych globalnych

volatile unsigned char x,y, justwon; //pozycja zaby i zmienna wygranej
volatile uint8_t zabflaga, flaga; //2 flagi sprite'a zabki
volatile uint8_t ileaut, licz, predlicz, zyc; //ilosc autek w rzedzie, licznik zab na mecie, wskaznik predkosci, ilosc zyc gracza
volatile uint8_t count[4], acount[2],top[4]; //liczniki dla guzikow, dla autek, stan mety - ktore listki sa juz zajete
volatile int8_t rzad1[4], rzad2[4], rzad3[4],rzad4[4]; //wspolrzedne x autek z kolejnych rzedow
volatile uint16_t tabpred[4]; //predkosci poziomow

#include " lcd.h "
#include " main.h "

int main(void)
{
lcd_init();

DDRD = 0x00; //C to input, guziki: 2lew 3praw 4gora 5dol
PORTD = 0xFF; //pull up
uint16_t cont =0; //licznik glownej petli
lcd_clear();
justwon=0;
ileaut=3; //zmienna admina :D - ile autek w kazdym rzedzie - max 4
//do testow najlepiej ustawiac 1
tabpred[0]=2500; // " predkosci " poszczegolnych poziomow - do ilu zlicza glowna petla zanim
tabpred[1]=2000;
tabpred[2]=1500;
tabpred[3]=1000;

logozab(); //ekran glowny

for (uint8_t i=0;i & lt; 4;i++) //zerowanie licznikow
{
count[i]=0;
top[i]=0;
}
acount[0]=0;
acount[1]=0;
reset(); //reset parametrow gry
plansz_reset(); //reset planszy, i wyswietlenie jej

while(1)
{
butans(); //sprawdza stan guzikow
if (flaga!=0) // jakis guzik wcisniety
{
zabflaga=flaga;
flaga=0; //usuwa flage " wcisnietego guzika "
plansza(); //generuje uaktualniona plansze
kolizja(); //sprawdza kolizje
if (y==0) y=5;
}

cont++; //licznik

if (cont==tabpred[predlicz]) //co jakis czas zalezny od poziomu gry...
{
incrautka(); //przesuwa autka
plansza(); //generuje uaktualniona plansze
kolizja(); //sprawdza kolizje
cont=0;
}
};

return 0;
}


zabber.zip > lcd.c

/*
Plik lcd.c

LCD od nokia 3310 przyklad 1.
KURS AVR-GCC www.abxyz.bplaced.net

zabber mod:
dodano funkcje
lcd_imagea
yclear
zmodyfikowano
lcd_image
*/
#include & lt; stdio.h & gt;
#include & lt; avr/io.h & gt;
#include & lt; avr/pgmspace.h & gt;
#include & lt; util/delay.h & gt;
#include " lcd.h "


// U�ycie sprz�towego interfejsu SPI
//#define ATMEGA_SPI 1


// Inicjuje wy�wietlacz
void lcd_init(void)
{
LCD_RST_CLR;

LCD_RST_SET_OUT
LCD_CLK_SET_OUT
LCD_DATA_SET_OUT
LCD_DC_SET_OUT
LCD_CE_SET_OUT

#ifdef ATMEGA_SPI
// Konfiguracja sprz�towego SPI
SPCR = (1 & lt; & lt; SPE)|(1 & lt; & lt; MSTR)|(1 & lt; & lt; SPR0);
#endif
// & lt; 30ms
_delay_ms(15);

LCD_RST_SET

LCD_CE_SET

lcd_write_byte(LCD_CMD, 0x21); // Function set - extended instruction set
lcd_write_byte(LCD_CMD, 0x13); // Bias - 1:48
lcd_write_byte(LCD_CMD, 0x06); // Temperature Control
lcd_write_byte(LCD_CMD, 0xa5); // Set Vop
lcd_write_byte(LCD_CMD, 0x20); // Function set - basic instruction set, horizontal addressing
lcd_write_byte(LCD_CMD, 0x0C); // Display control - normal mode
}




#ifndef ATMEGA_SPI
// Wysy�a do LCD jeden bajt
// c_d: LCD_DATA|LCD_CMD
void lcd_write_byte(unsigned char c_d, unsigned char data )
{
unsigned char m;

LCD_CE_CLR

if(c_d) LCD_DC_SET else LCD_DC_CLR

for(m=0x80; m; m & gt; & gt; =1)
{
if(data & m)
LCD_DATA_SET
else
LCD_DATA_CLR

LCD_CLK_SET
LCD_NOP
LCD_CLK_CLR
}

LCD_CE_SET
}

#else
// Wysyla jeden bajt do spi
// c_d: LCD_DATA|LCD_CMD
void lcd_write_byte(unsigned char c_d, unsigned char data )
{
LCD_CE_CLR

if(c_d)
LCD_DC_SET
else
LCD_DC_CLR

SPDR = data;
while(!(SPSR & (1 & lt; & lt; SPIF)));

LCD_CE_SET
}
#endif

// Wyswietla obrazek
// img, x0,y0, " flaga " obrazka - czyli odkad zaczyna sie dany sprite
void lcd_image(unsigned char s[], char x, char y, uint8_t fl)
{
uint8_t i,z;
LCD_GOTO(x, y)
for(i=0, z=(fl*8)-8; i & lt; 8; i++, z++)
lcd_write_byte(LCD_DATA, pgm_read_byte( & s[z]));

}

void lcd_imagea(unsigned char s[], int8_t x, char y, uint8_t fl) //wyswietla autka z przewijaniem
{
uint8_t i,z,ile,start;

if (x & gt; 76) //wyjezdza na prawo
{
LCD_GOTO(x, y);
ile=84-x;
start=(fl*8)-8;

}
else if (x & lt; 0) //wyjezdza na lewo
{
ile=x+8;
LCD_GOTO(0, y);
start=((fl*8)-8)+(8-ile);

}
else //normalny
{
ile=8;
LCD_GOTO(x, y);
start=(fl*8)-8;

}
for(i=0, z=start; i & lt; ile; i++, z++)
lcd_write_byte(LCD_DATA, pgm_read_byte( & s[z]));

}
void yclear(void) //czysci 0. wiersz - osobno, bo mrygal ;)
{
LCD_HOME
for(unsigned char j=0; j & lt; LCD_X; j++)
lcd_write_byte(LCD_DATA, 0x00);
}

void lcd_clear(void)
{
unsigned char i,j;

LCD_HOME

for(i=1; i & lt; LCD_Y; i++)
{
LCD_GOTO(0, i)
for(j=0; j & lt; LCD_X; j++)
lcd_write_byte(LCD_DATA, 0x00);
}

LCD_HOME
}

// Wyœwietla obrazek
// img - dane obrazka
// x - pierwsza kolumna 0..84(96)
// y - pierwszy wiersz 0..5(7)
// w - szerokoœć obrazka 0..84(96)
// h - wysokoœć obrazka 0..5(7)
void lcd_bimage(unsigned char img[],char x, char y, char w, char h)
{
unsigned int i,j,k;

for(i=0,j=0,k=0; i & lt; h; i++)
{
// Ustawia położenia lewego górnego robu obrazka na ekranie LCD
LCD_GOTO(x,(i+y))

// Kopiuje dane obrazka z FLASH do pamięci obrazu LCD
for(j=0; j & lt; w ; j++,k++)
lcd_write_byte(LCD_DATA, pgm_read_byte( & img[k]));
}
}


zabber.zip > napis.h

0xc1,0xa9,0x99,0x89,0x87,0x00,0xe0,0xb4,0x94,0x94,0xfc,0x00,0xff,0x90,0x90,0x90,
0x60,0x00,0xff,0x88,0x98,0x70,0x00,0x78,0xa4,0xa4,0xb8,0x00,0xf8,0x08,0x04,0x04,
0x00,0x38,0xec,0x86,0xa2,0xa2,0xe0,0x00,0xf4,0x94,0xf8,0x00,0xf0,0x08,0x08,0xf8,
0x08,0x08,0xf8,0x00,0x78,0xa4,0x94,0x9c,0x80,0x00,0x00,0x00,0x38,0x6c,0xc4,0x84,
0xcc,0x78,0x00,0x70,0xc0,0x60,0x10,0x00,0x70,0xa8,0xb0,0x80,0x00,0xf0,0x10,0x10,


zabber.zip > hello_img.h

0x42,0xe4,0x3e,0x7f,0x7f,0x3e,0xe4,0x42,0x42,0x27,0x7c,0xfe,0xfe,0x7c,0x27,0x42,
0x42,0xdb,0x7e,0x3c,0x3c,0x7e,0xbd,0x18,0x18,0xbd,0x7e,0x3c,0x3c,0x7e,0xdb,0x42,
0x18,0xbd,0xff,0xbd,0x3c,0xbd,0xff,0xbd,0xbd,0xff,0xbd,0x3c,0xbd,0xff,0xbd,0x18,
0x00,0xb8,0x44,0x32,0x4a,0x41,0x23,0x1c,0xff,0xff,0x7e,0xe7,0xff,0x7e,0x42,0x3c,
0x3c,0x7e,0x3c,0x3c,0x7e,0xff,0xff,0xff


zabber.zip > main.h

void incrautka() //uaktualnia wspolrzedna x autek, wywolywana przez petle glowna gdy licznik osiagnie ustalona na danym poziomie wartosc
{
uint8_t i;
acount[0]++;
acount[1]++;
for ( i=0;i & lt; ileaut;i++) //rzad 1 wyscigowy w jadace w prawo - x zmienia sie co kazde wywolanie funkcji
{
rzad1[i]++;
if (rzad1[i] & gt; 83) rzad1[i]=(-7);
}

if (acount[0]==3) // spychacze - ruszaja sie co 3. wywolanie funkcji
{
acount[0]=0;
for ( i=0;i & lt; ileaut;i++) //rzad 2 spychacze jadace w prawo
{
rzad2[i]++;
if (rzad2[i] & gt; 83) rzad2[i]=(-7); //scroll autek
}
}
for ( i=0;i & lt; ileaut;i++) //rzad 3 wyscigowki w lewo
{
rzad3[i]--;
if (rzad3[i] & lt; (-7)) rzad3[i]=83;
}

if (acount[1]==2) //zwykle autka - co 2. wywolanie funkcji
{
acount[1]=0;
for ( i=0;i & lt; ileaut;i++) //rzad 4 autko w prawo
{
rzad4[i]++;
if (rzad4[i] & gt; 83) rzad4[i]=(-7);
}
}
}

void logozab()
{
yclear();
lcd_clear();
for (uint8_t i=1;i & lt; 5;i++)
lcd_image(napis,(12+(i*8)),2,i); //zabber, ekran tytulowy
lcd_image(hello_img,10,1,1); //kilka zab
lcd_image(hello_img,60,3,2);
lcd_image(hello_img,70,0,3);
lcd_image(hello_img,20,4,4);
for (uint8_t i=5;i & lt; 8;i++) //wysw podpisu
lcd_image(winrar,(10+((i)*8)),5,i);
while (!(bit_is_clear(PIND, PD4))) {}; //czeka na wcisniecie guzika
}

void plansza() //wyswietla plansze
{
uint8_t i=0, j=0;
lcd_clear();
for ( i=0;i & lt; 4;i++) //wyswietla rzad zerowy - mete
{
if(top[i]==1)
lcd_image(hello_img,(i*24+2),0,1); //zabka na " zajetych " metach
else
lcd_image(hello_img,(i*24+2),0,7); //listek na pustych metach
}

for ( i=0;i & lt; 3;i++) //rzad y=0, puste miedzy metami
{
LCD_GOTO( ((((i*3)+1)*8) +2) , 0 ) //nie mam pojecia co tu napisalam :D
for (j=0;j & lt; 16;j++)
lcd_write_byte(LCD_DATA, 0x00);
}

lcd_image(hello_img,(x*8+2),y,zabflaga); //wyswietla zabe

//wyswietla autka
for ( i=0;i & lt; ileaut;i++) //rzad 1szy wyscigowki w prawo
lcd_imagea(hello_img,(rzad1[i]),1,6);
for ( i=0;i & lt; ileaut;i++) //rzad 2gi spychacz prawo
lcd_imagea(hello_img,(rzad2[i]),2,9);
for ( i=0;i & lt; ileaut;i++) //rzad 3ci wyscigowki w lewo
lcd_imagea(hello_img,(rzad3[i]),3,5);
for ( i=0;i & lt; ileaut;i++) //rzad 4ty autko w prawo
lcd_imagea(hello_img,(rzad4[i]),4,8);
}


void topres() //czysci zmienne mety
{
for (uint8_t i=0;i & lt; 5;i++)
{
top[i]=0;
}
}

void plansz_reset() //zeruje parametry gry, wyswietla czysta plansze po level-upie
{

lcd_clear();
x=5;
y=5;
zabflaga=1;
plansza();
}

void win() //sprawdza wygrana
{
justwon=1;
x=5;
y=5;
if (licz==4) //komplet zab na mecie = level up!
{
topres(); //czyszczenie zmiennych mety
predlicz++; //zwiekszenie predkosci

if (predlicz==4) //skonczono ostatni poziom!
{
lcd_clear();
yclear();
lcd_bimage(zab,0,0,84,6); //ekran koncowy
while (!(bit_is_clear(PIND, PD4))) {}; //czeka na przycisk
//absolutny reset gry
licz=0;
logozab();
lcd_clear();
reset();
plansz_reset();
}
else //nastepny poziom
{
licz=0;
lcd_clear();
yclear();
for (uint8_t i=1;i & lt; 5;i++) //wysw napisu lewelap
lcd_image(winrar,(12+((i)*8)),2,i);
while (!(bit_is_clear(PIND, PD4))) {}; //czeka na przycisk
plansz_reset();
}
}

}

static inline void boom() //kolizja nastapila
{
zyc--;
if (zyc==0) //skonczyly sie wszystkie 3 zycia
{
yclear();
lcd_clear();
for (uint8_t i=5;i & lt; 11;i++) //napis gameover
lcd_image(napis,(12+((i-5)*8)),2,i);
while (!(bit_is_clear(PIND, PD4))) {}; //czeka na przycisk
logozab();
reset();
}
else
{
zycia(); //wyswietla ile zostalo zyc
}
plansz_reset(); //reset planszy
}

void kolizja() //detekcja kolizji
{
uint8_t tempy;
tempy=x*8+2; //pozycja zabki we wspolrzednych autek
if(y==1) //bardzo lipnie sprawdza rzad po rzedzie, autko po autku czy wspolrzedne na siebie " nachodza "
{
for (uint8_t i=0;i & lt; ileaut;i++)
{
if (tempy==rzad1[i]) boom();
else
{
if (tempy & gt; rzad1[i])
{
if (tempy-rzad1[i] & lt; 8)
boom();
}
else if (rzad1[i]-tempy & lt; 8) boom();
}
}
}
else if (y==2)
{
for (uint8_t i=0;i & lt; ileaut;i++)
{
if (tempy==rzad2[i]) boom();
else
{
if (tempy & gt; rzad2[i])
{
if (tempy-rzad2[i] & lt; 8)
boom();
}
else if (rzad2[i]-tempy & lt; 8) boom();
}
}
}
else if (y==3)
{
for (uint8_t i=0;i & lt; ileaut;i++)
{
if (tempy==rzad3[i]) boom();
else {
if (tempy & gt; rzad3[i])
{ if (tempy-rzad3[i] & lt; 8) boom(); }
else if (rzad3[i]-tempy & lt; 8) boom();
}
}
}
else if (y==4)
{
for (uint8_t i=0;i & lt; ileaut;i++)
{
if (tempy==rzad4[i]) boom();
else {
if (tempy & gt; rzad4[i])
{ if (tempy-rzad4[i] & lt; 8) boom(); }
else if (rzad4[i]-tempy & lt; 8) boom();
}
}
}
}

inline void zycia() //wyswietla plansze z iloscia zyc
{

yclear();
lcd_clear();
//wysw ilosc zyc
for (uint8_t i=0;i & lt; zyc;i++)
lcd_image(hello_img,(i*24+12),2,1);
//petla opozniajaca - biedny delay, aby w amoku grania nie ominac tego waznego komunikatu
uint16_t d=0;
while (d & lt; 30000)
d++;
while (!(bit_is_clear(PIND, PD4))) {};

}

void reset() //reset param gry
{
zyc=3;
topres();
y=5;
licz=0; //licznik zab na mecie
rzad1[0]=0; //pozycje autek, mozna zmieniac
rzad1[1]=25;
rzad1[2]=48;
rzad1[3]=60;

rzad2[0]=-5; //ujemne - autko wychodzi " poza ekran "
rzad2[1]=20;
rzad2[2]=55;
rzad2[3]=70;

rzad3[0]=5;
rzad3[1]=30;
rzad3[2]=70;
rzad3[3]=55;

rzad4[0]=10;
rzad4[1]=33;
rzad4[2]=66;
rzad4[3]=66;

predlicz=0; //licznik aktualnej predkosci
zycia();

}



static inline void butans () //sprawdza stan guzikow, wbudowany ubogi debounce w postaci odejmowania od licznika, nie wzorowac sie na tej funkcji nigdy...
//gdy guzik jest wcisniety ustawia flage na " swoja " wartosc, gdyby zaba miala wyjezdzac za ekran - koryguje wspolrzedna
{
if (bit_is_clear(PIND, PD0)) //down
{
if (count[0]==0)
{
count[0]=255;
y++;
if (y==6) y=5;
else flaga=2;
}
else
count[0]--;
}

else if ( bit_is_clear(PIND, PD2)) //up
{
if (count[1]==0)
{
count[1]=255;
if (y==1)
{
if(x==0)
{
if(top[0]==0)
{
top[0]=1;
licz++;
win();

};
}
else if (x==3)
{
if(top[1]==0)
{
top[1]=1;
licz++;
win();
};

}
else if (x==6)
{
if(top[2]==0)
{
top[2]=1;
licz++;
win();
};

}
else if (x==9)
{
if(top[3]==0)
{
top[3]=1;
licz++;
win();
};
}

}
else
{
if (justwon==1)
justwon=0;
else y--;
flaga=1;
}
}
else count[1]--;
}
else if ( bit_is_clear(PIND, PD3)) //left
{
if (count[2]==0)
{
count[2]=255;
if (x!=0)
{
x--;
flaga=4;
}
}
else count[2]--;
}
else if ( bit_is_clear(PIND, PD1)) //right
{
if (count[3]==0)
{
count[3]=255;
x++;
if (x==10) x=9;
else flaga=3;
}
else count[3]--;
}
}


zabber.zip > lcd.h

/*
Plik " lcd.h "

LCD od nokia3310 przyk�ad 1.
KURS AVR-GCC www.abxyz.bplaced.net

zabber mod:
dodano funkcje
lcd_imagea
yclear
zmodyfikowano
lcd_image
*/

#ifndef PCD8544_H
#define PCD8544_H

/* 84 x 6 bajt�w */
#define LCD_X 84
#define LCD_Y 6


// U�ycie sprz�towego interfejsu SPI
#define ATMEGA_SPI 1

/* CLK */
#define LCD_CLK_SET PORTB |= (1 & lt; & lt; PB5);
#define LCD_CLK_CLR PORTB & = ~(1 & lt; & lt; PB5);
#define LCD_CLK_SET_OUT DDRB |= (1 & lt; & lt; PB5);
/* DATA */
#define LCD_DATA_SET PORTB |= (1 & lt; & lt; PB3);
#define LCD_DATA_CLR PORTB & = ~(1 & lt; & lt; PB3);
#define LCD_DATA_SET_OUT DDRB |= (1 & lt; & lt; PB3);
/* DC */
#define LCD_DC_SET PORTB |= (1 & lt; & lt; PB1);
#define LCD_DC_CLR PORTB & = ~(1 & lt; & lt; PB1);
#define LCD_DC_SET_OUT DDRB |= (1 & lt; & lt; PB1);
/* CE */
#define LCD_CE_SET PORTB |= (1 & lt; & lt; PB2);
#define LCD_CE_CLR PORTB & = ~(1 & lt; & lt; PB2);
#define LCD_CE_SET_OUT DDRB |= (1 & lt; & lt; PB2);
/* RST */
#define LCD_RST_SET PORTB |= (1 & lt; & lt; PB4);
#define LCD_RST_CLR PORTB & = ~(1 & lt; & lt; PB4);
#define LCD_RST_SET_OUT DDRB |= (1 & lt; & lt; PB4);


#define LCD_NOP asm volatile( " nop\n\t " " nop\n\t " " nop\n\t " " nop\n\t " " nop\n\t " " nop\n\t " " nop\n\t " " nop\n\t " ::);

#define LCD_CMD 0
#define LCD_DATA 1

#define LCD_HOME lcd_write_byte(LCD_CMD, 0x40);lcd_write_byte(LCD_CMD, 0x80);
#define LCD_GOTO(x,y) lcd_write_byte(LCD_CMD, 0x40|(y));lcd_write_byte(LCD_CMD, 0x80|(x));

void lcd_init(void);
void lcd_clear(void);
void lcd_write_byte( unsigned char, unsigned char );
void lcd_text(char [], unsigned char , unsigned char );
void lcd_image(unsigned char [],char , char , uint8_t);
void lcd_imagea(unsigned char [],int8_t , char , uint8_t);
void lcd_pustka(char x, char y, uint8_t szer);
void yclear(void);
void lcd_bimage(unsigned char img[],char x, char y, char w, char h);
#endif