2010-08-04 3 views
10

Ich arbeite an einem Embedded C-Projekt. Ich habe ein LCD Display und für jedes Zeichen gibt es eine 5x7 Punktmatrix. Um ein bestimmtes Zeichen anzuzeigen, müssen Sie 5 Bytes verschieben, die mit den zu schaltenden Punkten korrelieren. Also muss ich eine Art Look-Up-Tabelle mit einem Schlüssel, wo ich ein ASCII-Zeichen übergeben kann, und bekomme ein Array von 5 Bytes zurückgegeben ... Zum Beispiel, ein Anruf zu dieser Funktion wie folgt,Was ist der beste Weg, um eine Nachschlagetabelle in C zu erstellen?

GetDisplayBytes('A');

zurückkehren sollte `ein Array wie folgt ...

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

Was wäre der beste Weg, dies in C zu tun?

+0

Was sind Ihre Geschwindigkeits- und Speicherwerte: Wie schnell und wie viel Arbeitsspeicher? –

+0

Nun, ich würde das wahrscheinlich im Flash-Speicher speichern, damit ich nicht wertvollen RAM nutze. Ich habe noch keine spezifischen Geschwindigkeits- oder Größenanforderungen, aber ich denke, dass der kleinste Vorrang vor dem schnellsten hat. – PICyourBrain

+2

Keine der Antworten gibt dies an, aber ich glaube, das Array sollte statisch gemacht werden. –

Antwort

14

Ich würde Arrays für die zusammenhängende ASCII-Blöcke, die Sie verwenden möchten. Daten. Etwas wie folgt aus:

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

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

Dann wird Ihr GetDisplayBytes() ist so etwas wie:

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

Geben Sie die zurückgegebene Zeiger auf das, was Funktion, um die Daten ausgibt:

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

Das ist gut, aber was, wenn ich nicht möchte, dass JEDER ASCII-Wert zum Drucken verfügbar ist. Angenommen, ich möchte nur die Großbuchstaben, die Zahlen und ein paar Symbole (<,>,!,?). In diesem Fall würde ich nicht unnötig Speicherplatz benötigen. – PICyourBrain

+0

Entschuldigung, ich hätte angegeben, dass in der Frage zu beginnen mit ... – PICyourBrain

+0

@ Jordan S, verwenden Sie einfach eine andere Nachschlagetabelle für jeden nicht zusammenhängenden Ascii-Block dann. Ich bearbeite meine Antwort mit einem Beispiel. –

3
typedef char LCDDATA[5]; 

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

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

Diese im Grunde macht ein Array von Arrays.

+0

Es gibt keinen Grund, warum diese Methode nicht so weit reichen kann wie Carls. –

+1

+1 für das richtige Tippen und nicht für Spiele mit Arithmetik. Einige kleinere Dinge: Ihr Prototyp sollte 'LCDDATA GetDisplayBytes (unsigned char chr)' sein und es ist auch ungewöhnlich, alle Großbuchstaben für Typnamen zu verwenden, normalerweise sind diese für Makros reserviert. –

+0

@Jens: Ich habe dies einmal mit Makros gemacht, und die Gewohnheit geklebt. –