2010-08-04 114 views
10

我正在開發嵌入式C項目。我有一個LCD顯示屏,每個字符都有一個5x7點陣。要顯示一個特定的字符,你必須以5個字節進行移位,並與要打開的點相關聯。因此,我需要使用一個可以傳遞一個ASCII字符的密鑰來創建某種查找表,並獲取返回的5個字節的數組... 例如,對此功能的調用,在C中執行查找表的最佳方式是什麼?

GetDisplayBytes('A');

應該返回`這樣的數組...

C[0] = 0x7E : C[1] = 0x90 : C[2] = 0x90 : C[3] = 0x90 : C[4] = 0x7E

什麼是用C做到這一點的最好方法是什麼?

+0

什麼是你的速度和內存統計:多快和多少內存? – 2010-08-04 18:27:54

+0

那麼我可能會將其存儲在閃存中,這樣我就不會使用有價值的RAM。我沒有任何具體的速度或尺寸要求,但我想最小會優先於最快。 – PICyourBrain 2010-08-04 18:31:20

+2

沒有答案指定這個,但我相信這個數組應該是靜態的。 – 2015-07-23 20:32:13

回答

14

我會爲要使用的連續ASCII塊創建數組。數據。事情是這樣的:

uint8_t displayBytesLetters[] = 
{ 
    0x73, 0x90, 0x90, 0x90, 0x73, // 'A' 
    . 
    . 
    . 
}; 

uint8_t displayBytesDigits[] = 
{ 
    0x12, 0x15, 0x25, 0x58, 0x80, // '0' 
    . 
    . 
    . 
}; 

那麼你GetDisplayBytes()是一樣的東西:

uint8_t *GetDisplayBytes(char c) 
{ 
    if (isdigit(c)) 
    return &displayBytes[5*(c - '0')]; 
    else if (isupper(c)) 
    return &displayBytes[5*(c - 'A')]; 
    else 
    return NULL; 
} 

將返回的指針任何函數輸出數據:

void DoDisplay(uint8_t *displayBytes) 
{ 
    int i; 
    for (i = 0; i < 5; i++) 
    { 
    SendOutput(displayBytes[i]); 
    } 
} 
+0

這很好,但如果我不想使每個ASCII值都可用於打印,該怎麼辦。說我只想要大寫字母,數字和幾個符號(<,>,!,?)。在這種情況下,您的方法不會要求我使用不必要的內存空間。 – PICyourBrain 2010-08-04 18:33:45

+0

對不起,我應該在這個問題中指定... – PICyourBrain 2010-08-04 18:34:01

+0

@Jordan S,然後爲每個非連續的ascii塊使用一個不同的查找表。我會用一個例子來編輯我的答案。 – 2010-08-04 18:36:06

3
typedef char LCDDATA[5]; 

LCDDATA lcdTable[256] = { {0,0,0,0,0}, // char 0 
          {.....},  // char 1 

LCDDATA GetDisplayBytes(char chr) 
{ 
    return lcdTable[chr]; 
} 

這基本上使一組數組。

+0

沒有理由不能像卡爾的那樣排列這個方法。 – 2010-08-04 18:32:32

+1

+1用於正確輸入並且不用算術玩遊戲。儘管有一些小問題:你的原型應該是'LCDDATA GetDisplayBytes(unsigned char chr)',並且使用所有類型名稱的大寫字符也是不尋常的,通常這些都是爲宏保留的。 – 2010-08-04 19:23:49

+0

@Jens:我曾經使用宏來做這個,並且習慣被貼上了。 – 2010-08-04 19:41:43

相關問題