0

我有三个数组,像这样,包含我的位图图像:

static unsigned char __attribute__ ((progmem)) impostazioni_logo[]={

0x00, 0x02, 0x7E, 0x02, 0x00, 0x00, 0x78, 0x10, 0x08, 0x08, 0x08, 0x70, 0x10, 0x08,    0x08, 0x08,
0x70, 0x00, 0x00, 0x78, 0x10, 0x08, 0x08, 0x08, 0x10, 0x60, 0x00, 0x00, 0x60, 0x10, 0x08, 0x08,
0x08, 0x10, 0x60, 0x00, 0x00, 0x30, 0x48, 0x48, 0x08, 0x08, 0x10, 0x00, 0x00, 0x08, 0x7E, 0x08,
0x08, 0x08, 0x00, 0x00, 0x50, 0x48, 0x48, 0x48, 0x70, 0x00, 0x00, 0x08, 0x08, 0x08, 0x48, 0x28,
0x18, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x60, 0x10, 0x08, 0x08, 0x08, 0x10, 0x60, 0x00, 0x00, 0x78,
0x10, 0x08, 0x08, 0x08, 0x08, 0x70, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x08, 0x0F, 0x08, 0x00, 0x00,
0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x7F, 0x08, 0x08,
0x08, 0x08, 0x04, 0x03, 0x00, 0x00, 0x03, 0x04, 0x08, 0x08, 0x08, 0x04, 0x03, 0x00, 0x00, 0x04,
0x08, 0x08, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x07, 0x08, 0x08, 0x08, 0x00, 0x07, 0x08, 0x08,
0x08, 0x04, 0x0F, 0x00, 0x00, 0x0C, 0x0A, 0x09, 0x08, 0x08, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x00,
0x03, 0x04, 0x08, 0x08, 0x08, 0x04, 0x03, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F,
0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  };

现在我想要一个函数通过传递 page 参数返回正确的数组以在 lcd 上显示。

unsigned char logo(int page){
 char buffer[32];
  switch(page){
    case 1:
       for(int i=0;i<sizeof(impostazioni_logo);i++){
        strcpy_P(buffer,pgm_read_byte(&(impostazioni_logo[i]))); //<==pgm_read_byte comes from here:http://www.arduino.cc/en/Reference/PROGMEM
       }  
    break;
  }
   return buffer;

} 它不起作用。编译器告诉我关于转换的一些错误。

EDIT:

caller 是一个绘制正确图像的简单函数。不同页面的图像可能不同。页数接近20:

void drawLogo(){
 glcd.drawbitmap(15,1, logo(), 90,16); //display lcd library for ST7565

}
4

1 回答 1

1

这段代码有几个问题:

  1. 返回类型logounsigned char当您返回时char *
  2. pgm_read_byte 应该返回一个字节,所以你可以简单地做buffer[i]=pgm_read_byte(...)
  3. buffer您尝试返回的内容分配在堆栈上,并且在函数返回后将不存在。

您可能应该strlcpy_P改用。

更新:
1.假设您有固定数量的页面。尝试为每页创建一个位图,例如:

static unsigned char __attribute__ ((progmem)) impostazioni_logo_page1[]={..}

2. 返回指向每个页面徽标的指针:

unsigned char* logo(int page)
{
  switch(page)
  {
    case 1:
       return impostazioni_logo_page1;
    break;
  }
  return NULL;
}

如果您希望将所有位图放在一个数组中,请计算数组中的偏移量并将其返回:

int offset = page_num*page_size_in_chars;    
return &impostazioni_logo_all_pages[offset];

更新 2:管理页面的另一个选项:

static unsigned char* pages[] = { impostazioni_logo_page1, impostazioni_logo_page2, ... }
...
glcd.drawbitmap(15,1, pages[page_index], 90,16);
于 2012-11-14T03:41:07.453 回答