2010-08-04 19 views
10

Estoy trabajando en un proyecto de C incrustado. Tengo una pantalla LCD y para cada personaje hay una matriz de puntos de 5x7. Para mostrar un carácter específico, debe cambiar en 5 bytes que se correlacionan con los puntos para encender. Así que necesito hacer una especie de tabla de búsqueda con una clave donde pueda pasar un carácter ASCII, y obtener una matriz de 5 bytes devueltos ... Por ejemplo, una llamada a esta función como esta,¿Cuál es la mejor manera de hacer una tabla de búsqueda en C?

GetDisplayBytes('A');

debe devolver un array `así ...

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

¿Cuál sería la mejor manera de hacer esto en C?

+0

¿Cuáles son sus estadísticas de velocidad y memoria: qué tan rápido y cuánta RAM? –

+0

Bueno, probablemente almacenara esto en la memoria Flash para que no agote la valiosa RAM. Todavía no tengo requisitos específicos de velocidad o tamaño, pero creo que el más pequeño tendría prioridad sobre el más rápido. – PICyourBrain

+2

Ninguna de las respuestas lo especifica, pero creo que las matrices deberían estar estáticas. –

Respuesta

14

Haría matrices para los bloques ASCII contiguos que desea utilizar. datos. Algo como esto:

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

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

Luego, su GetDisplayBytes() es algo así como:

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

Pasar el puntero devuelto a cualquier función da salida a los datos:

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

Esto es bueno, pero ¿qué ocurre si no quiero que CADA valor ASCII esté disponible para imprimir? Supongamos que solo quiero las letras mayúsculas, los números y un par de símbolos (<,>,!,?). En ese caso, su enfoque no me obligaría a usar espacio de memoria innecesario. – PICyourBrain

+0

Lo siento, debería haber especificado eso en la pregunta para comenzar ... – PICyourBrain

+0

@Jordan S, simplemente use una tabla de búsqueda diferente para cada bloque ascii no contiguo. Editaré mi respuesta con un ejemplo. –

3
typedef char LCDDATA[5]; 

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

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

Esto es, básicamente, haciendo una matriz de matrices.

+0

No hay razón por la cual este método no se pueda alinear como el de Carl. –

+1

+1 para hacer tipear correctamente y no jugar juegos con aritmética. Sin embargo, algunas cosas menores: su prototipo debe ser 'LCDDATA GetDisplayBytes (unsigned char chr)' y también es inusual usar mayúsculas y minúsculas para los nombres de tipos, convencionalmente estas están reservadas para macros. –

+0

@Jens: Una vez hice esto usando macros, y el hábito se mantuvo. –

Cuestiones relacionadas