jueves, 13 de febrero de 2020

mostrar caracteres ASCII

En la entrada anterior ya hicimos un pequeño ejemplo de como se podían visualizar letras y números. Ahora vamos a implementar un array (font) con las imágenes de la mayoría de caracteres ASCII y una función específica (muestraCaracter) para verlos en la matriz de LEDs. Ambos hay que incluirlos en el archivo funcionesMicrobit.ino, el array al principio, donde se declaran las variables, y muestraCaracter con el resto de funciones.

/* font[59][5]
 *  Array con las imagenes bmp de gran parte de los caracteres ASCII
 *  Se inician con el espacio en blanco (código ASCII 32) y finalizan
 *  con la letra Z (código ASCII 91). No hemos incluido
 *  las letras minúsculas.
 */
byte font[59][5] = {{B00000,B00000,B00000,B00000,B00000},  //espacio
                    {B00100,B00100,B00100,B00000,B00100},  //!
                    {B01100,B01100,B00000,B00000,B00000},  //"
                    {B01010,B11111,B01010,B11111,B01010},  //#
                    {B01110,B10100,B01100,B00110,B11100},  //$
                    {B11001,B11010,B00100,B01011,B10011},  //%
                    {B01100,B10010,B01101,B10010,B01101},  //&
                    {B00100,B00100,B00000,B00000,B00000},  //'
                    {B00100,B01000,B01000,B01000,B00100},  //(
                    {B01000,B00100,B00100,B00100,B01000},  //)
                    {B00000,B01010,B00100,B01010,B00000},  //*
                    {B00000,B00100,B01110,B00100,B00000},  //+
                    {B00000,B00000,B00000,B01000,B01000},  //,
                    {B00000,B00000,B01110,B00000,B00000},  //-
                    {B00000,B00000,B00000,B00100,B00000},  //.
                    {B00001,B00010,B00100,B01000,B10000},  ///
                    {B01100,B10010,B10010,B10010,B01100},  //0
                    {B00100,B01100,B00100,B00100,B01110},  //1
                    {B11100,B00010,B01100,B10000,B11110},  //2
                    {B11100,B00010,B11100,B00010,B11100},  //3
                    {B10010,B10010,B01110,B00010,B00010},  //4
                    {B11110,B10000,B11100,B00010,B11100},  //5
                    {B01110,B10000,B11100,B10010,B01100},  //6
                    {B11110,B00010,B00100,B00100,B00100},  //7
                    {B01100,B10010,B01100,B10010,B01100},  //8
                    {B01100,B10010,B01110,B00010,B01100},  //9
                    {B00000,B01000,B00000,B01000,B00000},  //:
                    {B00000,B01000,B00000,B01000,B01000},  //;
                    {B00010,B00100,B01000,B00100,B00010},  //<
                    {B00000,B01110,B00000,B01110,B00000},  //=
                    {B01000,B00100,B00010,B00100,B01000},  //>
                    {B11100,B00010,B01100,B00000,B01000},  //?
                    {B01110,B10001,B10101,B10110,B01100},  //@
                    {B01100,B10010,B11110,B10010,B10010},  //A
                    {B11100,B10010,B11100,B10010,B11100},  //B
                    {B01110,B10000,B10000,B10000,B01110},  //C
                    {B11100,B10010,B10010,B10010,B11100},  //D
                    {B01110,B10000,B11110,B10000,B01110},  //E
                    {B01110,B10000,B11110,B10000,B10000},  //F
                    {B01110,B10000,B10110,B10010,B01110},  //G
                    {B10010,B10010,B11110,B10010,B10010},  //H
                    {B01110,B00100,B00100,B00100,B01110},  //I
                    {B01110,B00010,B00010,B00010,B11100},  //J
                    {B10010,B10010,B11100,B10010,B10010},  //K
                    {B10000,B10000,B10000,B10000,B11110},  //L
                    {B10001,B11011,B10101,B10001,B10001},  //M
                    {B10001,B11001,B10101,B10011,B10001},  //N
                    {B01100,B10010,B10010,B10010,B01100},  //O
                    {B11100,B10010,B11100,B10000,B10000},  //P
                    {B01100,B10010,B10010,B01100,B00100},  //Q
                    {B11100,B10010,B11100,B10010,B10010},  //R
                    {B01110,B10000,B01100,B00010,B11100},  //S
                    {B11111,B00100,B00100,B00100,B00100},  //T
                    {B10010,B10010,B10010,B10010,B01100},  //U
                    {B10001,B10001,B01010,B01010,B00100},  //V
                    {B10001,B10001,B10101,B11011,B10001},  //W
                    {B10001,B01010,B00100,B01010,B10001},  //X
                    {B10001,B10001,B01110,B01110,B00100},  //Y
                    {B11110,B00100,B01000,B10000,B11110}}; //Z

La función es bastante sencilla, simplemente utilizamos muestraImagenesBmp y le restamos al código ASCII el número 32, así empezamos en el primer elemento de nuestro array (font).

void muestraCaracter(byte ascii){
  muestraImagenBmp(font[ascii-32]);
}

El programa adjunto va mostrando todos los caracteres a intervalos de un segundo.

/* muestraCaraceresAscii.ino
 * Visualizamos en la matriz de LEDs los
 * primeros 59 caracteres ASCII imprimibles.
 */

void setup() {
 pinMatrizLedSalidas();
}

/*
 * El número 32 corresponde al primer
 * caracter imprimible. El 91 a la
 * letra Z, que es la última de nuestro
 * array font.
 */
void loop(){
  for(byte i=32; i<91; i++){
    muestraCaracter(i);
    delay_(1000);
  }
}

/*
 * La función que se está ejecutando mientras
 * duran los delay_
 */
void loop_(){
  multiplexaMatrizLed();
}

El parámetro que hay que incluir en la función muestraCaracter(parámetro) puede ser el código ASCII numerico o el caracter encerrado entre comilla simple (por ejemplo: muestraCaracter('F')).