2010-08-04 4 views
10

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

GetDisplayBytes('A');

должен возвращать `массив как это ...

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

что бы быть лучшим способом сделать это в C?

+0

Какова ваша скорость и статистика памяти: насколько быстро и сколько оперативной памяти? –

+0

Ну, я бы, вероятно, сохранил это во флеш-памяти, чтобы я не использовал ценную оперативную память. У меня пока нет каких-либо конкретных требований к скорости или размеру, но я думаю, что наименьшее будет иметь преимущество перед самым быстрым. – PICyourBrain

+2

Ни один из ответов не определяет это, но я считаю, что массив (ы) должен быть статическим. –

ответ

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

Pass возвращаемый указатель на то, что функция выводит данные:

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

Это хорошо, но что делать, если я не хочу делать КАЖДОЕ значение ASCII доступным для печати. Скажем, мне нужны только буквы в верхнем регистре, цифры и пара символов (<,>,!,?). В этом случае ваш подход не потребует от меня использования ненужного пространства памяти. – PICyourBrain

+0

Извините, я должен был указать, что в вопросе для начала ... – PICyourBrain

+0

@Jordan S, просто используйте другую таблицу поиска для каждого несмежного блока ascii. Я отредактирую свой ответ на примере. –

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

Нет причин, по которым этот метод не может варьироваться, как у Карла. –

+1

+1 для правильного ввода и не игры с арифметикой. Некоторые незначительные вещи: ваш прототип должен быть «LCDDATA GetDisplayBytes (unsigned char chr)», а также необычно использовать все кепки для имен типов, обычно они зарезервированы для макросов. –

+0

@Jens: Я когда-то делал это с помощью макросов, и привычка прилипала. –

Смежные вопросы