<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=23&amp;t=2331&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-02-14T15:01:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=2331&amp;mode</id>
<entry>
<author><name><![CDATA[zlata_n]]></name></author>
<updated>2013-02-14T15:01:35+01:00</updated>
<published>2013-02-14T15:01:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28083#p28083</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28083#p28083"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28083#p28083"><![CDATA[
Super sprawa, widać wielkie umiejętności i doświadczenie kolegi Krauser. Osobiście posiadam ten wyświetlacz oraz konwerter więc na pewno przetestuje!! Osobiście pełen szacun !! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Pzdr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=142">zlata_n</a> — 14 lut 2013, o 15:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-02-14T11:41:08+01:00</updated>
<published>2013-02-14T11:41:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28048#p28048</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28048#p28048"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28048#p28048"><![CDATA[
<div class="quotetitle">xbary napisał(a):</div><div class="quotecontent"><br />No ja wczoraj podczas podróży jako pasażer <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> grywałem sobie w Stunt Car Racer na emulatorze C64 na Androidzie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ... mam ostatnio takie chęci żeby w te staruchy sobie pograć.<br /></div><br /><br />Mógłbyś bardziej przybliżyć temat <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 14 lut 2013, o 11:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xbary]]></name></author>
<updated>2013-02-14T11:13:50+01:00</updated>
<published>2013-02-14T11:13:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28043#p28043</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28043#p28043"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28043#p28043"><![CDATA[
No ja wczoraj podczas podróży jako pasażer <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> grywałem sobie w Stunt Car Racer na emulatorze C64 na Androidzie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ... mam ostatnio takie chęci żeby w te staruchy sobie pograć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=447">xbary</a> — 14 lut 2013, o 11:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-02-14T10:58:14+01:00</updated>
<published>2013-02-14T10:58:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28038#p28038</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28038#p28038"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28038#p28038"><![CDATA[
Jakieś wyścigówki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. W końcu na C64 było nawet wypaśne Test Drive <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 14 lut 2013, o 10:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xbary]]></name></author>
<updated>2013-02-14T10:45:27+01:00</updated>
<published>2013-02-14T10:45:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28034#p28034</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28034#p28034"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=28034#p28034"><![CDATA[
Aż chce się rzucić wszystko i też fajną grę na te małe 8 bitowce stworzyć , i poczuć się jak był rok 1987, kiedy to pisząc grę liczyło się każdy cykl procesora aby tylko zdążyć przed kolejnym odświeżaniem pionowym  ekranu:)<br /><br />Krauser chyba nie jednego tu z Nas na forum podpaliłeś do napisania jakiejś gierki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=447">xbary</a> — 14 lut 2013, o 10:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-02-13T15:59:19+01:00</updated>
<published>2013-02-13T15:59:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27925#p27925</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27925#p27925"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27925#p27925"><![CDATA[
hmmm....  no dobra  super gratka <br />Krauser rządzisz .....<br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 13 lut 2013, o 15:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matisek1233]]></name></author>
<updated>2013-02-13T15:21:20+01:00</updated>
<published>2013-02-13T15:21:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27916#p27916</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27916#p27916"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27916#p27916"><![CDATA[
<div class="quotetitle">dexter napisał(a):</div><div class="quotecontent"><br />Hehehe fajny projekt, oj zanim ja dotrę do takiej wprawy to już wnuki będe miał <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /></div><br /><br />Ja również.  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=945">matisek1233</a> — 13 lut 2013, o 15:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-02-13T12:51:29+01:00</updated>
<published>2013-02-13T12:51:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27893#p27893</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27893#p27893"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27893#p27893"><![CDATA[
<div class="quotetitle">kila napisał(a):</div><div class="quotecontent"><br />Stwierdzam, że poziom moich umiejętności nie odpowiada zabawom w piaskownicy <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /><br /></div><br /><br />Nie jesteś sam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Swoją drogą faktycznie teraz nic tylko czekać na Tetrisa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 13 lut 2013, o 12:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kila]]></name></author>
<updated>2013-02-13T13:10:32+01:00</updated>
<published>2013-02-13T12:43:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27889#p27889</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27889#p27889"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27889#p27889"><![CDATA[
Stwierdzam, że poziom moich umiejętności odpowiada zabawom w piaskownicy <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=699">kila</a> — 13 lut 2013, o 12:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dexter]]></name></author>
<updated>2013-02-13T12:37:03+01:00</updated>
<published>2013-02-13T12:37:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27888#p27888</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27888#p27888"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27888#p27888"><![CDATA[
Hehehe fajny projekt, oj zanim ja dotrę do takiej wprawy to już wnuki będe miał <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=907">dexter</a> — 13 lut 2013, o 12:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-02-13T11:07:26+01:00</updated>
<published>2013-02-13T11:07:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27873#p27873</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27873#p27873"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27873#p27873"><![CDATA[
Krauser ---&gt; matko jedyna <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ależ ty masz pomysły ..... normalnie odjazd .... i już nie chodzi mi o to że to na ATB czy ze zdjęciem ATB - ale o fakt właśnie pokazania TAK FAJNEGO wykorzystania tego buforowania sprzętowego w wyświetlaczu !!!<br /><br />no przy takiej grze tzn przy takich reakcjach ekranu kto by pomyślał że za jego plecami kryje się taki mały 8-bitowy biedny mały pikuś , który ponoć jest już na wymarciu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Świetny pomysł, rewelacyjna realizacja, dodatkowo program na PC, normalnie prześliczny PROJEKT !!! z mojej strony pełen szacunek za pokazanie kolejny raz takich swoich możliwości. SZOK i uznanie.<br /><br />Po twoich projektach mam normalnie chęć rzucić wszystko inne i zająć się tylko takimi rzeczami .... ale niestety rzeczywistość jeszcze mnie przytłacza wieloma innymi obowiązkami i muszę to wciąż zostawiać sobie na później i później .... kuuuuurka wodna <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 15 minutach ]</span></strong><br /><br />Pozwolisz Krauser, że pokażę ten projekt szerzej i wpuszczę go jako przyklejony globalny na głównej stronie naszego forum <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 lut 2013, o 11:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wrangler]]></name></author>
<updated>2013-02-13T10:51:28+01:00</updated>
<published>2013-02-13T10:51:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27869#p27869</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27869#p27869"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27869#p27869"><![CDATA[
Chapeau bas Krauser!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=223">Wrangler</a> — 13 lut 2013, o 10:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-02-13T08:58:08+01:00</updated>
<published>2013-02-13T08:58:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27845#p27845</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27845#p27845"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27845#p27845"><![CDATA[
<div class="quotetitle">Sonix napisał(a):</div><div class="quotecontent"><br />No tak... ja się tu męczę że żeby coś tam wyświetlić na LCD 2x16 a tu takie rzeczy  <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> .<br /><br />Nie ma to jak wyświetlić sobie fotkę ATB na samej ATB i to jeszcze w formie gierki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br />Gratuluję projektu i zazdroszczę umiejętności  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> .<br /></div><br /><br />Dokładnie wyjąłeś mi to z ust. Od dłuższego czasu próbuję zmusić do działania 44780 na I2c (PCF8574) a tu takie kwiatki <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />.<br /><br />Świetna robota.<p>Statystyki: Napisane przez Gość — 13 lut 2013, o 08:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2013-02-13T08:22:21+01:00</updated>
<published>2013-02-13T08:22:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27842#p27842</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27842#p27842"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27842#p27842"><![CDATA[
Super sprawa gratki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 13 lut 2013, o 08:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2013-02-13T08:19:55+01:00</updated>
<published>2013-02-13T08:19:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27841#p27841</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27841#p27841"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27841#p27841"><![CDATA[
No tak... ja się tu męczę że żeby coś tam wyświetlić na LCD 2x16 a tu takie rzeczy  <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> .<br /><br />Nie ma to jak wyświetlić sobie fotkę ATB na samej ATB i to jeszcze w formie gierki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br />Gratuluję projektu i zazdroszczę umiejętności  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 13 lut 2013, o 08:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2013-02-13T06:41:12+01:00</updated>
<published>2013-02-13T06:41:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27838#p27838</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27838#p27838"/>
<title type="html"><![CDATA[Re: Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27838#p27838"><![CDATA[
No, no, ładnie. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> To chyba pierwsza gra na ATB?<br /><br />Teraz kto zrobi Tetrisa? <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 13 lut 2013, o 06:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-02-13T00:58:14+01:00</updated>
<published>2013-02-13T00:58:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27829#p27829</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27829#p27829"/>
<title type="html"><![CDATA[Gra logiczna na ATB + TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2331&amp;p=27829#p27829"><![CDATA[
<img src="http://forum.atnel.pl/_obrazki/o/54_44df48d9501606feae8754c8ce27f438.jpg" alt="Obrazek" /><br />Korzystając z dobrodziejstwa bibliotek na TFT przygotowanych przez Mirka przygotowałem port klasycznej gierki na zestaw ATB.<br />Opis hardware/połączeń:<br />- ATB-GLCD TFT konwerter podłączony jest do portu A (dane), portu C (linie sterujące) oraz PD.2/INT0 (reakcja na dotyk). Domyślnie jak w przykładzie z książki.<br />- Karta SD podłączona jest do portu B od 1 do 7 pinu. Nawet nie trzeba za bardzo kombinować - połączenie 1 do 1 7-żyłową taśmą (lub 8-żyłową, gdzie ostatnia linia jest niewykorzystana ). Wystarczy tylko zdjąć zworkę PwrON.<br />- Buzzer podłączony jest do PB.0.<br /><br />Założenia gry:<br />- Gra polega na ułożeniu obrazka z 12 elementów, gdzie 1 jest pusty. Przykład na zdjęciu poniżej.<br /><br /><a href="http://imageshack.us/photo/my-images/832/avrgame01.jpg/"  class="postlink"><img src="http://imageshack.us/a/img832/7002/avrgame01.th.jpg" alt="Obrazek" /></a><br /><br />- Można przesunąć element tylko na pustą pozycję. Gra kończy się, gdy wszystkie elementy znajdą się na właściwym miejscu. Nie jest liczony czas, a liczba wykonanych ruchów. Wynik ten jest pokazywany na końcu raz oczywiście podczas gry na wolnym polu.<br /><br />Założenia programu:<br />- Postanowiłem skorzystać z wolnej pamięci w sterowniku wyświetlacza o czym jest mowa w książce &quot;Język C Pasja programowania mikrokontrolerów 8-bitowych&quot; tak więc nie jest widoczne wczytywanie żadnych grafik z karty SD. Wykorzystałem wszystkie dostępne bufory, które na początku ładowane są 11 obrazkami, a w trakcie gry tylko zamieniane. Jako, że w tle modyfikowane są 4 ekrany, a wyświetlany jest 5 to przesuwanie bloków i zmiana 4 małych obrazków zajmuje około sekundy skorzystałem z buzzera, który sygnalizuje gotowość do reakcji na kolejny dotyk. <br />- Obrazek do gry to specjalnie przygotowane 12 plików w formacie rg8 (opis w książce, jest on podobny do bmp, ale bez niepotrzebnych danych oraz odpowiednio uszeregowaną kolejnością bajtów RGB). Troszkę czasu zajęłoby przygotowanie tych plików na piechotę. Dlatego też przygotowałem programik do konwersji dowolnych obrazków na 12 plików w formacie rg8, który najpierw skaluje obraz do rozdzielczości 320x240, a następnie zapisuje 12, 16, 20 lub 25 plików (do wyboru) w formacie rg8 lub bmp z kolejnymi numerami. W nazwie nie może być cyfr, ponieważ program na AVR przeszukuje kartę SD i ciąg liter to część wspólna wykorzystana do sklejania nazw plików wyświetlanych na TFT.<br /><br /><img src="http://imageshack.us/a/img819/8060/splitimage.jpg" alt="Obrazek" /><br /><br />Nie zastosowałem, żadnego algorytmu losowania początkowego ułożenia &quot;kafelków&quot;. Co oczywiście można zrobić jak ktoś uzna, że ma za łatwo. Tutaj również zawsze ostatni z elementów jest w prawym dolnym rogu co znacznie ułatwia ukończenie tego wyzwania. <br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />Oprogramowanie na ATB:<br />- main.c<br />[syntax=c]/*<br /> * main.c<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br /><br />#include &quot;main.h&quot;<br />#include &quot;game01.h&quot;<br /><br /><br />static void __init3( void ) __attribute__ (( section( &quot;.init3&quot; ), naked, used ));<br /><br />/* buffer for SD/MMC */<br />uint16_t SD_BUF_SIZE = 1024;<br />uint8_t sd_buffer[1024];<br />/* pointer to SD buffer */<br />uint8_t *sd_buf = sd_buffer;<br /><br /><br />/* main function */<br />int main(void) {<br /><br />FATFS Fs;/* File system object */<br />DIR Dir;/* Directory object */<br />FILINFO Fno;/* File information */<br /><br />uint8_t init = 0;<br />uint8_t start = 0;<br /><br />i2cSetBitrate(400);/* I2C speed */<br /><br />spi_init(); /* SPI, buzzer, and empty port initialization */<br /><br />tft_init();/* TFT LCD initialization */<br /><br />stmpe811_init(); /* STMPE811 initialization */<br /><br />for(uint8_t i=0; i&lt;5; i++)<br />{<br />if(screen[i].function == left) /* start display on buffer assigned to left */<br />{<br />setxbuf(screen[i].scr_buf);<br />fx_ptr = screen[i].scr_buf;<br />}<br />}<br /><br />/* do the same as tft_cls but on every screens */<br />tft_fill_rect(0, 0, 320, 240, BG_COLOR);<br /><br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br /><br />for(uint8_t i=0; i&lt;5; i++)<br />{<br />if(screen[i].function == center)/*  finding empty in center screen */<br />for (uint8_t j = 0; j &lt; 12; j++)<br />{<br />if(screen[i].game[j] == EMPTY) empty_block = selected_block = j;<br />}<br />}<br />sei();/* enable interrupts */<br /><br />/* main loop */<br />while(1) {<br />tft_puts_P( 90, 10, PSTR(&quot;START&quot;), black, BG_COLOR );<br /><br />sd_pwr(powerOff);<br />if( SD_SLOT_EMPTY )<br />{<br />tft_puts_P( 90, 30, PSTR(&quot;                        &quot;), black, BG_COLOR );<br />tft_puts_P( 90, 30, PSTR(&quot;insert SD Card&quot;), black, BG_COLOR );<br />continue;/* if no card detected back to the beginning of the loop */<br />}<br />sd_pwr(powerOn);<br /><br />if (pf_mount(&amp;Fs))<br />{<br />tft_puts_P( 90, 30, PSTR(&quot;                        &quot;), black, BG_COLOR );<br />tft_puts_P( 90, 30, PSTR(&quot;FS Error&quot;), black, BG_COLOR );<br />continue;<br />}<br /><br />while(1) {<br />if( SD_SLOT_EMPTY )<br />{<br />tft_puts_P( 90, 30, PSTR(&quot;                        &quot;), black, BG_COLOR );<br />tft_puts_P( 90, 30, PSTR(&quot;insert SD Card and reset&quot;), black, BG_COLOR );<br />break;<br />}<br /><br />if (pf_opendir(&amp;Dir, &quot;&quot;))/* Open directory (root dir) */<br />{<br />tft_puts_P( 90, 30, PSTR(&quot;                        &quot;), black, BG_COLOR );<br />tft_puts_P( 90, 30, PSTR(&quot;Open failed please reset&quot;), black, BG_COLOR );<br />break;<br />}<br /><br />if (st_intX_flag) /* screen touched */<br />{<br />if(!start) /* first time */<br />{<br />for(uint8_t i = 0; i &lt; 5; i++)<br />{<br />if(screen[i].function == center) /* select center */<br />{<br />setxbuf(screen[i].scr_buf);<br />fx_ptr = screen[i].scr_buf;<br />}<br />}<br />for(uint8_t i = 0; i &lt; 5; i++)<br />{<br />if(screen[i].function == left) /* draw all block on left screen (background) */<br />{<br />draw_all(screen[i].scr_buf);<br />}<br />}<br />start = 1;<br />#if 0 //show all screens<br />show_all();<br />#endif<br />}/* if(!start) */<br />else /* every next time */<br />{<br />uint8_t k = 255;<br /><br />selected_block = get_block(); /* check which block was selected */<br /><br />for(uint8_t i = left; i &lt; center; i++)<br />{<br />if(selected_block == neighborhood[empty_block][i])<br />{<br />k = i; /* j=left, top, right or bottom screen have empty block == selected */<br />}<br />}<br /><br />if( selected_block != empty_block &amp;&amp; (k &lt; 4) )/* not the same and from neighborhood */<br />{<br /><br />if(moves &lt; 999) moves++;<br />/* back to empty block, screen with empty block and selected block unchanged*/<br />rearrange_tab();<br />check_differences();<br />fill_empty();<br />make_empty();<br />#if 0 //show all screens<br />show_all();<br />#endif<br />#if 0<br />show_tables();<br />#endif<br />#if 1<br />/* all screens like that with empty block = selected block, */<br />/* screen with empty block unchanged */<br />arrange_tab_c();<br />check_differences();<br />fill_empty();<br />make_empty();<br />#endif<br /><br />#if 0 //show all screens<br />show_all();<br />#endif<br />#if 0<br />show_tables();<br />#endif<br />#if 1<br />/* change screen */<br />/* screen with empty block changed, now all are the same */<br />show_moves();<br />change_screen();<br />check_differences();<br />fill_empty();<br />make_empty();<br />#endif<br /><br />#if 0 //show all screens<br />show_all();<br />#endif<br />#if 0<br />show_tables();<br />#endif<br />#if 1<br />/* like create_tab - make possibilities */<br />arrange_tab_k();<br />check_differences();<br />fill_empty();<br />make_empty();<br />#endif<br /><br />#if 0 //show all screens<br />show_all();<br />#endif<br />#if 0<br />show_tables();<br />#endif<br />end_game();<br />}<br />}/* if(!start) / else */<br />st_intX_flag = 0;<br />short_beep();<br />}/* if (st_intX_flag) */<br />if(!init) /* initialization */<br />{<br />while (pf_readdir(&amp;Dir, &amp;Fno) == FR_OK &amp;&amp; Fno.fname[0])<br />{/* check files */<br />if (strcasestr(Fno.fname, &quot;.rg8&quot;) )<br />{<br />strncpy(file_origin, Fno.fname, strcspn(Fno.fname,&quot;0123456789&quot;));<br />tft_puts_P( 90, 50, PSTR(&quot;FILE: &quot;), black, BG_COLOR );<br />tft_puts( 180, 50, file_origin, black, BG_COLOR );<br />break;<br />}<br />}<br />create_tab();<br />tft_puts_P( 90, 30, PSTR(&quot;                        &quot;), black, BG_COLOR );<br />tft_puts_P( 90, 30, PSTR(&quot;LOADING...&quot;), black, BG_COLOR );<br /><br />for(uint8_t k = top; k &lt;= center; k++) /* without left screen */<br />{<br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if(screen[i].function == k)<br />{<br />draw_all(screen[i].scr_buf);<br />}<br />}<br />}<br /><br />setCurrentFont(&amp;CourierNew12ptFontInfo); /* again because draw_all may change it */<br />tft_puts_P( 90, 30, PSTR(&quot;                        &quot;), black, BG_COLOR );<br />tft_puts_P( 90, 30, PSTR(&quot;READY&quot;), black, BG_COLOR );<br />init=1;<br />}/* if(!init) */<br />}/* while(1) */<br />}/* while(1) */<br />}/* main() */<br /><br />void sd_pwr( uint8_t OnOff ) {<br />if(OnOff) {<br />SD_ON;<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR);<br />_delay_ms(50);<br />disk_initialize();<br />} else {<br />SPCR &amp;= ~(1&lt;&lt;SPE);<br />PORTB &amp;= ~((1&lt;&lt;SCK)|(1&lt;&lt;MISO)|(1&lt;&lt;MOSI));<br />SD_OFF;<br />_delay_ms(50);<br />}<br />}<br /><br /><br />static void __init3( void )<br />{<br />    MCUSR = 0;<br />    WDTCSR = (1&lt;&lt;WDCE) | (1&lt;&lt;WDE);<br />    WDTCSR = 0;<br />}[/syntax]<br />- main.h<br />[syntax=c]/*<br /> * main.h<br /> *<br /> */<br /><br />#ifndef MAIN_H_<br />#define MAIN_H_<br />#include &lt;util/delay.h&gt;<br /><br />#define SCK PB7<br />#define MISO PB6<br />#define MOSI PB5<br />#define CS PB4<br />#define CDPB3<br />#define WPPB2 /* not used */<br />#define PWR PB1<br /><br />#define BUZPB0<br /><br />#define unused_pins (1&lt;&lt;PD0) | (1&lt;&lt;PD1) | (1&lt;&lt;PD3) | (1&lt;&lt;PD4) | (1&lt;&lt;PD5) | (1&lt;&lt;PD6) | (1&lt;&lt;PD7)<br /><br />#define SD_ON PORTB &amp;= ~(1&lt;&lt;PWR)<br />#define SD_OFF PORTB |= (1&lt;&lt;PWR)<br /><br />#define SD_SLOT_EMPTY (PINB &amp; (1&lt;&lt;CD))<br /><br />void sd_pwr( uint8_t OnOff );<br />#define powerOn 1<br />#define powerOff 0<br /><br />static inline void short_beep(void)<br />{<br />PORTB |= (1&lt;&lt;BUZ);<br />_delay_ms(5);<br />PORTB &amp;= ~(1&lt;&lt;BUZ);<br />}<br /><br />static inline void spi_init(void)<br />{<br />/* init SPI and SD pins */<br />DDRB |= (1&lt;&lt;CS)|(1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;PWR);<br />PORTB |= (1&lt;&lt;CS)|(1&lt;&lt;PWR) | (1&lt;&lt;CD) | (1&lt;&lt;WP);<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR);<br />SPSR |= (1&lt;&lt;SPI2X);/* max SCK clock */<br /><br />/* init buzzer and unused pins*/<br />DDRB |= (1&lt;&lt;BUZ);<br />PORTD |= unused_pins;<br />}<br /><br />#endif /* MAIN_H_ */<br />[/syntax]<br />- game01.c<br />[syntax=c]/*<br /> * game01.c<br /> *<br /> *  Created on: 12-02-2013<br /> *<br /> */<br />#include &quot;game01.h&quot;<br /><br />char file_origin[12];<br /><br />SCREEN screen[5]= {<br />{SSDXBUF0,<br />{10,8,2,0,<br />1,9,11,5,<br />3,7,4,6},<br />{0},<br />255,<br />255,<br />center},<br />{SSDXBUF1,<br />{0},<br />{0},<br />255,<br />255,<br />left},<br />{SSDXBUF2,<br />{0},<br />{0},<br />255,<br />255,<br />top},<br />{SSDXBUF3,<br />{0},<br />{0},<br />255,<br />255,<br />right},<br />{SSDXBUF4,<br />{0},<br />{0},<br />255,<br />255,<br />bottom}<br />};<br /><br />/* neighborhood of each block, if 255 no neighbor */<br />const uint8_t neighborhood[12][4] = {{255,255,1,4},{0,255,2,5},{1,255,3,6},{2,255,255,7},<br />{255,0,5,8},{4,1,6,9},{5,2,7,10},{6,3,255,11},<br />{255,4,9,255},{8,5,10,255},{9,6,11,255},{10,7,255,255}};<br />uint8_t empty_block, selected_block;<br />uint16_t moves;<br /><br /><br />void draw_all(uint16_t ptr)<br />{<br />uint16_t temp_ptr = fx_ptr;<br />uint8_t index = 0;<br />for(uint8_t i = 0; i &lt;= 4; i++ )<br />{<br />if(ptr == screen[i].scr_buf) index = i;<br />}<br /><br />fx_ptr = ptr;<br />#if mode == work<br />for(uint8_t i = 0; i &lt; 12; i++)<br />{<br />char file[12];<br />uint8_t len;<br />strcpy(file, file_origin);<br />len = strlen(file);<br />uint8_t x, y;<br />x = 80 * (i % 4);<br />y = 80 * (i / 4);<br />if( screen[index].game[i] != EMPTY )<br />{<br />#if 0<br />char buffer[12];<br />itoa(index, buffer, 10);<br />setCurrentFont( &amp;CourierNew12ptFontInfo );<br />tft_puts_P( 5, 5, PSTR(&quot;   &quot;), black, BG_COLOR );<br />tft_puts( 5, 5, buffer, black, BG_COLOR );<br />#endif<br />itoa(screen[index].game[i], &amp;file[len], 10);<br />strcat(file,&quot;.rg8&quot;);<br />tft_bitmap_from_file( x, y, file, NULL );<br />}<br />else<br />{<br />x = 80 * (i % 4);<br />y = 80 * (i / 4);<br />tft_fill_rect(x, y, 80, 80, BG_COLOR);<br />}<br />}<br />#elif mode==debug<br />for(uint8_t i=0; i&lt;12;i++)<br />{<br />uint8_t x, y;<br />x= 80 * (i % 4); /* 0, 160, 240 */<br />y= 80 * (i / 4); /* 0, 160 */<br />if( screen[index].game[i] != EMPTY ) /* if not empty block */<br />{<br />char buffer[12];<br />#if 1<br />itoa(index, buffer, 10);<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts_P( 5, 5, PSTR(&quot;   &quot;), black, BG_COLOR );<br />tft_puts( 5, 5, buffer, black, BG_COLOR );<br />#endif<br />/* draw block */<br />tft_fill_rect(x, y, 80, 80, red);<br />itoa(screen[index].game[i], buffer, 10);<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts_P( x+30, y+34, PSTR(&quot;   &quot;), black, red );<br />tft_puts( x+30, y+34, buffer, black, red );<br />}<br />else<br />{<br />x = 80 * (i % 4);<br />y = 80 * (i / 4);<br />tft_fill_rect(x, y, 80, 80, BG_COLOR);<br />}<br />}<br />#endif<br />fx_ptr = temp_ptr;<br />}<br />/* change screen */<br />/* screen with empty block changed, now all are the same */<br />void change_screen(void)<br />{<br />uint8_t j = 255, k = 255, temp;<br /><br />for(uint8_t i = left; i &lt; center; i++)<br />{<br />if( selected_block == neighborhood[empty_block][i] )<br />{<br />k = i; /* left, top, right or bottom */<br />}<br />}<br /><br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if( screen[i].function == k)<br />{<br />j = i;<br />}<br />}<br /><br />if( empty_block != selected_block &amp;&amp; (j &lt; 5) )<br />{<br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if(screen[i].function == center)<br />{<br />/* switch empty and selected in game table */<br />temp = screen[i].game[empty_block]; /* copy */<br />screen[i].game[empty_block] = screen[i].game[selected_block]; /* change */<br />screen[i].game[selected_block] = temp; /* paste */<br /><br />}<br />}<br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if(screen[i].function == center)<br />{<br />/* switch screen function */<br />temp = screen[i].function;<br />screen[i].function = screen[j].function;<br />screen[j].function = temp;<br />}<br />}<br /><br />empty_block = selected_block;<br /><br />setxbuf( screen[j].scr_buf ); /* change screen */<br />fx_ptr = screen[j].scr_buf; /* change write pointer */<br />}<br />}<br />uint8_t get_block(void)<br />{<br />int16_t x = 0, y = 0;<br />x=TP_X, y=TP_Y;<br />if(y &lt; 80)<br />if(x &lt; 80) return 0;<br />else if(x &lt; 160) return 1;<br />else if (x &lt; 240) return 2;<br />else return 3;<br />else if(y &lt; 160)<br />if(x &lt; 80) return 4;<br />else if(x &lt; 160) return 5;<br />else if (x &lt; 240) return 6;<br />else return 7;<br />else<br />if(x &lt; 80) return 8;<br />else if(x &lt; 160) return 9;<br />else if (x &lt; 240) return 10;<br />else return 11;<br />}<br /><br />void create_tab(void)<br />{<br />uint8_t empty = 255, index, temp;<br /><br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if( screen[i].function == center )<br />{<br />for(uint8_t k = 0; k &lt;= 4; k++)<br />{<br />if( screen[k].function != center )<br />{<br />for (uint8_t j = 0; j &lt; 12; j++)<br />{<br />screen[k].game[j] = screen[i].game[j]; /* all are the same */<br />}<br />}<br />}<br />}<br />}<br /><br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if( screen[i].function != center ) /* center will be unchanged */<br />{<br />for (uint8_t j = 0; j &lt; 12; j++)<br />{<br />if( screen[i].game[j] == EMPTY ) empty = j;<br />}<br /><br />index = neighborhood[empty][ screen[i].function ]; //index of the neighbor in all 4 tables<br />if( index &lt; 12 )<br />{ /* switch in table */<br />temp = screen[i].game[index];<br />screen[i].game[index] = screen[i].game[empty];<br />screen[i].game[empty] = temp;<br />}<br />}<br />}<br /><br />for(uint8_t i = 0; i &lt;= 4; i++)<br />for(uint8_t j = 0; j &lt; 12; j++)<br />screen[i].last[j] = screen[i].game[j];<br />}<br />/* all screens like that with empty block = selected block, */<br />/* screen with empty block unchanged */<br />void arrange_tab_c(void)//<br />{<br />uint8_t k = 255, empty = 255, index, temp;<br /><br />for(uint8_t i = left; i &lt; center; i++)<br />{<br />if( selected_block == neighborhood[empty_block][i] )<br />{<br />k = i; /* left, top, right or bottom */<br />}<br />}<br /><br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{ /* center and selected will be unchanged */<br />if( screen[i].function != center &amp;&amp; screen[i].function != k)<br />{<br />for (uint8_t j = 0; j &lt; 12; j++)<br />{<br />if( screen[i].game[j] == EMPTY ) empty = j;<br />}<br /><br />index = neighborhood[empty][ k ]; /* index of the neighbor in all 4 tables */<br />if( index &lt; 12 )<br />{<br />temp = screen[i].game[index];<br />screen[i].game[index] = screen[i].game[empty];<br />screen[i].game[empty] = temp;<br />}<br />}<br />}<br />}<br /><br />void arrange_tab_k(void)<br />{<br />uint8_t empty = 255, index, temp;<br /><br />for(uint8_t i = 0; i &lt;= 4; i++)<br />for(uint8_t j = 0; j &lt; 12; j++)<br />screen[i].last[j] = screen[i].game[j];<br /><br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{ /* center will be unchanged */<br />if( screen[i].function != center)<br />{<br />for (uint8_t j = 0; j &lt; 12; j++)<br />{<br />if( screen[i].game[j] == EMPTY ) empty = j;<br />}<br /><br />index = neighborhood[empty][ screen[i].function ]; /* index of the neighbor in all 4 tables */<br />if( index &lt; 12 )<br />{<br />temp = screen[i].game[index];<br />screen[i].game[index] = screen[i].game[empty];<br />screen[i].game[empty] = temp;<br />}<br />}<br />}<br />}<br />/* back to empty block, screen with empty block and selected block unchanged*/<br />void rearrange_tab(void)<br />{<br />uint8_t k = 255, l = 255, empty = 255, index, temp, opposite;<br /><br />for(uint8_t i = left; i &lt; center; i++)<br />{<br />if( selected_block == neighborhood[empty_block][i] )<br />{<br />k = i; /* left, top, right or bottom */<br />}<br />}<br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if( screen[i].function == center )<br />{<br />l = i;<br />}<br />}<br /><br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{ /* center and selected will be unchanged */<br />if( screen[i].function != center &amp;&amp; screen[i].function != k)<br />{<br />for (uint8_t j = 0; j &lt; 12; j++)<br />{<br />if( screen[i].game[j] == EMPTY ) empty = j;<br />}<br />if(screen[i].game[empty] == screen[l].game[empty]) continue; /* don't need changes */<br />opposite = (screen[i].function + 2) % 4; /* opposite block */<br />index = neighborhood[empty][ opposite ]; /* index of the neighbor in all 4 tables */<br />if( index &lt; 12 )/*if exist  */<br />{<br />temp = screen[i].game[index];<br />screen[i].game[index] = screen[i].game[empty];<br />screen[i].game[empty] = temp;<br />}<br />}<br />}<br />}<br /><br />void fill_empty(void)<br />{<br />uint16_t temp_ptr = fx_ptr;<br />#if mode==work<br />char file[12];<br />uint8_t len;<br />strcpy(file, file_origin);<br />len = strlen(file);<br />uint8_t x, y, index;<br />for (uint8_t i = 0; i &lt;= 4; i++)<br />{<br />fx_ptr = screen[i].scr_buf;<br />index = screen[i].to_set;<br />if(index &lt; 12)<br />{<br />x = 80 * (index % 4);<br />y = 80 * (index / 4);<br />itoa(screen[i].game[index], &amp;file[len], 10);<br />strcat(file, &quot;.rg8&quot;);<br />tft_bitmap_from_file(x, y, file, NULL );<br />}<br />}<br />#elif mode==debug<br />uint8_t x, y, index;<br />for (uint8_t i = 0; i &lt;= 4; i++)<br />{<br />fx_ptr = screen[i].scr_buf;<br />index = screen[i].to_set;<br />if(index &lt; 12)<br />{<br />char buffer[12];<br />x = 80 * (index % 4);<br />y = 80 * (index / 4);<br /><br />tft_fill_rect(x, y, 80, 80,red);<br />itoa(screen[i].game[index], buffer, 10);<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts_P( x+30, y+34, PSTR(&quot;   &quot;), black, red );<br />tft_puts( x+30, y+34, buffer, black, red );<br />}<br />}<br />#endif<br />fx_ptr = temp_ptr;<br />}<br /><br />void make_empty(void)<br />{<br />uint16_t temp_ptr = fx_ptr;<br /><br />uint8_t x, y, index;<br />for (uint8_t i = 0; i &lt;= 4; i++)<br />{<br />fx_ptr = screen[i].scr_buf;<br />index = screen[i].to_clear;<br />if(index &lt; 12)<br />{<br />x = 80 * (index % 4);<br />y = 80 * (index / 4);<br />tft_fill_rect(x, y, 80, 80, BG_COLOR);<br />}<br />}<br />fx_ptr = temp_ptr;<br />}<br /><br />void draw_table(uint8_t scr)<br />{<br /><br />char buffer[12];<br />uint8_t x, y;<br />switch(scr)<br />{<br />case 0: x = 0; y = 0; break;<br />case 1: x = 100; y = 0; break;<br />case 2: x = 200; y = 0; break;<br />case 3: x = 0; y = 80; break;<br />case 4: x = 100; y = 80; break;<br />default: x = 0; y = 0; break;<br />}<br />setCurrentFont(&amp;DefaultFontInfo);<br />for(uint8_t j = 0; j &lt; 3; j++)<br />{<br />tft_puts_P( 5+x, 50+15*j+y, PSTR(&quot;                         &quot;), black, BG_COLOR );<br />for(uint8_t i = 0; i &lt; 4; i++)<br />{<br />for(uint8_t l = 0; l &lt;= 4; l++)<br />{<br />if(screen[l].function == scr)<br />{<br />itoa(screen[l].game[j*4+i], buffer, 10);<br />}<br />}<br /><br />tft_puts( 5+20*i+x, 50+15*j+y, buffer, black, BG_COLOR );<br />}<br />}<br />}<br /><br />void draw_m_f(void)<br />{<br />char buffer[12];<br />setCurrentFont(&amp;DefaultFontInfo);<br /><br />tft_puts_P( 205, 130, PSTR(&quot;                                    &quot;), black, BG_COLOR );<br />tft_puts_P( 205, 145, PSTR(&quot;                                    &quot;), black, BG_COLOR );<br /><br />for(uint8_t i = left; i &lt;= center; i++)<br />{<br />for(uint8_t j = 0; j &lt;= 4; j++)<br />{<br />if(screen[j].function == i)<br />{<br />itoa(screen[j].to_set, buffer, 10);<br />tft_puts( 205 + 22 * i, 130, buffer, black, BG_COLOR );<br />itoa(screen[j].to_clear, buffer, 10);<br />tft_puts( 205 + 22 * i, 145, buffer, black, BG_COLOR );<br />}<br />}<br />}<br />}<br /><br />void check_differences(void)<br />{<br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />screen[i].to_set = 255;<br />screen[i].to_clear = 255;<br /><br />for(uint8_t j = 0; j &lt; 12; j++)<br />{<br />if( screen[i].game[j] != screen[i].last[j] )<br />{<br />if( screen[i].last[j] == EMPTY ) screen[i].to_set = j;<br />else screen[i].to_clear = j;<br />screen[i].last[j] = screen[i].game[j];<br />}<br />}<br />}<br />}<br /><br /><br /><br /><br />void show_all(void)<br />{<br />for(uint8_t k = left; k &lt;= center; k++)<br />{<br />_delay_ms(1000);<br />for(uint8_t i=0; i&lt;5; i++)<br />{<br />if(screen[i].function == k)<br />{<br />setxbuf(screen[i].scr_buf);<br />fx_ptr = screen[i].scr_buf;<br />}<br />}<br />_delay_ms(1000);<br />}<br />}<br /><br />void show_tables(void)<br />{<br />draw_table(left);<br />draw_table(top);<br />draw_table(right);<br />draw_table(bottom);<br />draw_table(center);<br />draw_m_f();<br />_delay_ms(1000);<br />}<br />void show_moves(void)<br />{<br />uint16_t temp_ptr = fx_ptr;<br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if(screen[i].function != center)<br />{<br />for(uint8_t j = 0; j &lt; 12; j++)<br />{<br />if( screen[i].game[j] == EMPTY )<br />{<br />char buffer[12];<br />uint8_t x, y;<br />x = 80 * (j % 4);<br />y = 80 * (j / 4);<br />fx_ptr = screen[i].scr_buf;<br />itoa(moves, buffer, 10);<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts_P( x+20, y+34, PSTR(&quot;   &quot;), black, BG_COLOR );<br />tft_puts( x+20, y+34, buffer, black, BG_COLOR );<br />}<br />}<br />}<br />}<br />fx_ptr = temp_ptr;<br />}<br /><br />void end_game(void)<br />{<br />uint8_t correct = 0;<br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if(screen[i].function == center)<br />{<br />for(uint8_t j = 0; j &lt; 12; j++)<br />{<br />if( screen[i].game[j] == j ) correct++;<br />}<br />if(correct == 12)<br />{<br />display_ending();<br />}<br />}<br />}<br />}<br /><br />void display_ending(void)<br />{<br />for(uint8_t i = 0; i &lt;= 4; i++)<br />{<br />if(screen[i].function != center)<br />{<br />for(uint8_t j = 0; j &lt; 12; j++)<br />{<br />if( screen[i].game[j] == EMPTY )<br />{<br />char buffer[12];<br />itoa(moves, buffer, 10);<br />uint8_t x, y;<br />x = 80 * (j % 4);<br />y = 80 * (j / 4);<br />fx_ptr = screen[i].scr_buf;<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts_P( x, y+19, PSTR(&quot;You win&quot;), black, BG_COLOR );<br />tft_puts( x+20, y+34, buffer, black, BG_COLOR );<br />tft_puts_P( x+10, y+49, PSTR(&quot;Moves&quot;), black, BG_COLOR );<br />}<br />}<br />}<br />else<br />{<br />#if mode==work<br />char file[12];<br />uint8_t len;<br />strcpy(file, file_origin);<br />len = strlen(file);<br />strcpy(file, file_origin);<br />uint8_t x, y;<br />fx_ptr = screen[i].scr_buf;<br /><br />x = 80 * (11 % 4);<br />y = 80 * (11 / 4);<br />itoa(screen[i].game[11], &amp;file[len], 10);<br />strcat(file, &quot;.rg8&quot;);<br />tft_bitmap_from_file(x, y, file, NULL );<br />#elif mode==debug<br />uint8_t x, y;<br />fx_ptr = screen[i].scr_buf;<br /><br />char buffer[12];<br />x = 80 * (11 % 4);<br />y = 80 * (11 / 4);<br /><br />tft_fill_rect(x, y, 80, 80,red);<br />itoa(screen[i].game[11], buffer, 10);<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts_P( x+30, y+34, PSTR(&quot;   &quot;), black, red );<br />tft_puts( x+30, y+34, buffer, black, red );<br />#endif<br />}<br />}<br />while(1) show_all();<br />}<br />[/syntax]<br />- game01.h<br />[syntax=c]/*<br /> * game01.h<br /> *<br /> *  Created on: 12-02-2013<br /> *<br /> */<br /><br />#ifndef GAME01_H_<br />#define GAME01_H_<br /><br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;MK_SSD1963/MK_SSD1963.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;MK_STMPE811/mk_stmpe811.h&quot;<br />#include &quot;PetitFS/diskio.h&quot;<br />#include &quot;PetitFS/pff.h&quot;<br /><br />#define BG_COLOR  blue<br />#define LINE_COLOR red<br />#define EMPTY11<br /><br />#define debug 0<br />#define work 1<br />#define mode work<br /><br />extern char file_origin[12];<br /><br />typedef struct{<br />const uint16_t scr_buf;/* address in display's buffer */<br />uint8_t game[12];/* game table */<br />uint8_t last[12];/* last time displayed */<br />uint8_t to_set;/* new block */<br />uint8_t to_clear;/* block to be clean */<br />uint8_t function;/* function of that screen */<br />} SCREEN;<br /><br />enum { left=0, top, right, bottom, center};<br /><br />extern SCREEN screen[5];<br />extern const uint8_t neighborhood[12][4];<br />extern uint8_t empty_block, selected_block;<br />extern uint16_t moves;<br /><br />void draw_all(uint16_t ptr);<br />uint8_t get_block(void);<br /><br />void change_screen(void);<br />void create_tab(void);<br />void rearrange_tab(void);<br /><br />void fill_empty(void);<br />void make_empty(void);<br />void arrange_tab_c(void);<br />void arrange_tab_k(void);<br /><br />void draw_table(uint8_t table);<br />void draw_m_f(void);<br /><br />void check_differences(void);<br />void show_all(void);<br />void show_tables(void);<br />void show_moves(void);<br />void end_game(void);<br />void display_ending(void);<br /><br />#endif /* GAME01_H_ */<br />[/syntax]<br />- reszta to kody dołączone do drugiej książki Mirka.<br /><br />Jak będzie potrzeba to oczywiście mogę wytłumaczyć działanie poszczególnych funkcji, ale do zabawy wystarczy plik hex, którym nalezy zaprogramować ATMEGĘ644PA i przestawić na zewnętrzne taktowanie 20MHz oraz program do generowania obrazków. Następnie obrazki należy wrzucić na kartę, ale wszystkie inne obrazki w formacie rg8 muszą zostać z niej usunięte.<br />Przy starcie program najpierw szuka plików i jak znajdzie to wyświetla nazwę serii i od razu ładuje 4 ekrany. Jak pojawi się napis READY należy dotknąć ekran i ładowany jest jeszcze jeden ekran. Po usłyszeniu sygnału dźwiękowego można zacząć główkować.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 13 lut 2013, o 00:58</p><hr />
]]></content>
</entry>
</feed>