<?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=13266&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-16T19:41:05+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=13266&amp;mode</id>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2015-10-16T19:41:05+01:00</updated>
<published>2015-10-16T19:41:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13266&amp;p=142655#p142655</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13266&amp;p=142655#p142655"/>
<title type="html"><![CDATA[[BIBLIOTEKA] LPH9157-2 wyświetlacz TFT 176x132]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13266&amp;p=142655#p142655"><![CDATA[
Kilka słów wstępu:<br />Od zawsze miałem słabość do kolorowych wyświetlaczy LCD. Gdy zaczynałem moją przygodę z programowaniem (bascom), chciałem jak najszybciej nauczyć się obsługi takich wyświetlaczy.  <br />Potem gdzieś w sieci ujrzałem ten filmik, autorstwa Pana Mirka:<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 />I można by powiedzieć, że był on takim wzorem dla mnie, co chciałbym osiągnąć. Jakiś czas temu wykorzystałem już jeden wyświetlacz z Siemensa C65, w projekcie, który z resztą prezentowałem tutaj na forum, &quot;namiastka komputera pokładowego&quot;. Ale to był bascom...<br /><br />Ktoś może zapytać, po co bawić się &quot;nieznanymi&quot; wyświetlaczami, skoro teraz można kupić dedykowany w dość dobrej cenie. A no można, ale większość z nas posiada duże ilość starej elektroniki, no i co tu z tym zrobić? Wyrzucić szkoda, trzeba wykorzystać. <br /><br />Tym razem na celownik wziąłem troszkę większy wyświetlacz, pochodzi z telefonu Siemens C75. Kiedyś te telefony były popularne i pewnie u niejednego gdzieś się taki wala. Jego rozdzielczość 132x176 16bitów. W telefonach tych były montowane dwa rodzaje wyświetlaczy, jeden z zieloną płytką o oznaczeniach LPH9157-2 (biblioteka jest właśnie dla niego), oraz drugi z żółtą płytką, nazywany ALPS. <br /><br />Jako, że w połowie września podjąłem decyzję o nauce C i zakupiłem BB, uznałem że najlepszym sposobem do nauki będzie wykonanie czegoś w praktyce (oczywiście po wcześniejszym przeczytaniu książki od A do Z  <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> ). <br /><br />O wyświetlaczu nie miałem za dużo informacji, jedynie gdzieś na zagranicznych stronach jakieś komendy sterujące. Prawdę mówiąc do tej pory nie wiem, jaki dokładnie sterownik tam siedzi, wiem że jest on w większości zgodny z ILI9163. I to na podstawie dokumentacji tego sterownika opierałem się podczas wszelkich testów. Różnice są między innymi w rozdzielczości wyświetlacza, ilość wysyłanych parametrów. <br /><br />Na początku opis wyprowadzeń wyświetlacza:<br /><a href="https://obrazkiforum.atnel.pl/3542/d59457009ecf7af05c2f0befd76797ef.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3542/d59457009ecf7af05c2f0befd76797ef.jpg" alt="Obrazek" /></a><br /><br />Jak widać, nie ma większego problemu, aby dolutować się tam z taśmą.<br /><br />Minimalne podłączanie wygląda następująco:<br /><a href="https://obrazkiforum.atnel.pl/3542/da64b17b760d2dbf7dcaaaf99f979f6a.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3542/da64b17b760d2dbf7dcaaaf99f979f6a.png" alt="Obrazek" /></a><br /><br />Oczywiście to jest minimalne, warto dodać jednak rezystor od CS do plusa zasilania. <br />Co do pinu RST mamy dwie możliwości, podłączyć go na stałe do plusa zasilania, lub do mikroprocesora. Trzeba to wybrać też w bibliotece. Jeśli podłączamy do plusa, wykonywany jest podczas inicjalizacji reset programowy, jeśli sterujemy linią RST wykonywany jest reset sprzętowy, są tam minimalne różnice co do wartości kilku rejestrów po resecie, mało istotne z naszego punktu obsługi wyświetlacza.<br /><br />Gdyby kogoś przerażała potrzeba dodatkowego napięcia 12V dla zasilenia podświetlenia spokojnie, są dedykowane układy driverów step-up. Piny GND i LED- nie są połączone.<br /><br />Wyświetlacz ten zasilany jest typowo(w telefonie) napięciem 2,9V, jednak z napięciem 3.3V również poprawnie działa.<br /><br />A więc aby nie zanudzać kod:<br /><strong>display.h</strong> -tutaj dokonujemy wszelkich ustawień<br />[syntax=c]//-----------------------------------------------------------------------------------------------------------<br />// *** Obsługa kolorowego wyświetlaczy TFT 132x176 LPH9157-2 ***<br />//<br />//Biblioteka do obsługi kolorowego wyświetlaca TFT z telefonu Siemens C75 i podobne.<br />//Umożliwia wyświetlanie bitmap 24 bitowych RGB888 oraz 16 bitowych RGB565 z karty SD.<br />//<br />//<br />// Data : październik 2015<br />// Autor : Anonimowy<br />//----------------------------------------------------------------------------------------------------------<br />#ifndef DISPLAY_H_<br />#define DISPLAY_H_<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//Ustawienie pinów sprzętowego SPI<br />//<br />//----------------------------------------------------------------------------------------<br />#define MOSI PB5<br />#define SCK PB7<br />#define CSPB4<br />#define SPI_DDRDDRB<br />#define SPI_PORTPORTB<br />//Makrodefinicje sterujące linią CS wyświetlacza<br />#define CS_ON SPI_PORT &amp;= ~(1&lt;&lt;CS)<br />#define CS_OFF SPI_PORT |= (1&lt;&lt;CS)<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//Ustawienie pozostałych pinów wyświetlacza<br />//<br />//----------------------------------------------------------------------------------------<br />#define RSPB2<br />#define RS_DDRDDRB<br />#define RS_PORTPORTB<br /><br />//#define RSTPB3//zakomentuj, jeśli RST połączony z VCC<br />#define RST_DDRDDRB<br />#define RST_PORTPORTB<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//Parametry pracy wyświetlacza<br />//<br />//----------------------------------------------------------------------------------------<br />#define USE_MEM_CONTROL0x80//orientacja wyświetlacza<br />#define USE_PALETTE0x05//paleta kolorów, 0x05 - 16 bit, 0x02 - 8bit<br />//odkomentuj, jeśli wykorzystujesz tryb częściowy wyświetlacza<br />//#define USE_SPARTIAL 20//adres początku trybu częściowego wyświetlacza<br />//#define USE_EPARTIAL 155//adres końca trybu częściowego wyświetlacza<br />#define IMG_BUF2048//rozmiar buforu zdjęcia<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//USTAWIENIA KOMPILACJI<br />//<br />//1 - oznacza WŁĄCZENIE do kompilacji<br />//0 - oznacza wyłączenie z kompilacji (funkcja niedostępna)<br />//<br />//----------------------------------------------------------------------------------------<br />#define USE_INT_DISPLAY1//wyświetla zmienną jako liczbę dziesiętną<br />#define USE_TEXT_DISPLAY1//wyświetla napis z pamięci programu<br />#define USE_IMG_DISPLAY1//wyświetla zdjęcie z karty SD<br />#define USE_CLS_DISPLAY1//wypełnia wyświetlacz danym kolorem<br />#define USE_LINE_DISPLAY1//rysuje linie<br />#define USE_CIRCLE_DISPLAY1//rysuje okręg<br />#define USE_DRAW_DISPLAY1//rysuje prostokąt wypełniony kolorem<br />//----------------------------------------------------------------------------------------<br /><br />//komendy sterujące<br />#define LCD_NOP0x00//kończy zapis/odczyt ramki z pamięci<br />#define SOFT_RST0x01//wykonuje programowy reset wyświetlacza<br />#define SLEEP_IN0x10//wprowadza wyświetlacz w tryb uśpienia, zmiejszając pobór prądu<br />#define SLEEP_OUT0x11//wyprowadza wyświetlacz z trybu uśpienia<br />#define PARTIAL_MODE0x12//włącza tryb częściowy wyświetlacza<br />#define NORMAL_MODE0x13//przywraca tryb normalne pracy po trybie częściowym lub przewijaniu<br />#define INVERSION_OFF0x20//wyłącza tryb inwersji (odwrócenia) kolorów<br />#define INVERSION_ON0x21//włącza tryb inwersji (odwrócenia) kolorów<br />#define GAMMA_SET0x26//umożliwia wybór jednej z 4 krzywych gamma, domyśle 0x01<br />//Parametr 0x01 -1 ; 0x02 - 2 ; 0x04 - 3 ; 0x08 - 4<br />#defineDISPLAY_OFF0x28//deaktywuje wyświetlanie, wyświetla pustą stronę<br />#define DISPLAY_ON0x29//aktywuje wyświetlanie<br />#define COLUMN_ADDR0x2A//określia obszar zapisu do pamięci danych dla y<br />//Parametr_1: adres początkowy; Parametr_2: adres końcowy;<br />#define PAGE_ADDR0x2B//określia obszar zapisu do pamięci danych dla x<br />//Parametr_1: adres początkowy; Parametr_2: adres końcowy;<br />#define MEM_WRITE0x2C//rozpoczyna początek zapisu do pamięci danych<br />#definePARTIAL_AREA0x30//definiuje obszar wyświetlania w trybie cześciowym<br />//Parametr_1: wiersz początkowy; Parametr_2: wiersz końcowy;<br />#define MEM_CONTROL0x36//definiuje kierunek odczytu / zapisu  pamięci danych<br />//Parametr: MY,MX,MV,ML,RGB,MH,x,x<br />#define IDLE_OFF0x38//wyprowadza wyświetlacz z trybu oczekiwania<br />#define IDLE_ON0x39//wprowadza wyświetlacz w tryb oczekiwania, wyrażanie kolorów jest zmiejszone<br />#define PALETTE0x3A//definiuje format danych RGB<br />//Parametr: 0x02 - 8bit ; 0x03 - 12bit ; 0x05 - 16 bit<br />//----------------------------------------------------------------------------------------<br /><br /><br />//definicja podstawowych kolorów<br />#if ( USE_PALETTE == 0x05)<br />#define black0x0000<br />#define white0xFFFF<br />#define red0xF800<br />#define green0x07E0<br />#define blue0x001F<br />#define brown0x6180<br />#define cyan0x07FF<br />#define lime0x97A0<br />#define orange0xFD20<br />#define purple0xB81F<br />#define grey0xDEBA<br />#define pink0xFE19<br />#define yellow0xFFE0<br />#elif ( USE_PALETTE == 0x02)<br />#define black0x00<br />#define white0xFF<br />#define red0xE0<br />#define green0x1C<br />#define blue0x03<br />#define brown0xD0<br />#define cyan0x1D<br />#define lime0xBC<br />#define orange0xF8<br />#define purple0xC1<br />#define grey0xB5<br />#define pink0xF7<br />#define yellow0xFC<br />#endif<br />//----------------------------------------------------------------------------------------<br /><br /><br />// deklaracje funkcji<br />void Init_SPI (void);<br />void Init_Display (void);<br />void CLS_Display (uint16_t color);<br />void Text_Display(const char * str, uint8_t x, uint8_t y, uint16_t fontc, uint16_t backc, uint8_t scale);<br />void Int_Display(int val, uint8_t x, uint8_t y, uint16_t fontc, uint16_t backc, uint8_t scale);<br />void Img_Display(char *filename, uint8_t x, uint8_t y);<br />void Line_Display(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint16_t color);<br />void Circle_Display(uint8_t x0, uint8_t y0, uint8_t radius, uint16_t color);<br />void Draw_Display(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint16_t color);<br />//----------------------------------------------------------------------------------------<br />#endif /* DISPLAY_H_ */[/syntax]<br />Widzę, że syntax coś niepoprawnie wyrównuje niektóre wartości.<br /><br /><strong>font.c</strong> -nasza podstawowa czcionka<br />[syntax=c]//-----------------------------------------------------------------------------------------------------------<br />// *** Obsługa kolorowego wyświetlaczy TFT 132x176 LPH9157-2 ***<br />//<br />//Biblioteka do obsługi kolorowego wyświetlaca TFT z telefonu Siemens C75 i podobne.<br />//Umożliwia wyświetlanie bitmap 24 bitowych RGB888 oraz 16 bitowych RGB565 z karty SD.<br />//<br />//<br />// Data : październik 2015<br />// Autor : Anonimowy<br />//----------------------------------------------------------------------------------------------------------<br /><br />#ifndef DISPLAY_FONT_H_<br />#define DISPLAY_FONT_H_<br /><br />const char font &#91;&#93; &#91;8&#93; PROGMEM = {<br />{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//SPACJA<br />{0x00,0x00,0x06,0x5f,0x06,0x00,0x00,0x00},// !<br />{0x00,0x07,0x03,0x00,0x07,0x03,0x00,0x00},// &quot;<br />{0x00,0x24,0x7e,0x24,0x7e,0x24,0x00,0x00},// #<br />{0x00,0x24,0x2b,0x6a,0x12,0x00,0x00,0x00},// $<br />{0x00,0x63,0x13,0x08,0x64,0x63,0x00,0x00},// %<br />{0x00,0x36,0x49,0x56,0x20,0x50,0x00,0x00},// &amp;<br />{0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x00},// '<br />{0x00,0x00,0x3e,0x41,0x00,0x00,0x00,0x00},// (<br />{0x00,0x00,0x41,0x3e,0x00,0x00,0x00,0x00},// )<br />{0x00,0x08,0x3e,0x1c,0x3e,0x08,0x00,0x00},// *<br />{0x00,0x08,0x08,0x3e,0x08,0x08,0x00,0x00},// +<br />{0x00,0x00,0xe0,0x60,0x00,0x00,0x00,0x00},// ,<br />{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},// -<br />{0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00},// .<br />{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},// /<br />{0x00,0x3e,0x51,0x49,0x45,0x3e,0x00,0x00},// 0<br />{0x00,0x00,0x42,0x7f,0x40,0x00,0x00,0x00},// 1<br />{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},// 2<br />{0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00},// 3<br />{0x00,0x18,0x14,0x12,0x7f,0x10,0x00,0x00},// 4<br />{0x00,0x2f,0x49,0x49,0x49,0x31,0x00,0x00},// 5<br />{0x00,0x3c,0x4a,0x49,0x49,0x30,0x00,0x00},// 6<br />{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},// 7<br />{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},// 8<br />{0x00,0x06,0x49,0x49,0x29,0x1e,0x00,0x00},// 9<br />{0x00,0x00,0x6c,0x6c,0x00,0x00,0x00,0x00},// :<br />{0x00,0x00,0xec,0x6c,0x00,0x00,0x00,0x00},// ;<br />{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},// &lt;<br />{0x00,0x24,0x24,0x24,0x24,0x24,0x00,0x00},// =<br />{0x00,0x00,0x41,0x22,0x14,0x08,0x00,0x00},// &gt;<br />{0x00,0x02,0x01,0x59,0x09,0x06,0x00,0x00},// ?<br />{0x00,0x3e,0x41,0x5d,0x55,0x1e,0x00,0x00},// @<br />{0x00,0x7e,0x11,0x11,0x11,0x7e,0x00,0x00},// A<br />{0x00,0x7f,0x49,0x49,0x49,0x36,0x00,0x00},// B<br />{0x00,0x3e,0x41,0x41,0x41,0x22,0x00,0x00},// C<br />{0x00,0x7f,0x41,0x41,0x41,0x3e,0x00,0x00},// D<br />{0x00,0x7f,0x49,0x49,0x49,0x41,0x00,0x00},// E<br />{0x00,0x7f,0x09,0x09,0x09,0x01,0x00,0x00},// F<br />{0x00,0x3e,0x41,0x49,0x49,0x7a,0x00,0x00},// G<br />{0x00,0x7f,0x08,0x08,0x08,0x7f,0x00,0x00},// H<br />{0x00,0x00,0x41,0x7f,0x41,0x00,0x00,0x00},// I<br />{0x00,0x30,0x40,0x40,0x40,0x3f,0x00,0x00},// J<br />{0x00,0x7f,0x08,0x14,0x22,0x41,0x00,0x00},// K<br />{0x00,0x7f,0x40,0x40,0x40,0x40,0x00,0x00},// L<br />{0x00,0x7f,0x02,0x04,0x02,0x7f,0x00,0x00},// M<br />{0x00,0x7f,0x02,0x04,0x08,0x7f,0x00,0x00},// N<br />{0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00},// O<br />{0x00,0x7f,0x09,0x09,0x09,0x06,0x00,0x00},// P<br />{0x00,0x3e,0x41,0x51,0x21,0x5e,0x00,0x00},// Q<br />{0x00,0x7f,0x09,0x09,0x19,0x66,0x00,0x00},// R<br />{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},// S<br />{0x00,0x01,0x01,0x7f,0x01,0x01,0x00,0x00},// T<br />{0x00,0x3f,0x40,0x40,0x40,0x3f,0x00,0x00},// U<br />{0x00,0x1f,0x20,0x40,0x20,0x1f,0x00,0x00},// V<br />{0x00,0x3f,0x40,0x3c,0x40,0x3f,0x00,0x00},// W<br />{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},// X<br />{0x00,0x07,0x08,0x70,0x08,0x07,0x00,0x00},// Y<br />{0x00,0x71,0x49,0x45,0x43,0x00,0x00,0x00},// Z<br />{0x00,0x00,0x7f,0x41,0x41,0x00,0x00,0x00},// &#91;<br />{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},// \ //<br />{0x00,0x00,0x41,0x41,0x7f,0x00,0x00,0x00},// &#93;<br />{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},// ^<br />{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},// _<br />{0x00,0x00,0x03,0x07,0x00,0x00,0x00,0x00},// `<br />{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},// a<br />{0x00,0x7f,0x44,0x44,0x44,0x38,0x00,0x00},// b<br />{0x00,0x38,0x44,0x44,0x44,0x28,0x00,0x00},// c<br />{0x00,0x38,0x44,0x44,0x44,0x7f,0x00,0x00},// d<br />{0x00,0x38,0x54,0x54,0x54,0x08,0x00,0x00},// e<br />{0x00,0x08,0x7e,0x09,0x09,0x00,0x00,0x00},// f<br />{0x00,0x18,0xa4,0xa4,0xa4,0x7c,0x00,0x00},// g<br />{0x00,0x7f,0x04,0x04,0x78,0x00,0x00,0x00},// h<br />{0x00,0x00,0x00,0x7d,0x40,0x00,0x00,0x00},// i<br />{0x00,0x40,0x80,0x84,0x7d,0x00,0x00,0x00},// j<br />{0x00,0x7f,0x10,0x28,0x44,0x00,0x00,0x00},// k<br />{0x00,0x00,0x00,0x7f,0x40,0x00,0x00,0x00},// l<br />{0x00,0x7c,0x04,0x18,0x04,0x78,0x00,0x00},// m<br />{0x00,0x7c,0x04,0x04,0x78,0x00,0x00,0x00},// n<br />{0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00},// o<br />{0x00,0xfc,0x44,0x44,0x44,0x38,0x00,0x00},// p<br />{0x00,0x38,0x44,0x44,0x44,0xfc,0x00,0x00},// q<br />{0x00,0x44,0x78,0x44,0x04,0x08,0x00,0x00},// r<br />{0x00,0x08,0x54,0x54,0x54,0x20,0x00,0x00},// s<br />{0x00,0x04,0x3e,0x44,0x24,0x00,0x00,0x00},// t<br />{0x00,0x3c,0x40,0x20,0x7c,0x00,0x00,0x00},// u<br />{0x00,0x1c,0x20,0x40,0x20,0x1c,0x00,0x00},// v<br />{0x00,0x3c,0x60,0x30,0x60,0x3c,0x00,0x00},// w<br />{0x00,0x6c,0x10,0x10,0x6c,0x00,0x00,0x00},// x<br />{0x00,0x9c,0xa0,0x60,0x3c,0x00,0x00,0x00},// y<br />{0x00,0x64,0x54,0x54,0x4c,0x00,0x00,0x00},// z<br />{0x00,0x08,0x3e,0x41,0x41,0x00,0x00,0x00},// {<br />{0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00},// |<br />{0x00,0x00,0x41,0x41,0x3e,0x08,0x00,0x00},// }<br />{0x00,0x02,0x01,0x02,0x01,0x00,0x00,0x00} // ~<br />};<br /><br />#endif /* DISPLAY_FONT_H_ */[/syntax]<br /><br />No i w końcu najważniejsze:<br /><strong>display.c</strong><br />[syntax=c]//-----------------------------------------------------------------------------------------------------------<br />// *** Obsługa kolorowego wyświetlaczy TFT 132x176 LPH9157-2 ***<br />//<br />//Biblioteka do obsługi kolorowego wyświetlaca TFT z telefonu Siemens C75 i podobne.<br />//Umożliwia wyświetlanie bitmap 24 bitowych RGB888 oraz 16 bitowych RGB565 z karty SD.<br />//<br />//<br />// Data : październik 2015<br />// Autor : Anonimowy<br />//----------------------------------------------------------------------------------------------------------<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;display.h&quot;<br />#include &quot;font.h&quot;<br />#include &quot;../PetitFS/diskio.h&quot;<br />#include &quot;../PetitFS/pff.h&quot;<br /><br />//********************* FUNKCJE WEWNĘTRZNE *********************<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//Wysłanie komendy przez sprzętowy SPI<br />//<br />//----------------------------------------------------------------------------------------<br />static void send_cmd (uint8_t cmd){<br />RS_PORT &amp;= ~(1&lt;&lt;RS);//RS -komenda<br />SPDR = cmd;//załaduj bajt do rejestru<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));//czekaj na koniec wysyłania<br />RS_PORT |= (1&lt;&lt;RS);//RS -dana -dla przyśpieszenia ładowania danych<br />}<br /><br />//----------------------------------------------------------------------------------------<br />//<br />// Wysłanie danej przez sprzętowy SPI<br />//<br />//----------------------------------------------------------------------------------------<br />static inline void send_data (uint8_t data){<br />SPDR = data;//załaduj bajt do rejestru<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));//czekaj na koniec wysyłania<br />}<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//Ustawienie pola zapisu do pamięci RAM<br />//<br />//----------------------------------------------------------------------------------------<br />static void set_field (uint8_t startX, uint8_t stopX, uint8_t startY, uint8_t stopY){<br />send_cmd (COLUMN_ADDR);//ustaw zakres zapisu do RAM dla y<br />send_data (startY);<br />send_data (stopY);<br />send_cmd (PAGE_ADDR);//ustaw zakres zapisu do RAM dla x<br />send_data (startX);<br />send_data (stopX);<br />send_cmd (MEM_WRITE);//rozpocznij zapis do RAM<br />}<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//Aktywacja pojedynczego pixela<br />//<br />//----------------------------------------------------------------------------------------<br />static void set_pixel(uint8_t x, uint8_t y, uint16_t color){<br />CS_ON;<br />set_field (x, x, y, y);<br />#if USE_PALETTE == 0x05//jeśli paleta 16 bitów<br />send_data (color &gt;&gt; 8);//wyślij pierwszy bajt koloru<br />send_data (color);//wyślij drugi bajt koloru<br />#elif USE_PALETTE == 0x02//jeśli paleta 8 bitów<br />send_data (color);//wyślij bajt koloru<br />#endif<br />CS_OFF;<br />}<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//Wysyłanie pojedyńczego znaku<br />//<br />//----------------------------------------------------------------------------------------<br />static void send_char (char znak, uint16_t fontc, uint16_t backc, uint8_t scale){<br />uint8_t i, cnt,cnt_2, cnt_3, pixel;<br /><br />for (i = 0 ; i &lt; 8 ; i++){<br />pixel = pgm_read_byte(&amp;font&#91;(znak-32)&#93;&#91;i&#93;);//pobierz bajt znaku<br />for (cnt_2 = 0; cnt_2 &lt; scale; cnt_2++){//skalowanie czcionki -kolumny<br />for (cnt = 0; cnt &lt; 8; cnt++){<br />for (cnt_3 = 0; cnt_3 &lt; scale; cnt_3++){//skalowanie czcionki -wiersze<br />if (pixel &amp; (1 &lt;&lt; cnt) ){//jesli pixel aktywny<br />#if USE_PALETTE == 0x05//jeśli paleta 16 bitów<br />send_data (fontc &gt;&gt; 8);//wyślij pierwszy bajt koloru<br />send_data (fontc);//wyślij drugi bajt koloru<br />#elif USE_PALETTE == 0x02//jeśli paleta 8 bitów<br />send_data (fontc);//wyślij bajt koloru<br />#endif<br />}<br />else{//jeśli pixel nieaktywny<br />#if USE_PALETTE == 0x05//jeśli paleta 16 bitów<br />send_data (backc &gt;&gt; 8);//wyślij pierwszy bajt koloru<br />send_data (backc );//wyślij drugi bajt koloru<br />#elif USE_PALETTE == 0x02//jeśli paleta 8 bitów<br />send_data (backc);//wyślij bajt koloru<br />#endif<br />}<br />}<br />}<br />}<br />}<br />}<br /><br />#if USE_IMG_DISPLAY == 1<br />//----------------------------------------------------------------------------------------<br />//<br />// Ładowanie zdjęcia 16 bitowego<br />//<br />//----------------------------------------------------------------------------------------<br />void IMG_16(char * bufor, uint32_t * offset, uint16_t buf_size){<br />BYTE res;<br />WORD len;<br />uint16_t cnt;<br /><br />res = pf_lseek(*offset);//ustaw wskaźnik pliku na początek tablicy pikseli<br />if (!res){<br />do{<br />res = pf_read(bufor, buf_size, &amp;len);//pobierz dane do buforu<br />CS_ON;<br />for (cnt = 0; cnt &lt; len; cnt +=2){//wyślij zawartośc buforu do pamięci wyświetlacza<br />send_data(*(bufor + cnt + 1));<br />send_data(*(bufor + cnt));<br />}<br />CS_OFF;<br />}while ((len  == buf_size) &amp;&amp; !res);//zakończ jeśli koniec pliku lub błąd odczytu pliku<br />}<br /><br />}<br /><br />//----------------------------------------------------------------------------------------<br />//<br />// Ładowanie zdjęcia 24 bitowego<br />//<br />//----------------------------------------------------------------------------------------<br />void IMG_24(char * bufor, uint32_t * offset, uint16_t buf_size){<br />BYTE res;<br />WORD len;<br />uint16_t cnt;<br />uint8_t R, G, B;<br /><br />res = pf_lseek(*offset);//ustaw wskaźnik pliku na początek tablicy pikseli<br />while ( buf_size % 3) buf_size--;//rozmiar buforu musi byc podzielny przez 3<br />if (!res){<br />do{<br />res = pf_read(bufor, buf_size, &amp;len);//pobierz dane do buforu<br />CS_ON;<br />for (cnt = 0; cnt &lt; len; cnt +=3){<br />R = (*(bufor + cnt + 2));//pobierz trzy składowe koloru<br />G = (*(bufor + cnt + 1));<br />B = (*(bufor + cnt));<br />send_data((R &amp; 0xF8) | (G &gt;&gt;5));//zamień na RGB565 oraz wyślij do pamięci wyświetlacza<br />send_data(((G &lt;&lt; 3) &amp; 0xE0) | (B &gt;&gt; 3));<br />}<br />CS_OFF;<br />}while ((len  == buf_size) &amp;&amp; !res);//zakończ jeśli koniec pliku lub błąd odczytu pliku<br />}<br />}<br />#endif<br /><br />//**************************************************************<br /><br /><br />//****************** FUNKCJE DLA UŻYTKOWNIKA *******************<br />//----------------------------------------------------------------------------------------<br />//<br />//Inicjalizacja SPI<br />//<br />//----------------------------------------------------------------------------------------<br />void Init_SPI (void){<br />SPI_DDR |= (1&lt;&lt;MOSI) | (1&lt;&lt;SCK) | (1&lt;&lt;CS);//piny SPI jako wyjście<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR);//SPI ON, tryb master, CLK/4<br />SPSR |= (1&lt;&lt;SPI2X);//CLK/2 -podwojona prędkośc<br />}<br /><br />//----------------------------------------------------------------------------------------<br />//<br />//Inicjalizacja wyświetlacza<br />//<br />//----------------------------------------------------------------------------------------<br />void Init_Display (void){<br />CS_ON;<br />RS_DDR |= (1&lt;&lt;RS);//RS jako wyjście<br />#ifdef RST//jeśli korzystamy z sprzętowego resetu<br />RST_DDR |= (1&lt;&lt;RST);//RST jako wyjście<br />RST_PORT &amp;= ~(1&lt;&lt;RST);//impuls resetujący<br />_delay_us(20);//minimum 10us<br />RST_PORT |= (1&lt;&lt;RST);//koniec impulsu resetującego<br />#else//jeśli nie korzystamy z programowego resetu<br />send_cmd (SOFT_RST);//wykonaj reset sprzętowy<br />#endif<br />_delay_ms(120);//czas niezbędny do przywrócenia domyslnych wartości rejestrów<br />send_cmd (SLEEP_OUT);//wyjdź z trybu uśpienia<br />_delay_ms(5);//minimalny czas powrotu do stanu pracy<br />send_cmd (MEM_CONTROL);//kierunek odczytu / zapisu  pamięci danych<br />send_data (USE_MEM_CONTROL);<br />send_cmd (PALETTE);//format danych RGB<br />send_data (USE_PALETTE);<br />#ifdef USE_SPARTIAL//jeśli tryb częściowy wyświetlaca<br />send_cmd (PARTIAL_AREA);//definiuj obszar trybu częściowego<br />send_data (USE_SPARTIAL);//wyślij adres początku trybu częściowego<br />send_data (USE_EPARTIAL);//wyślij adres końca trybu częściowego<br />send_cmd (PARTIAL_MODE);//włącz tryb częściowy<br />#endif<br />send_cmd (DISPLAY_ON);//aktywuj wyświetlanie<br />CS_OFF;<br />}<br /><br />#if USE_CLS_DISPLAY == 1<br />//----------------------------------------------------------------------------------------<br />//<br />//Czyszczenie wyświetlacza<br />//<br />//----------------------------------------------------------------------------------------<br />void CLS_Display (uint16_t color){<br />uint16_t i;<br /><br />CS_ON;<br />set_field (0, 175, 0, 131);//ustaw pole robocze -cały wyświetlacz<br />for (i = 0; i &lt; 23232 ; i++){<br />#if USE_PALETTE == 0x05//jeśli paleta 16 bitów<br />send_data (color &gt;&gt; 8);//wyślij pierwszy bajt koloru<br />send_data (color);//wyślij drugi bajt koloru<br />#elif USE_PALETTE == 0x02//jeśli paleta 8 bitów<br />send_data (color);//wyślij bajt koloru<br />#endif<br />}<br />CS_OFF;<br />}<br />#endif<br /><br />#if USE_TEXT_DISPLAY == 1<br />//----------------------------------------------------------------------------------------<br />//<br />//Wyśwetlanie napisu z pamięci programu<br />//<br />//----------------------------------------------------------------------------------------<br />void Text_Display(const char * str, uint8_t x, uint8_t y, uint16_t fontc, uint16_t backc, uint8_t scale ){<br />char znak;<br /><br />CS_ON;<br />set_field (x, 175, y, (y + (8 * scale) - 1));//ustaw pole robocze<br />while ( (znak = pgm_read_byte(str++)) ){//pobierz znak z pamięci programu<br />send_char(znak, fontc, backc, scale);//wyświetl znak<br />}<br />send_cmd (LCD_NOP);//zakończ zapis do pamięci RAM<br />CS_OFF;<br />}<br />#endif<br /><br />#if USE_INT_DISPLAY == 1<br />//----------------------------------------------------------------------------------------<br />//<br />//Wyśwetlanie zmiennej<br />//<br />//----------------------------------------------------------------------------------------<br />void Int_Display(int val, uint8_t x, uint8_t y, uint16_t fontc, uint16_t backc, uint8_t scale ){<br />char buf&#91;10&#93;, znak;<br />uint8_t i = 0;<br /><br />itoa(val, buf, 10);<br />CS_ON;<br />set_field (x, 175, y, (y + (8 * scale) - 1));//ustaw pole robocze<br />while ( (znak = buf&#91;i++&#93;) ){//pobierz znak z pamięci programu<br />send_char(znak, fontc, backc, scale);//wyświetl znak<br />}<br />send_cmd (LCD_NOP);//zakończ zapis do pamięci RAM<br />CS_OFF;<br />}<br />#endif<br /><br />#if USE_IMG_DISPLAY == 1<br />//----------------------------------------------------------------------------------------<br />//<br />//Wyświetlanie zdjęcia z karty SD<br />//<br />//----------------------------------------------------------------------------------------<br />void Img_Display(char *filename, uint8_t x, uint8_t y){<br />char bufor&#91;IMG_BUF&#93; ;<br />BYTE res, bitCount;<br />WORD len;<br />FATFS fs;<br />uint32_t offset, height, width;<br /><br />res = pf_mount(&amp;fs);//zamontuj system plików<br />if (!res){<br />res = pf_open(filename);//otwórz folder<br />if (!res){<br />res = pf_read(bufor, 29, &amp;len);//odczytaj początek pliku -nagłówek<br />if (!res &amp;&amp; len == 29){<br />if (bufor&#91;0&#93; == 'B' &amp;&amp; bufor&#91;1&#93; == 'M' ){//sprawdź czy plikiem jest bitmapa<br />offset = ((ULONG)bufor&#91;13&#93; &lt;&lt; 24) | ((ULONG)bufor&#91;12&#93; &lt;&lt; 16) | ((ULONG)bufor&#91;11&#93; &lt;&lt; 8) | ((ULONG)bufor&#91;10&#93;);<br />width = ((ULONG)bufor&#91;21&#93; &lt;&lt; 24) | ((ULONG)bufor&#91;20&#93; &lt;&lt; 16) | ((ULONG)bufor&#91;19&#93; &lt;&lt; 8) | ((ULONG)bufor&#91;18&#93;);<br />height = ((ULONG)bufor&#91;25&#93; &lt;&lt; 24) | ((ULONG)bufor&#91;24&#93; &lt;&lt; 16) | ((ULONG)bufor&#91;23&#93; &lt;&lt; 8) | ((ULONG)bufor&#91;22&#93;);<br />bitCount = bufor&#91;28&#93;;<br />if ((width + y) &lt;= 132 &amp;&amp; (height + x) &lt;= 176 &amp;&amp; !(width % 4) ){<br />CS_ON;<br />set_field (x, (height -1 + x ), y, (width -1 + y )); //ustaw pole robocze<br />CS_OFF;<br />if (bitCount == 16){//jeśli bitmapa 16 bitowa<br />IMG_16(bufor, &amp;offset, sizeof(bufor));<br />}else if (bitCount == 24) {//jeśli bitmapa 24 bitowa<br />IMG_24(bufor, &amp;offset, sizeof(bufor));<br />}else Text_Display (PSTR(&quot;PALETTE ERROR&quot;), 36, 112, red, white, 1);<br />}else Text_Display (PSTR(&quot;SIZE ERROR&quot;), 48, 112, red, white, 1);<br />}else Text_Display (PSTR(&quot;BITMAP ERROR&quot;), 40, 112, red, white, 1);<br />}else Text_Display (PSTR(&quot;READ ERROR&quot;), 48, 112, red, white, 1);<br />}else Text_Display (PSTR(&quot;OPEN FILE ERROR&quot;), 28, 112, red, white, 1);<br />}else Text_Display (PSTR(&quot;MOUNT ERROR&quot;), 44, 112, red, white, 1);<br />pf_mount(NULL);<br />}<br />#endif<br /><br />#if USE_DRAW_DISPLAY == 1<br />//----------------------------------------------------------------------------------------<br />//<br />//Rysowanie prostokątów<br />//<br />//----------------------------------------------------------------------------------------<br />void Draw_Display(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint16_t color){<br />uint16_t i;<br /><br />CS_ON;<br />set_field (x0, x1, y0, y1);//ustaw pole robocze<br />for (i = 0; i &lt; (((x1 - x0) + 1) * ((y1 - y0) + 1)) ; i++){<br />#if USE_PALETTE == 0x05//jeśli paleta 16 bitów<br />send_data (color &gt;&gt; 8);//wyślij pierwszy bajt koloru<br />send_data (color);//wyślij drugi bajt koloru<br />#elif USE_PALETTE == 0x02//jeśli paleta 8 bitów<br />send_data (color);//wyślij bajt koloru<br />#endif<br />}<br />CS_OFF;<br />}<br />#endif<br /><br />#if USE_LINE_DISPLAY == 1<br />//----------------------------------------------------------------------------------------<br />//<br />//Rysowanie lini<br />//<br />//----------------------------------------------------------------------------------------<br />void Line_Display(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint16_t color){<br />int d, ai, bi;<br />uint8_t dx, dy;<br />int8_t xi, yi;<br /><br />if (x1 &lt; x2){// ustal kierunku rysowania dla x<br />xi = 1;<br />dx = x2 - x1;<br />}<br />else{<br />xi = -1;<br />dx = x1 - x2;<br />}<br />if (y1 &lt; y2){// ustal kierunku rysowania dla y<br />yi = 1;<br />dy = y2 - y1;<br />}<br />else{<br />yi = -1;<br />dy = y1 - y2;<br />}<br />set_pixel(x1, y1, color);//aktywuj pierwszy piksel<br />if (dx &gt; dy){// oś wiodąca OX<br />ai = (dy - dx) * 2;<br />bi = dy * 2;<br />d = bi - dx;<br />while (x1 != x2){// pętla dla x<br />if (d &gt;= 0){<br />x1 += xi;<br />y1 += yi;<br />d += ai;<br />}<br />else{<br />d += bi;<br />x1 += xi;<br />}<br />set_pixel(x1, y1, color);//aktywuj pixel<br />}<br />}<br />else{// oś wiodąca OY<br />ai = (dx - dy) * 2;<br />bi = dx * 2;<br />d = bi - dy;<br />while (y1 != y2){// pętla dla y<br />if (d &gt;= 0){<br />x1 += xi;<br />y1 += yi;<br />d += ai;<br />}<br />else{<br />d += bi;<br />y1 += yi;<br />}<br />set_pixel(x1, y1, color);//aktywuj pixel<br />}<br />}<br />}<br />#endif<br /><br />#if USE_CIRCLE_DISPLAY == 1<br />//----------------------------------------------------------------------------------------<br />//<br />//Rysowanie okręgu<br />//<br />//----------------------------------------------------------------------------------------<br />void Circle_Display(uint8_t x0, uint8_t y0, uint8_t radius, uint16_t color){<br />uint8_t x = radius;<br />int y = 0;<br />int z = 1 - x;<br /><br />while( y &lt;= x ){<br />set_pixel( x + x0,  y + y0, color);//aktywuj pixel<br />set_pixel( y + x0,  x + y0, color);//aktywuj pixel<br />set_pixel(-x + x0,  y + y0, color);//aktywuj pixel<br />set_pixel(-y + x0,  x + y0, color);//aktywuj pixel<br />set_pixel(-x + x0, -y + y0, color);//aktywuj pixel<br />set_pixel(-y + x0, -x + y0, color);//aktywuj pixel<br />set_pixel( x + x0, -y + y0, color);//aktywuj pixel<br />set_pixel( y + x0, -x + y0, color);//aktywuj pixel<br />    y++;<br />    if (z&lt;=0){<br />    z += 2 * y + 1;<br />    }<br />    else{<br />    x--;<br />    z += 2 * (y - x) + 1;<br />    }<br />}<br />}<br />#endif[/syntax]<br /><br />Jak można zauważyć, w bibliotece wykorzystuję bibliotekę PetitFS, przystosowaną do tego celu. Tam w pliku <strong>diskio.h</strong> ustawiamy podłączenie pinu CS karty pamięci:<br />[syntax=c]//Ustawienie pinu CS karty SD<br />#define CS_SDPD5<br />#define SD_DDRDDRD<br />#define SD_PORTPORTD<br />/*---------------------------------------*/[/syntax]<br />Cała biblioteka lekkimi zmianami w załączniku wraz z moją biblioteką do obsługi LCD.<br /><br />Jak widać w pliku display.h mamy możliwość włączania/wyłączania z kompilacji pewnych funkcji. A co dostajemy?<br /> -Możliwość wyświetlenie zmiennej jako liczby dziesiętnej w dowolnym miejscu wyświetlacza, wraz z skalowaniem czcionki,<br /> -Możliwość wyświetlenia tekstu z pamięci programu w dowolnym miejscu wyświetlacza, wraz z skalowaniem czcionki,<br /> -Możliwość czyszczenia wyświetlacza dowolnym kolorem,<br /> -Możliwość rysowania dowolnej linii według podanych współrzędnych początku i końca,<br /> -Możliwość rysowania prostokątów według podanych współrzędnych dwóch rogów,<br /> -Możliwość rysowania okręgów według podanych współrzędnych środka oraz promienia,<br /> <strong>-Możliwość wyświetlania bitmap 16 bitowych RGB565 oraz 24 bitowych RGB888 prosto z karty SD w dowolnym miejscu wyświetlacza.</strong><br /><br />Te funkcje wystarczą nam, do stworzenia naprawdę dużej ilości efektów.<br /><br />W tym samym pliku mamy jeszcze kilka ustawień, są stosowne komentarze.<br /><br />Fajnie, biblioteka jest ale. No właśnie trzeba było iść na pewne kompromisy:<br /> -Zdecydowałem się na wykorzystanie jedynie sprzętowego SPI z powodu prędkości. Jeśli ktoś chce, nie jest problemem zmiana na SPI programowe<br />Więcej ograniczeń jest, jeśli chodzi o wyświetlanie bitmap:<br /> -Rozmiar bitmapy nie może przekroczyć 176x132 piksele <br /> -Obsługiwane bitmapy 16 bitów są w RGB565, nie windowsowy RGB555<br /> -Z powodu sposobu mapowania pamięci bitmapy na kartę muszą być ładowane obrócone o 90 stopni w lewo<br /> -Wysokość bitmapy (czyli po obróceniu o 90 stopni szerokość) musi być podzielna przez 4. Wynika to z struktury pliku, a chciałem aby funkcja działała możliwie szybko.<br /><br />Wypisane są wszystkie przetestowane przeze mnie komendy sterujące, nie wszystkie wykorzystuję w bibliotece, jednak opisałem je, jeśli ktoś chciałby je wykorzystać.<br />Wyświetlacz obsługuję paletę 8 bitów, 12 bitów i 16 bitów. Biblioteka umożliwia korzystanie jedynie z 8 i 16 bitów, przy czym bitmapy wyświetlać można jedynie w trybie 16 bitowym. <br /><br />Myślę, że przyda się również przykład pliku <strong>main.c</strong>, aby nie było niedomówień:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 1 paź 2015<br /> *      Author: Anonimowy<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br /><br />#include &quot;DISPLAY/display.h&quot;<br />#include &quot;PetitFS/diskio.h&quot;<br />#include &quot;PetitFS/pff.h&quot;<br /><br /><br />int main(void) {<br />BYTE ress;<br />char file_name&#91;&#93; = &quot;bitmapa.bmp&quot;;<br /><br />Init_SPI();<br />ress = disk_initialize();<br />Init_Display();<br /><br />CLS_Display(black);<br />Text_Display (PSTR(&quot;ATNEL&quot;), 8, 20, white, black, 2);<br />Draw_Display(25, 56, 35, 75, green);<br />Circle_Display(88, 66, 55, yellow);<br />Line_Display(88, 66, 88, 30, orange);<br />_delay_ms(3000);<br />if (!ress){<br />Img_Display(file_name,0,0);<br />}<br />while(1){<br /><br />}<br /><br />}[/syntax]<br /><br />Jak widać, proste jak drut <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Teraz kilka słów podsumowania:<br />Od czasu gdy zakupiłem BB minął zaledwie miesiąc, świadczy to o tym, jak szybko ta książka uczy. Pomogło również to, że liznąłem w życiu już kilka różnych języków. Nie prawdą jest to co mówią, że trudno jest przejść z bascom na C. Fakt, pewne przyzwyczajenia pozostają i może są jakieś błędy w kodzie, dlatego proszę o wyrozumiałość, w C piszę bardzo krótko.<br />Jedno jest pewnie, napisanie tej biblioteki wiele mnie nauczyło, pomogło rozumieć wskaźniki, podział na pliki i zastosowanie tablicy wielowymiarowej (w bascomie tego nie miałem  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> ).<br /><br />No i na koniec, pragnąc dogonić wzór, efekty. <br />Mam nadzieję, że Pan Mirek nie obrazi się, że kopiowałem jego efekty oraz, że wykorzystałem jego wizerunek -to dla dobra nauki  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> <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 />Testy wykonywane na Atmega644, kwarc 17,720MHz.<br />Niestety nie udało mi się uzyskać ładnej animacji kota, mimo ładowania tylko małej ramki z miejscem, które ulega zmianie. Ładowanie z karty SD jest za wolne, może moja funkcja ładowania grafiki jest jakaś ociężała, może Pan Mirek ładował to z pamięci programu -nie wiem.<br /><br />Niemniej, gdyby kogoś interesowało rysowanie linii, okręgów, prostokątów jeden po drugim jest programowo opóźniane dla efektów, funkcje z biblioteki działają stosunkowo szybko.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 16 paź 2015, o 19:41</p><hr />
]]></content>
</entry>
</feed>