И сновамодуль p10 и библиотека dmd2 (размер)

alexey3
Offline
Зарегистрирован: 25.11.2017

Помогите изменить размер по непонятным причинам пишется всё с отступом на 2 ряда пикселей от верха и от низа а нужно на ширину всего модуля текст сделать. Библиотека dmd2_master, модуль p10, arduino nano, подключение правильное только не пойму где размер текста поменять

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexey3 пишет:
где размер текста поменять

В строке №48.

А вообще, вангую, что это шрифт такой.

alexey3
Offline
Зарегистрирован: 25.11.2017


//Лёха. Просто Лёха... (13.01.2019 04:03):
#include <SPI.h>
#include <DMD2.h>
#include <fonts/Arial_Black_16.h>

#define CLOCK 10
#define DATA 12
#define LATCH 4

byte val = 0;             //начальное значение на экране 
int DLA = 200;            //глобальная задержка на срабатывание кнопок

byte numberSegments[11] = {0b11111110, 0b00101000, 0b01110101, 0b01111001, 0b00101011, 0b01011011,
                           0b01011111, 0b01101000, 0b11111111, 0b11111011, 0b00000000};

SoftDMD dmd(1,1);
DMD_TextBox box(dmd, 12, 1, 64, 16);
 
void setup()
{
//ИНИЦИАЛИЗАЦИЯ ПИНОВ
//_______________________________________________________________________

  pinMode(3, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(CLOCK, OUTPUT);   //CLOCK
  pinMode(DATA, OUTPUT);    //DATA
  pinMode(LATCH, OUTPUT);   //LATCH

//ИНИЦИАЛИЗАЦИЯ ИНДИКАТОРОВ
//_______________________________________________________________________

//СЕМИСЕГМЕНТНЫЙ
//_______________________________________________________________________

  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[val % 10]);
  shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[11]);
  shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[11]);   
  digitalWrite(LATCH, HIGH);

//МАТРИЦА
//_______________________________________________________________________
  
  dmd.setBrightness(255);
  dmd.selectFont(Arial_Black_16);
  dmd.begin();
  box.print(val);
}

void loop()
{

//ОБРАБОТКА ПЕРВОЙ КНОПКИ
//_______________________________________________________________________
  
  if (digitalRead(3) == LOW)
  {
   val = (val + 1);
    if (val <= 9)
      {
        digitalWrite(LATCH, LOW);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[val % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[11]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[11]);   
        digitalWrite(LATCH, HIGH);
    
        DMD_TextBox box(dmd, 12, 1, 64, 16);
        dmd.begin();
        box.print(val);
        delay(DLA);
      }

    if (val >= 10 && val <= 99)
      {
        digitalWrite(LATCH, LOW);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[val % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[(val / 10) % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[11]);   
        digitalWrite(LATCH, HIGH);

        DMD_TextBox box(dmd, 8, 1, 64, 16);
        dmd.begin();
        box.print(val);
        delay(DLA);
      }

    if (val >= 100 && val <= 999)
      {
        digitalWrite(LATCH, LOW);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[val % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[(val / 10) % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[(val / 100) % 10]);  
        digitalWrite(LATCH, HIGH);
        
        DMD_TextBox box(dmd, 3, 1, 64, 16);
        dmd.begin();
        box.print(val);
        delay(DLA);
      }
  }

//ОБРАБОТКА ВТОРОЙ КНОПКИ
//_______________________________________________________________________

  if (digitalRead(5) == LOW)
  {
    val = (val - 1);
    if (val <= 9)
      {
        digitalWrite(LATCH, LOW);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[val % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[11]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[11]);   
        digitalWrite(LATCH, HIGH);
        
        DMD_TextBox box(dmd, 12, 1, 64, 16);
        dmd.begin();
        box.print(val);
        delay(DLA);
      }

    if (val >= 10 && val <= 99)
      {
        digitalWrite(LATCH, LOW);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[val % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[(val / 10) % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[11]);   
        digitalWrite(LATCH, HIGH);
        
        DMD_TextBox box(dmd, 8, 1, 64, 16);
        dmd.begin();
        box.print(val);
        delay(DLA);
      }

    if (val >= 100 && val <= 999)
      {
        digitalWrite(LATCH, LOW);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[val % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[(val / 10) % 10]);
        shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[(val / 100) % 10]);  
        digitalWrite(LATCH, HIGH);

        DMD_TextBox box(dmd, 3, 1, 64, 16);
        dmd.begin();
        box.print(val);
        delay(DLA);
      }
  }
}

 

alexey3
Offline
Зарегистрирован: 25.11.2017

48ая строка какого именно файла библиотеки ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexey3 пишет:

48ая строка какого именно файла 

Того, текст которого Вы привели в стартовом посте этой темы.

alexey3
Offline
Зарегистрирован: 25.11.2017

и вы пророк ето шрифт такой как бы поправить то ((

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Перерисовать. Или вовсе свой уникальный нарисовать. Это просто делается. В любом графическом редакторе рисуете картинки нужного размера (любым шрифтом) и сохраняете их как bmp или png. Так все нужные буквы/цифры и т.д. Напускаете на них LCD Assistant и она из картинок делает готовые массивы для инициализации перемнных (те самые пачки чисел, что Вы видите в шрифте). Ну, собственно всё, осталось просто их в правильном порядке расположить.

alexey3
Offline
Зарегистрирован: 25.11.2017

я прошлый раз говорил не работает у меня ассистент как я только не устанавливал его !!!

Я скетчь приложил помогите изменить размер

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, другую подобную программу найдите. Их как грязи. Вон, например - http://zenway.ru/page/lcd-image-converter и ещё много.

А там, начние с одной буквы: нарисуйте, преобразуйте и подставьте в существующий шрифт. Посмотрите как полчилось, всё поймёте и тогда так весь шрифт.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что Вы приложили? Шрифт же в файле fonts/Arial_Black_16.h

alexey3
Offline
Зарегистрирован: 25.11.2017
/*
 *
 * Arial_Black_16
 *
 * created with FontCreator
 * written by F. Maximilian Thiele
 *
 * http://www.apetech.de/fontCreator
 * me@apetech.de
 *
 * File Name           : Arial_Black_16.h
 * Date                : 10.01.2012
 * Font size in bytes  : 12422
 * Font width          : 10
 * Font height         : 16
 * Font first char     : 32
 * Font last char      : 128
 * Font used chars     : 96
 *
 * The font data are defined as
 *
 * struct _FONT_ {
 *     uint16_t   font_Size_in_Bytes_over_all_included_Size_it_self;
 *     uint8_t    font_Width_in_Pixel_for_fixed_drawing;
 *     uint8_t    font_Height_in_Pixel_for_all_characters;
 *     unit8_t    font_First_Char;
 *     uint8_t    font_Char_Count;
 *
 *     uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1];
 *                  // for each character the separate width in pixels,
 *                  // characters < 128 have an implicit virtual right empty row
 *
 *     uint8_t    font_data[];
 *                  // bit field of all characters
 */

#include <inttypes.h>
#ifdef __AVR__
#include <avr/pgmspace.h>
#elif defined (ESP8266)
#include <pgmspace.h>
#else
#define PROGMEM
#endif

#ifndef ARIAL_BLACK_16_H
#define ARIAL_BLACK_16_H

#define ARIAL_BLACK_16_WIDTH 10
#define ARIAL_BLACK_16_HEIGHT 16

static const uint8_t Arial_Black_16[] PROGMEM = {
    0x30, 0x86, // size
    0x0A, // width
    0x10, // height
    0x20, // first char
    0x60, // char count

    // char widths
    0x00, 0x03, 0x07, 0x0B, 0x09, 0x0E, 0x0B, 0x03, 0x05, 0x05,
    0x06, 0x09, 0x03, 0x05, 0x03, 0x04, 0x08, 0x06, 0x08, 0x08,
    0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x03, 0x03, 0x09, 0x08,
    0x09, 0x08, 0x0C, 0x0C, 0x09, 0x09, 0x09, 0x09, 0x08, 0x0A,
    0x0A, 0x03, 0x09, 0x0C, 0x08, 0x0C, 0x0A, 0x0A, 0x09, 0x0A,
    0x0A, 0x09, 0x0B, 0x0A, 0x0C, 0x10, 0x0C, 0x0B, 0x09, 0x05,
    0x04, 0x05, 0x08, 0x08, 0x03, 0x09, 0x09, 0x09, 0x09, 0x09,
    0x06, 0x09, 0x09, 0x03, 0x04, 0x0A, 0x03, 0x0D, 0x09, 0x09,
    0x09, 0x09, 0x06, 0x08, 0x06, 0x09, 0x09, 0x0F, 0x0B, 0x09,
    0x07, 0x06, 0x02, 0x06, 0x09, 0x08,

    // font data
    0xFE, 0xFE, 0xFE, 0x1D, 0x1D, 0x1D, // 33
    0x1E, 0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 34
    0x30, 0x30, 0xF0, 0xFE, 0x3E, 0x30, 0x30, 0xF0, 0xFE, 0x3E, 0x30, 0x06, 0x1E, 0x1F, 0x07, 0x06, 0x06, 0x1E, 0x1F, 0x07, 0x06, 0x06, // 35
    0x38, 0x7C, 0xFE, 0xE6, 0xFF, 0xC6, 0xCE, 0x8C, 0x0C, 0x04, 0x0C, 0x1C, 0x18, 0x3F, 0x19, 0x1F, 0x0F, 0x07, // 36
    0x3C, 0x7E, 0x42, 0x42, 0x7E, 0x3C, 0x80, 0x60, 0x10, 0x8C, 0x82, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0C, 0x02, 0x01, 0x00, 0x0F, 0x1F, 0x10, 0x10, 0x1F, 0x0F, // 37
    0x00, 0x80, 0x9C, 0xFE, 0xFE, 0xE6, 0xBE, 0x3E, 0x9C, 0x80, 0x80, 0x07, 0x0F, 0x1F, 0x19, 0x18, 0x19, 0x1F, 0x0F, 0x0F, 0x1F, 0x1D, // 38
    0x1E, 0x1E, 0x1E, 0x00, 0x00, 0x00, // 39
    0xE0, 0xF8, 0xFC, 0x1E, 0x02, 0x0F, 0x3F, 0x7F, 0xF0, 0x80, // 40
    0x02, 0x1E, 0xFC, 0xF8, 0xE0, 0x80, 0xF0, 0x7F, 0x3F, 0x0F, // 41
    0x08, 0x68, 0x3E, 0x3E, 0x68, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 42
    0xC0, 0xC0, 0xC0, 0xF8, 0xF8, 0xF8, 0xC0, 0xC0, 0xC0, 0x01, 0x01, 0x01, 0x0F, 0x0F, 0x0F, 0x01, 0x01, 0x01, // 43
    0x00, 0x00, 0x00, 0xDC, 0x7C, 0x3C, // 44
    0x80, 0x80, 0x80, 0x80, 0x80, 0x03, 0x03, 0x03, 0x03, 0x03, // 45
    0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, // 46
    0x00, 0x80, 0x78, 0x06, 0x18, 0x07, 0x00, 0x00, // 47
    0xF8, 0xFC, 0xFE, 0x06, 0x06, 0xFE, 0xFC, 0xF8, 0x07, 0x0F, 0x1F, 0x18, 0x18, 0x1F, 0x0F, 0x07, // 48
    0x60, 0x70, 0x38, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, // 49
    0x18, 0x1C, 0x1E, 0x06, 0x86, 0xFE, 0xFC, 0x78, 0x18, 0x1C, 0x1E, 0x1F, 0x1B, 0x19, 0x18, 0x18, // 50
    0x08, 0x1C, 0x1E, 0xC6, 0xC6, 0xFE, 0xFC, 0x38, 0x06, 0x0E, 0x1E, 0x18, 0x18, 0x1F, 0x0F, 0x07, // 51
    0x80, 0xC0, 0xF0, 0x38, 0x1C, 0xFE, 0xFE, 0xFE, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1F, 0x1F, 0x1F, 0x03, // 52
    0xF0, 0xFE, 0xFE, 0x66, 0x66, 0xE6, 0xC6, 0x86, 0x06, 0x0E, 0x1E, 0x18, 0x18, 0x1F, 0x0F, 0x07, // 53
    0xF0, 0xFC, 0xFE, 0x46, 0x66, 0xEE, 0xCE, 0x8C, 0x03, 0x0F, 0x1F, 0x18, 0x18, 0x1F, 0x0F, 0x07, // 54
    0x06, 0x06, 0x06, 0x86, 0xE6, 0xF6, 0x1E, 0x06, 0x00, 0x00, 0x1C, 0x1F, 0x1F, 0x01, 0x00, 0x00, // 55
    0x38, 0xFC, 0xFE, 0xC6, 0xC6, 0xFE, 0xFC, 0x38, 0x07, 0x0F, 0x1F, 0x18, 0x18, 0x1F, 0x0F, 0x07, // 56

 

alexey3
Offline
Зарегистрирован: 25.11.2017

вот ариал блэк

sadman41
Offline
Зарегистрирован: 19.10.2016

Как вы себе представляете таковую помощь - кто-то сидит, разбирается, все исправляет и вы потом просто заливаете итог в ардуину?

alexey3
Offline
Зарегистрирован: 25.11.2017

ну не совсем так , сравниваю с исходником и запоминаю что менять надо, измените хотябы 1 цифру ! остальное сам

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, чёт непохоже, чтобы он приподнятый был.

Попробуйти с ним поэспериментировать. Например, цифра 0 у Вас как печатается? Приподнятой? Ну и хорошо, закомментируйте строку 87 (стобы потом восстановить), а вместо неё вбейте столько же сиволов 0xFF - тогда вместо 0 должен печататься "забой". Запустите и посмотрите он как печатается - как надо? или тоже приподнятым? Если как надо, то нужно менять шрифт, а если тоже приподнятым, то надо смотреть библиотеку - шрифт не при делах.

alexey3
Offline
Зарегистрирован: 25.11.2017

    0xF8, 0xFC, 0xFE, 0x06, 0x06, 0xFE, 0xFC, 0xF8, 0x07, 0x0F, 0x1F, 0x18, 0x18, 0x1F, 0x0F, 0x07, // 48- Эту ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ага - это по идее символ '0'  (ноль), если я правильно понял структуру шрифта.

sadman41
Offline
Зарегистрирован: 19.10.2016

Если ссылки в начале файла с фонтом ни на какие мысли не наводят, то как вы собрались запоминать, каким образом изменение в битовом поле произвести?

alexey3
Offline
Зарегистрирован: 25.11.2017

Забой получился первая строка пустая остальное заполнилось как положено

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не понимаю, что такое "первая" - нижняя или верхняя?

В любом случае. Вот этот забой - это ВСЁ, что Вы можете сделать. Т.е. любой символ, который Вы можете нарисовать в шрифте будет полнстоью располагаться в пределах забоя. За него ничто вылезти не может.

Вас такое устриивает? Если устраивает - скачивайте редаткор шрифта (ссылка вверху файла шрифта) и рисуйте шрифт.

alexey3
Offline
Зарегистрирован: 25.11.2017

0 почти доделал вручную , а есть возможность както вылезти за ширину 8 пикселей?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Конечно. Ширины указаны в строках 60-69. Самый первый символ имеет код 32. Код Вашего нуля - 48 - стало быть это восьмёрочка в строке 61 (седьмое число).

Только я не понимаю Вашего мозахизма. Скачайте редактор - он сам всё сделает.

alexey3
Offline
Зарегистрирован: 25.11.2017

НУ не догоняю я как с редактором работать, о а есть он лайн сервисы ?

alexey3
Offline
Зарегистрирован: 25.11.2017

Поясните как вы понимаете какие строки выводят какие символы ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю насчёт сервисов, поищите сами.

Ну, как? Справа от строк в комментариях числа видите (в строке №72 число 33, в строке №73 - число 34 и т.д.). Эти числа - коды символов. Т.е. у Вас присутствуют символы с кодами от 33 до 96, если я правильно понимаю. Ну, а зная код, смотрите что это за символ по таблице. 

alexey3
Offline
Зарегистрирован: 25.11.2017

Огромное спасибо, вы всегда упрощаете мне жизнь, так как ваши познания похоже безграничны, ещё раз спасибо

dneese
Offline
Зарегистрирован: 20.12.2018


 

/*
 *
 * MyBigFont
 *
 * created manually with help from an example file created with FontCreator
 *  and a little help from MS Excel
 * This is a special character set created to utilise the full 16 pixel height
 *  of the Freetronics DMD displays
 *  (see http://www.freetronics.com/products/dot-matrix-display-32x16-red
 *  or http://www.jaycar.com.au/productView.asp?ID=XC4250
 * Only characters 32 (space) to 95 (underscore) are defined - no lower case.
 * The full-stop is replaced with a vertically centered decimal point to look
 *  better in the numerical display.
 * Also the space width is defined in this set. This is not usually the case.
 * Space is only 3 pixels wide.
 * See comments throughout for construction of file and the characters

 *
 * File Name           : MyBigFont.h
 * Date                : 12 Oct 2013
 * Font size in bytes  : 1663
 * Font width          : 14
 * Font height         : 16
 * Font first char     : 32
 * Font last char      : 95
 * Font used chars     : 64
 *
 * The font data are defined as
 *
 * struct _FONT_ {
 *     uint16_t   font_Size in Bytes over all included Size it self - BUT IT IS NOT USED IN THE ARDUINO DMD LIBRARY
 *                                      except in the case of 0x00 0x00 which signifies a fixed width character set
 *     uint8_t    font_Width_in_Pixel_for_fixed_drawing - only used for fixed width font where no character width table is allowed
 *     uint8_t    font_Height_in_Pixel_for_all_characters - only used for fixed width fonts
 *                                      but is usually set to 'en' width for proportional spaced fonts
 *     unit8_t    font_First_Char
 *     uint8_t    font_Char_Count
 *     uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1]
 *                     1 entry per character indicating its width in pixels,
 *                     characters < 128 have an implicit virtual right empty row for character spacing
 *                      (This is built into the DMD library)
 *     uint8_t    font_data[];
 *                     bit field of all characters
 *                     The number of bytes must equal the entry in the width table
 */

#include <inttypes.h>
#include <avr/pgmspace.h>

#ifndef MYBIGFONT_H
#define MYBIGFONT_H

#define MYBIGFONT_WIDTH 10
#define MYBIGFONT_HEIGHT 16

const static uint8_t MyBigFont[] PROGMEM = { // the name here 'MyBigFont' must be used to refer to this font
    0x04, 0x90, // size     the total size of the font in bytes   = 1168 bytes
    0x0A, // width          not actually used in this case but is set to en width (width of 'n' character)
          //                but being non-zero indicates that it is a variable width font and
          //                and the character width table is present.
    0x10, // height         max height of the characters = 16
    0x20, // first char     hex value of the first character (space)
    0x40, // char count     the number of characters in this font

    // char widths
    0x03, 0x03, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x03, 0x06, 0x06,    // 32 to 41
    0x08, 0x09, 0x05, 0x06, 0x04, 0x07, 0x0A, 0x0A, 0x0A, 0x0A,    // 42 to 51
    0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x03, 0x05, 0x08, 0x06,    // 52 to 61
    0x08, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,    // 62 to 71
    0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A,    // 72 to 81
    0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0D, 0x0B, 0x0B, 0x0A, 0x05,    // 82 to 91
    0x07, 0x05, 0x09, 0x0A,                                        // 92 to 95

    // font data
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 32 space (only 3 pixels wide which is less than normal)
    0xFF, 0xFF, 0xFF, 0xCF, 0xCF, 0xCF, // 33 !
    0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 34 "
    0x70, 0x7E, 0xFE, 0xFE, 0x70, 0x70, 0xFE, 0xFE, 0xFE, 0x70, 0x0E, 0x7F, 0x7F, 0x7F, 0x0E, 0x0E, 0x7F, 0x7F, 0x7F, 0x0E, // 35 #
    0xF8, 0xFC, 0xFE, 0x8E, 0xFF, 0xFF, 0x8E, 0x8C, 0x8C, 0x18, 0x18, 0x31, 0x73, 0x73, 0xFF, 0xFF, 0x73, 0x73, 0x3F, 0x1F, // 36 $
    0x1E, 0x3F, 0x33, 0x3F, 0x9E, 0xE0, 0x78, 0x1E, 0x07, 0x03, 0xC0, 0xE0, 0x78, 0x1E, 0x07, 0x79, 0xFC, 0xCC, 0xFC, 0x78, // 37 %
    0x3E, 0x7F, 0xC3, 0xCF, 0x7E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xC1, 0xC1, 0xFF, 0x7E, 0x18, 0x3C, 0x66, 0x42, // 38 &
    0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, // 39 '
    0xF0, 0xF8, 0x1C, 0x06, 0x03, 0x01, 0x0F, 0x1F, 0x38, 0x60, 0xC0, 0x80, // 40 (
    0x01, 0x03, 0x06, 0x1C, 0xF8, 0xF0, 0x80, 0xC0, 0x60, 0x38, 0x1F, 0x0F, // 41 )
    0xC3, 0x66, 0x3C, 0xFF, 0xFF, 0x3C, 0x66, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 42 *
    0x80, 0x80, 0x80, 0xF0, 0xF0, 0xF0, 0x80, 0x80, 0x80, 0x03, 0x03, 0x03, 0x1F, 0x1F, 0x1F, 0x03, 0x03, 0x03, // 43 +
    0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x78, 0x38, 0x38, // 44 ,
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, // 45 -
    0x80, 0xC0, 0xC0, 0x80, 0x01, 0x03, 0x03, 0x01, // 46 . (NOTE that this is centered vertically for use as decimal point)
    0x00, 0x00, 0xC0, 0xF8, 0xFF, 0x1F, 0x03, 0xC0, 0xF8, 0xFF, 0x1F, 0x03, 0x00, 0x00, // 47 /
    0xFC, 0xFE, 0xFF, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFE, 0xFC, 0x3F, 0x7F, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0x7F, 0x3F, // 48 0
    0x10, 0x18, 0x1C, 0x1E, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, // 49 1
    0x0C, 0x0E, 0x0F, 0x87, 0x87, 0x87, 0xCF, 0xFF, 0xFE, 0xFC, 0xFC, 0xFE, 0xFF, 0xE7, 0xE3, 0xE3, 0xE3, 0xE3, 0xE1, 0xE0, // 50 2
	  
    0x0C, 0x1E, 0x1F, 0x07, 0x07, 0xC7, 0xC7, 0xFF, 0xFE, 0x3C, 0x38, 0x78, 0xF8, 0xE0, 0xE0, 0xE1, 0xE1, 0xFF, 0x7F, 0x3E, // 51 3
    0x80, 0xC0, 0xF0, 0x78, 0x3E, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, 0xFF, 0xFF, 0xFF, 0x1C, 0x1C, // 52 4
    0xFF, 0xFF, 0xFF, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0x87, 0x07, 0x30, 0x71, 0xF1, 0xE1, 0xE1, 0xE1, 0xF3, 0xFF, 0x7F, 0x3F, // 53 5
    0xFC, 0xFE, 0xFF, 0x8F, 0x87, 0x87, 0x8F, 0x8F, 0x1E, 0x1C, 0x3F, 0x7F, 0xFF, 0xF3, 0xE3, 0xE3, 0xF7, 0xFF, 0x7F, 0x3E, // 54 6
    0x07, 0x07, 0x07, 0x07, 0x07, 0xC7, 0xF7, 0xFF, 0x3F, 0x0F, 0x00, 0x00, 0xF0, 0xFC, 0xFF, 0x0F, 0x03, 0x00, 0x00, 0x00, // 55 7
    0x7C, 0xFE, 0xFF, 0xEF, 0xC7, 0xC7, 0xEF, 0xFF, 0xFE, 0x7C, 0x3E, 0x7F, 0xFF, 0xF3, 0xE1, 0xE1, 0xF3, 0xFF, 0x7F, 0x3E, // 56 8
    0xFC, 0xFE, 0xFF, 0xCF, 0x87, 0x87, 0x8F, 0xFF, 0xFE, 0xFC, 0x30, 0x71, 0xF3, 0xE3, 0xE3, 0xE3, 0xF3, 0xFF, 0x7F, 0x3F, // 57 9
    0x70, 0x70, 0x70, 0x0E, 0x0E, 0x0E, // 58 :
    0x00, 0x00, 0x70, 0x70, 0x70, 0x20, 0x10, 0x1E, 0x0E, 0x0E, // 59 ;
    0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0x04, 0x03, 0x07, 0x0E, 0x1C, 0x38, 0x30, 0x20, 0x00, // 60 <
    0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, // 61 =
    0x04, 0x0C, 0x1C, 0x38, 0x70, 0xE0, 0xC0, 0x80, 0x20, 0x30, 0x38, 0x1C, 0x0E, 0x06, 0x03, 0x01, // 62 >
    0x0E, 0x0F, 0x87, 0xC3, 0xE7, 0xFF, 0x7F, 0x1E, 0x00, 0x00, 0xCF, 0xCF, 0xCF, 0x00, 0x00, 0x00, // 63 ?
    0xFC, 0xFE, 0x07, 0x03, 0xE3, 0xF3, 0x33, 0x37, 0xFE, 0xFC, 0x3F, 0x7F, 0xE0, 0xC0, 0xC7, 0xCF, 0xCC, 0xCC, 0xCF, 0x07, // 64 @
    0xF0, 0xF8, 0xFC, 0x1E, 0x0F, 0x0F, 0x1E, 0xFC, 0xF8, 0xF0, 0xFF, 0xFF, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFF, 0xFF, // 65 A
    0x07, 0xFF, 0xFF, 0xFF, 0xC7, 0xC7, 0xEF, 0xFF, 0xFE, 0x3C, 0xE0, 0xFF, 0xFF, 0xFF, 0xE1, 0xE1, 0xE3, 0xFF, 0x7F, 0x3E, // 66 B
    0xFC, 0xFE, 0xFF, 0x0F, 0x07, 0x07, 0x07, 0x0F, 0x0E, 0x0C, 0x3F, 0x7F, 0xFF, 0xF0, 0xE0, 0xE0, 0xE0, 0xF0, 0x70, 0x30, // 67 C
    0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x30, 0x30, 0x3F, 0xFF, 0xFF, 0xF0, // 68 D
    0x07, 0xFF, 0xFF, 0xFF, 0x87, 0x87, 0x87, 0x87, 0x07, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xE3, 0xE3, 0xE3, 0xE3, 0xE0, 0xE0, // 69 E
    0xFF, 0xFF, 0xFF, 0x87, 0x87, 0x87, 0x87, 0x87, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, // 70 F
    0xFF, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 71 G
    0xFF, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, // 72 H
    0x03, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, // 73 I
    0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0x03, 0x38, 0x78, 0xF8, 0xF0, 0xE0, 0xF0, 0xFF, 0x7F, 0x3F, 0x00, // 74 J
    0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0xFF, 0xFF, 0xFF, 0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, // 75 K
    0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, // 76 L
    0xFF, 0xFF, 0xFF, 0x3C, 0x78, 0xF0, 0x78, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // 77 M
    0xFF, 0xFF, 0xFF, 0x7C, 0xF0, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x0F, 0x3E, 0xFF, 0xFF, 0xFF, // 78 N
    0xFC, 0xFE, 0xFF, 0x0F, 0x07, 0x07, 0x0F, 0xFF, 0xFE, 0xFC, 0x3F, 0x7F, 0xFF, 0xF0, 0xE0, 0xE0, 0xF0, 0xFF, 0x7F, 0x3F, // 79 O
    0xFF, 0xFF, 0xFF, 0x87, 0x87, 0x87, 0xCF, 0xFF, 0xFE, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, // 80 P
    0xFC, 0xFE, 0xFF, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFE, 0xFC, 0x3F, 0x7F, 0xFF, 0xE0, 0xE0, 0xFC, 0x78, 0xFF, 0xFF, 0x9F, // 81 Q
    0xFF, 0xFF, 0xFF, 0x87, 0x87, 0x87, 0xCF, 0xFF, 0xFE, 0x7C, 0xFF, 0xFF, 0xFF, 0x07, 0x0F, 0x1F, 0x3F, 0x7B, 0xF0, 0xE0, // 82 R
    0x7C, 0xFE, 0xFF, 0xCF, 0x87, 0x87, 0x87, 0x8F, 0x0E, 0x0C, 0x30, 0x71, 0xF3, 0xE3, 0xE3, 0xE3, 0xF7, 0xFF, 0x7F, 0x3E, // 83 S
    0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, // 84 T
    0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0x7F, 0xFF, 0xF0, 0xE0, 0xE0, 0xF0, 0xFF, 0x7F, 0x3F, // 85 U
    0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x0F, 0x3F, 0xFE, 0xF0, 0XF0, 0xFE, 0x3F, 0x0F, 0x01, // 86 V
    0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x3C, 0x1E, 0x0F, 0x1E, 0x3C, 0x78, 0xFF, 0xFF, 0xFF, // 87 W
    0x07, 0x1F, 0x7F, 0x7C, 0xE0, 0x80, 0xE0, 0x7C, 0x7F, 0x1F, 0x07, 0xE0, 0xF8, 0xFE, 0x3E, 0x07, 0x01, 0x07, 0x3E, 0xFE, 0xF8, 0xE0, // 88 X
    0x3F, 0x7F, 0xFF, 0xE0, 0xC0, 0x80, 0xC0, 0xE0, 0xFF, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, // 89 Y
    0x0C, 0x0E, 0x0F, 0x07, 0x87, 0xC7, 0xE7, 0xFF, 0xFE, 0x3C, 0x30, 0x70, 0xF0, 0xF0, 0xE0, 0xE1, 0xF3, 0xFF, 0x7F, 0x3E, // 90 Z
    0xFF, 0xFF, 0xFF, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, // 91 [
    0x03, 0x1F, 0xFF, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0xFF, 0xF8, 0xC0, // 92 "\"
    0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, // 93 ]
    0x30, 0x38, 0x1C, 0x0E, 0x07, 0x0E, 0x1C, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 94 ^
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0  // 95 _
// characters greater than 95 (0x5F) are not defined in this limited character set.
};

#endif
/*
There is some debate on the use of the font size in the data structure.
 In some cases it is used as an offset to the next font structure (which means it does have the size).
 In other cases it holds the actual address of the next font structure.
 Its only use within the Arduino DMD library is to determine whether or not the font is fixed or variable width:
  - zero indicates a variable width font and each character width is defined in the 'width' array
  - non zero indicates a fixed width font and its value is the character width. No 'width' array is then present.

Each character is made up of a fixed 16 pixels height by a variable number of pixels in width.
Each vertical column is represented by 2 bytes - the top 8 rows of pixels and the bottom 8 rows.
The top 8 rows are specified first, from left to right, followed by the lower 8 rows from left to right.
A '1' indicates the pixel is ON, and a '0' represents OFF.
The character width determines the number of bytes required for a character.
2 bytes are required per pixel in width in this font.
Fonts of 8 or fewer pixels in height require only 1 byte per pixel in width.
If the font 'size' is specified as "0x00, 0x00," then the font is fixed width and all character definitions
 must have the same number of bytes in their definition, and the width is specified in the font_Width.
 No font character width table is required or allowed in this case. 
The character definition consists of the list of data bytes starting from the top left byte through to
 the top right byte, followed by the lower left byte through to the lower right byte.

The example below shows how the character '1' is represented in this font.
Bytes and bits are numbered from 0 (not 1)'
 
   ______________ byte 0 = 0C  this byte is specified first
  |  ____________ byte 1 = 0E  followed by this one
  | |  __________ byte 2 = FF
  | | |  ________ byte 3 = FF
  | | | |  ______ byte 4 = FF
  | | | | |  ____ byte 5 = 00
  | | | | | |  __ byte 6 = 00
  | | | | | | |
      * * *     - bit 0  a '0' in bytes 0, 1, a '1' in bytes 3, 4, 5, and a '0' in bytes 5 & 6.
    * * * *     - bit 1
  * * * * *     - bit 2
  * * * * *     - bit 3
      * * *     - bit 4
      * * *     - bit 5                 Character '1' has a width of 0x07
      * * *     - bit 6                 Character '1' is represented by "0x0C, 0x0E, 0xFF, 0xFF,
      * * *     - bit 7                   0xFF, 0x00, 0x00, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0"
      * * *     - bit 0
      * * *     - bit 1
      * * *     - bit 2
      * * *     - bit 3
      * * *     - bit 4
  * * * * * * * - bit 5
  * * * * * * * - bit 6
  * * * * * * * - bit 7
  ^ ^ ^ ^ ^ ^ ^
  | | | | | | |__ byte n   = E0  this byte is specified last
  | | | | | |____ byte n-1 = E0  this byte is specified 2nd last
  | | | | |______ byte n-2 = FF
  | | | |________ byte n-3 = FF
  | | |__________ byte n-4 = FF
  | |____________ byte n-5 = E0
  |______________ byte n-6 = E0  this byte is specified after all the upper bytes are specified

*/