数组和位图 arduino

Arrays and bitmaps arduino

我正在做一个项目,我需要使用 arduino gfx 库在我的 5.0" tft 显示器上显示位图。为了生成这些位图,我将它们转换为字节数组并将它们存储在另一个数组中,例如这 :

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;然后位图被完全绘制。

谁能帮帮我?

谢谢

常量有效,因为编译器可以优化数组 array,并使用直接指向 'pointed to array' 的指针。

当使用变量时,array被保留,随后被放入PROGMEM。 您看到的这种效果是未正确使用 PROGMEM 数据的结果。

您将不得不使用 pgm_read_word 正确提取指针。

而不是:

array[page]

您需要使用:

(unsigned char*) pgm_read_word( &array[page] )

试试这个:

  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] ));
  }