0

次のように、ビットマップ イメージを含む 3 つの配列があります。

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,  };

今私は、ページパラメータを渡すことによって、関数が正しい配列を返し、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;
}

すべてのビットマップを 1 つの配列に格納したい場合は、配列内のオフセットを計算し、代わりにそれを返します。

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 に答える