数组和位图 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] ));
}
我正在做一个项目,我需要使用 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] ));
}