Какой лучший способ сделать таблицу поиска в C? - PullRequest
11 голосов
/ 04 августа 2010

Я работаю над проектом C для встраиваемых систем.У меня есть ЖК-дисплей и для каждого символа есть матрица 5х7 точек.Чтобы отобразить определенный символ, вы должны сдвинуться на 5 байтов, которые соотносятся с точками для включения.Поэтому мне нужно создать какую-нибудь справочную таблицу с ключом, в которой я могу передать символ ASCII и получить возвращаемый массив из 5 байтов ... Например, вызов этой функции, такой как

GetDisplayBytes('A');

должен возвращать `массив, подобный этому ...

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

Каков наилучший способ сделать это в C?

Ответы [ 2 ]

14 голосов
/ 04 августа 2010

Я бы сделал массивы для смежных блоков 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]);
  }
}
2 голосов
/ 04 августа 2010
typedef char LCDDATA[5];   

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

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

Это в основном массив массивов.

...