在C中执行查找表的最佳方式是什么?

问题描述:

我正在开发嵌入式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

我会为要使用的连续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

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