2012-11-14 34 views
0

我有三個陣列,這樣,包含我的位圖圖像:Arduino的 - 如何返回正確的位圖圖像陣列

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: 

調用者是繪製正確圖像的簡單函數。對於不同的頁面,圖像可能不同。頁數接近20:

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

} 

回答

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); 
+0

謝謝。所以請你給我一個簡單的正確的代碼來做到這一點? –

+0

發佈調用無符號字符標誌(int頁面)函數的代碼,我會看到我可以做的... –

+0

我剛剛編輯了我的問題,以便您可以看到簡單的調用者函數 –