Skocz do zawartości

Prośba o pomoc w rozwiązaniu problemu - wywołanie tft.drawBitmap z danymi z tablicy


Kiko

Pomocna odpowiedź

Witam wszystkich. Mój pierwszy post - proszę o wyrozumiałość. 

Mam sporą zagwozdkę i nie mogę ruszyć z miejsca. Być może w ogóle wybrałem złą metodę i marnuję niepotrzebnie czas. Dotyczy przekazywania danych z tablicy do funkcji rysującej bitmapy.

Korzystam z biblioteki Adafruit__GFX.h oraz funkcji  drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color);.

Mam do wyświetlenia na ekranie tft bitmapy zadeklarowane jako:

const byte bitmapa_1 [] PROGMEM = {
  0x0f, 0x00, 0x1f, 0x00, 0x3b, 0x80, 0x71, 0x80, 0x61, 0x80, 0xe1, 0x80, 0xc1, 0x80, 0xc3, 0x80,
  0xe7, 0x00, 0x7f, 0x00, 0x3e, 0x00, 0x00, 0x00};

const byte bitmapa_2 [] PROGMEM = {
 0x1f, 0x00, 0x7f, 0xc0, 0xe1, 0xe0, 0xc0, 0x60, 0xc0, 0xe0, 0xe3, 0xc0, 0x7f, 0x80, 0x3e, 0x00};

Mam też zadeklarowaną tablicę, w której mam zapisane: wspX, wspY, szer, wys, stan - gdzie są zapisane współrzędne x i y na ekranie, szerokość i wysokość bitmapy w pikselach oraz stan - aktywny czy nieaktywny - czyli kolor, w moim przypadku kolor czarny czyli 0 lub tła 0x9D32.

#define NIEAKTYWNY 0x9D32  //kolor bitmapy nieaktywnej
#define AKTYWNY 0          //kolor bitmapy aktywnej

uint16_t bitmapy[2][5]={
{27,73,9,12,AKTYWNY}, //bitmapa_1  x,y,szer,wys,aktywność
{38,83,12,8,NIEAKTYWNY}, //bitmapa_2
};

Chcąc wyświetlić bitmapy na ekranie, przekazuję te dane do funkcji wyświetlającej bitmapę:

tft.drawBitmap(bitmapy[0][0], bitmapy[0][1], bitmapa_1, bitmapy[0][2], bitmapy[0][3], bitmapy[0][4]);
albo drugą:
tft.drawBitmap(bitmapy[1][0], bitmapy[1][1], bitmapa_2, bitmapy[1][2], bitmapy[1][3], bitmapy[1][4]);

I to oczywiście działa.

Teraz, chciałbym zapisać w tablicy adres tych dwóch bitmap. W tym celu dodałem do tablicy jeszcze jeden element - z przeznaczeniem na adres bitmapy.

Myślałem, że da się to w taki sposób:

uint16_t bitmapy[2][6]={
{27,73, &bitmapa_1,9,12,AKTYWNY}, //adres bitmapa_1  x,y, adres bitmapy,szer,wys, aktywność
{38,83,&bitmapa_2,12,8,NIEAKTYWNY}, //adres bitmapa_2   
};

I że "da się" wyświetlić bitmapy wywołując jako np.:

tft.drawBitmap(bitmapy[0][0], bitmapy[0][1], bitmapy[0][2], bitmapy[0][3], bitmapy[0][4], bitmapy[0][5]);

Nie da się. 

Moje pytanie, czy dobrze kombinuję - czy może w ogóle nie da się tego zrealizować w ten sposób? 

Edytowano przez Kiko
Link do komentarza
Share on other sites

 

Dnia 19.06.2024 o 14:25, Kiko napisał:

const byte bitmapa_1 [] PROGMEM = {
  0x0f, 0x00, 0x1f, 0x00, 0x3b, 0x80, 0x71, 0x80, 0x61, 0x80, 0xe1, 0x80, 0xc1, 0x80, 0xc3, 0x80,
  0xe7, 0x00, 0x7f, 0x00, 0x3e, 0x00, 0x00, 0x00};

 

Dnia 19.06.2024 o 14:25, Kiko napisał:

uint16_t bitmapy[2][6]={
{27,73, &bitmapa_1,9,12,AKTYWNY}, //adres bitmapa_1  x,y, adres bitmapy,szer,wys, aktywność
{38,83,&bitmapa_2,12,8,NIEAKTYWNY}, //adres bitmapa_2   
};

Jeżeli chcesz umieścić na pozycji, którą zaznaczyłeś, adres początku tablicy bitmapa_1 to powinieneś po prostu użyć wyrażenia bitmapa_1.  W języku C/C++ nazwa tablicy jest jednocześnie adresem (wskaźnikiem do) pierwszego elementu tablicy. W tym przypadku wartość wyrażenia bitmapa_1 jest typu byte *. Czyli takiego, jaki oczekuje Twoja funkcja drawBitmap(). Jeżeli użyjesz wyrażenia &bitmapa_1, to otrzymasz wartość typu byte ** - adres (wskaźnik do) wskaźnika - niezgodność typów i... nie o to Ci chodziło zapewne.

Edytowano przez ReniferRudolf
  • Lubię! 2
Link do komentarza
Share on other sites

Zaznaczam, że nie jestem ekspertem od Arduino, ale jak coś na samym początku z Arduino (Pro Micro) i LCD, to w połączeniu z PROGMEM, żeby dobrać się potem do tych danych należało użyć:

pgm_read_word(&obrazek[i])

inaczej jakieś śmieci wychodziły.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dziękuję za porady. Ogólnie rozwiązałem to tworząc dodatkową tablicę, która zawiera wskaźniki na poszczególne bitmapy:

//tablica wskaźników na bitmapy

const uint8_t *bitmapy[5] = {

  bmp1, bmp2, bmp3, bmp4, bmp5

};

 

 

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.