Я работаю над проектом, в котором мне нужно отображать растровые изображения на моем 5,0-дюймовом TFT-дисплее с использованием библиотек arduino gfx. Чтобы сгенерировать эти растровые изображения, я преобразовал их в байтовый массив и сохранил их в другом массиве примерно так:
const unsigned char* const array[] PROGMEM = {
one,//one, two, ... are the names of various arrays containing bitmaps
two,
three,
four,
five,
six,
seven,
eight,
nine,
};
Я использую следующую функцию для рисования растровых изображений:
void make(int x, int y)
{
for (int i =0; i<=151; i+= 150){
for (int j = 0; j < 601; j+= 150){
tft.drawBitmap(x+j,y+i,array[page],100,100,RA8875_GREEN);//page is defined as a global variable
}
}
}
}
Проблема в том, что если я использую изменяющуюся переменную, например страницу, растровое изображение отображается не полностью
Однако, если я использую константу, такую как int a = 0; тогда растровое изображение рисуется полностью.
Может кто-нибудь мне помочь?
Спасибо
попробуй это :
Serial.print("element_arr[alpha]: ");
Serial.println(element_arr[alpha]);
Serial.print("Patterns : ");
arrayA = ((element_arr[alpha] -1)/ 10);
Serial.println(arrayA);
colourA = (element_arr[alpha]) % 10 == 0 ? 9:(element_arr[alpha]) % 10 -1;
Serial.print("ColourA is : ");
Serial.println(colourA);
if (arrayA == 0){
tft.drawBitmap(x + j, y + i, array[0], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==1){
tft.drawBitmap(x + j, y + i, array[1], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==2){
tft.drawBitmap(x + j, y + i, array[2], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==3){
tft.drawBitmap(x + j, y + i, array[3], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==4){
tft.drawBitmap(x + j, y + i, array[4], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==5){
tft.drawBitmap(x + j, y + i, array[5], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==6){
tft.drawBitmap(x + j, y + i, array[6], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==7){
tft.drawBitmap(x + j, y + i, array[7], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==8){
tft.drawBitmap(x + j, y + i, array[8], 120, 120, pgm_read_word( &colour[colourA] ));
}else if (arrayA==9){
tft.drawBitmap(x + j, y + i, array[9], 120, 120, pgm_read_word( &colour[colourA] ));
}
Константа работает, потому что компилятор может оптимизировать массив array
прочь, и используется указатель прямо на «указал на массив».
При использовании переменной, array
хранится, а затем положить в PROGMEM
,
Этот эффект, который вы видите, является результатом неиспользования PROGMEM
данные правильно.
Вам придется использовать pgm_read_word
правильно извлечь указатель.
Вместо:
array[page]
Вам нужно будет использовать:
(unsigned char*) pgm_read_word( &array[page] )