瀏覽代碼

release nov 2020

main
David 4 年之前
父節點
當前提交
9300d7ed8c
共有 100 個檔案被更改,包括 14041 行新增0 行删除
  1. 二進制
      Guide Bioréacteur Spirulerie/Guide_Rapide_page_1_généralités.pdf
  2. 二進制
      Guide Bioréacteur Spirulerie/Guide_Rapide_page_2_bioréacteur.pdf
  3. +5
    -0
      MK3_Firmware/.gitignore
  4. +7
    -0
      MK3_Firmware/.vscode/extensions.json
  5. +14
    -0
      MK3_Firmware/.vscode/settings.json
  6. 二進制
      MK3_Firmware/data/Comfortaa_16.vlw
  7. 二進制
      MK3_Firmware/data/Comfortaa_22.vlw
  8. 二進制
      MK3_Firmware/data/Comfortaa_26.vlw
  9. 二進制
      MK3_Firmware/data/OpenSans_18.vlw
  10. 二進制
      MK3_Firmware/data/OpenSans_22.vlw
  11. +124
    -0
      MK3_Firmware/include/App.h
  12. +50
    -0
      MK3_Firmware/include/DataSaveLoad.h
  13. +37
    -0
      MK3_Firmware/include/DataTypes.h
  14. +5
    -0
      MK3_Firmware/include/GraphicsEngine/DayCycleDrawing.h
  15. +38
    -0
      MK3_Firmware/include/GraphicsEngine/GraphicsEngine.h
  16. +55
    -0
      MK3_Firmware/include/GraphicsEngine/SimplexNoise.h
  17. +1146
    -0
      MK3_Firmware/include/GraphicsEngine/SpriteArrays.h
  18. +13
    -0
      MK3_Firmware/include/GraphicsEngine/Vector2.h
  19. +47
    -0
      MK3_Firmware/include/IODefinitions.h
  20. +39
    -0
      MK3_Firmware/include/README
  21. +26
    -0
      MK3_Firmware/include/Scenes/Harvest.h
  22. +25
    -0
      MK3_Firmware/include/Scenes/Purge.h
  23. +26
    -0
      MK3_Firmware/include/Scenes/Scene.h
  24. +27
    -0
      MK3_Firmware/include/Scenes/SceneCustomModeSettings.h
  25. +20
    -0
      MK3_Firmware/include/Scenes/SceneHeatingSettings.h
  26. +21
    -0
      MK3_Firmware/include/Scenes/SceneLoadingScreen.h
  27. +20
    -0
      MK3_Firmware/include/Scenes/SceneMainMenu.h
  28. +21
    -0
      MK3_Firmware/include/Scenes/SceneModeSelection.h
  29. +20
    -0
      MK3_Firmware/include/Scenes/ScenePumpUse.h
  30. +20
    -0
      MK3_Firmware/include/Scenes/SceneScreenSaverSettings.h
  31. +22
    -0
      MK3_Firmware/include/Scenes/SceneSettingsMenu.h
  32. +20
    -0
      MK3_Firmware/include/Scenes/SceneThermometerCalibration.h
  33. +19
    -0
      MK3_Firmware/include/Scenes/SceneTime.h
  34. +22
    -0
      MK3_Firmware/include/Scenes/SceneTopMenu.h
  35. +16
    -0
      MK3_Firmware/include/Scenes/TestScene.h
  36. +37
    -0
      MK3_Firmware/include/TFTSetup.h
  37. +36
    -0
      MK3_Firmware/include/Tasks/TaskActuators.h
  38. +10
    -0
      MK3_Firmware/include/Tasks/TaskApplication.h
  39. +12
    -0
      MK3_Firmware/include/Tasks/TaskAudioEngine.h
  40. +18
    -0
      MK3_Firmware/include/Tasks/TaskInput.h
  41. +33
    -0
      MK3_Firmware/include/Tasks/TaskThermometer.h
  42. +80
    -0
      MK3_Firmware/include/TextContent.h
  43. +19
    -0
      MK3_Firmware/include/TimeSystem.h
  44. +26
    -0
      MK3_Firmware/include/WiFiSystem.h
  45. +16
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/.gitignore
  46. +69
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/.library.json
  47. +940
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/DallasTemperature.cpp
  48. +274
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/DallasTemperature.h
  49. +72
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/README.md
  50. +162
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/Alarm/Alarm.pde
  51. +144
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/AlarmHandler/AlarmHandler.pde
  52. +35
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/ExternalPullup/ExternalPullup.ino
  53. +43
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/Multibus_simple/Multibus_simple.ino
  54. +148
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/Multiple/Multiple.pde
  55. +47
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/SetUserData/SetUserData.ino
  56. +51
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/Simple/Simple.pde
  57. +121
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/Single/Single.pde
  58. +129
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/Tester/Tester.pde
  59. +45
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/TwoPin_DS18B20/TwoPin_DS18B20.ino
  60. +115
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/UserDataDemo/UserDataDemo.ino
  61. +107
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/UserDataWriteBatch/UserDataWriteBatch.ino
  62. +66
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/WaitForConversion/WaitForConversion.pde
  63. +80
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/WaitForConversion2/WaitForConversion2.pde
  64. +67
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/oneWireSearch/oneWireSearch.ino
  65. +92
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/examples/readPowerSupply/readPowerSupply.ino
  66. +54
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/keywords.txt
  67. +40
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/library.json
  68. +10
    -0
      MK3_Firmware/lib/DallasTemperature_Modified/library.properties
  69. +46
    -0
      MK3_Firmware/lib/README
  70. +17
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/.gitattributes
  71. +47
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/.gitignore
  72. +44
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/.library.json
  73. +95
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Button.cpp
  74. +44
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Button.h
  75. +519
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Smooth_font.cpp
  76. +61
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Smooth_font.h
  77. +2421
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Sprite.cpp
  78. +185
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Sprite.h
  79. +343
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Touch.cpp
  80. +37
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Touch.h
  81. +199
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Orbitron_Light_24.h
  82. +199
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Orbitron_Light_32.h
  83. +199
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Roboto_Thin_24.h
  84. +199
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Satisfy_24.h
  85. +199
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Yellowtail_32.h
  86. +632
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font16.c
  87. +10
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font16.h
  88. +1046
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font32rle.c
  89. +10
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font32rle.h
  90. +299
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font64rle.c
  91. +10
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font64rle.h
  92. +369
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font72rle.c
  93. +10
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font72rle.h
  94. +245
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font72x53rle.c
  95. +10
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font72x53rle.h
  96. +266
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font7srle.c
  97. +10
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font7srle.h
  98. +227
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/GFXFF/FreeMono12pt7b.h
  99. +363
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/GFXFF/FreeMono18pt7b.h
  100. +577
    -0
      MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/GFXFF/FreeMono24pt7b.h

二進制
Guide Bioréacteur Spirulerie/Guide_Rapide_page_1_généralités.pdf 查看文件


二進制
Guide Bioréacteur Spirulerie/Guide_Rapide_page_2_bioréacteur.pdf 查看文件


+ 5
- 0
MK3_Firmware/.gitignore 查看文件

@@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

+ 7
- 0
MK3_Firmware/.vscode/extensions.json 查看文件

@@ -0,0 +1,7 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
]
}

+ 14
- 0
MK3_Firmware/.vscode/settings.json 查看文件

@@ -0,0 +1,14 @@
{
"files.associations": {
"array": "cpp",
"*.tcc": "cpp",
"deque": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"memory": "cpp",
"random": "cpp",
"initializer_list": "cpp"
}
}

二進制
MK3_Firmware/data/Comfortaa_16.vlw 查看文件


二進制
MK3_Firmware/data/Comfortaa_22.vlw 查看文件


二進制
MK3_Firmware/data/Comfortaa_26.vlw 查看文件


二進制
MK3_Firmware/data/OpenSans_18.vlw 查看文件


二進制
MK3_Firmware/data/OpenSans_22.vlw 查看文件


+ 124
- 0
MK3_Firmware/include/App.h 查看文件

@@ -0,0 +1,124 @@
#ifndef APP_H
#define APP_H

#include <Arduino.h>

#include "DataTypes.h"
#include "IODefinitions.h"
#include "SPIFFS.h"
#include "TimeSystem.h"
#include "TextContent.h"
#include "DataSaveLoad.h"

#include "WiFiSystem.h"

#include "Tasks/TaskActuators.h"
#include "Tasks/TaskThermometer.h"
#include "Tasks/TaskAudioEngine.h"
#include "Tasks/TaskInput.h"
#include "Tasks/TaskApplication.h"

#include "GraphicsEngine/GraphicsEngine.h"
#include "GraphicsEngine/SimplexNoise.h"
#include "GraphicsEngine/SpriteArrays.h"

#include "Scenes/Scene.h"
#include "Scenes/SceneMainMenu.h"
#include "Scenes/SceneLoadingScreen.h"
#include "Scenes/SceneTopMenu.h"
#include "Scenes/ScenePumpUse.h"
#include "Scenes/SceneModeSelection.h"
#include "Scenes/SceneCustomModeSettings.h"
#include "Scenes/SceneSettingsMenu.h"
#include "Scenes/SceneTime.h"
#include "Scenes/SceneThermometerCalibration.h"
#include "Scenes/SceneHeatingSettings.h"
#include "Scenes/SceneScreenSaverSettings.h"

// Commenting options
#define SERIAL_DEBUG // TODO faudrait l'implémenter car les serial debug sont par default partout...
//#define RESET_EEPROM_AT_BOOT // utile pour reset une carte quand on a modifié la partition d'EEPROM

// Defines
#define MAX_PERCENTAGE_LIGHT 35 // do not go above this value or the LED will fail (burn, melt plastic etc...)
#define MAX_PERCENTAGE_HEATER 65 // So it doesn't draw too much current
#define SECONDS_TO_SCREENSAVER 45 // only if screensaver is enabled in settings

// Main container class for program
class Application
{
// *** PUBLIC MEMBERS ***
public:
// Singleton
static Application *singleton;

// Member classes
GraphicsEngine Graphics;
WiFiSystem WifiSystem;

// RTOS Queues
QueueHandle_t temperatureQueue;
QueueHandle_t PWMActionsQueue;
QueueHandle_t inputQueue;
QueueHandle_t audioQueue;

// RTOS Tasks
TaskHandle_t audioTask;
TaskHandle_t thermometerTask;
TaskHandle_t actuatorTask;
TaskHandle_t applicationTask;
TaskHandle_t inputManagementTask;

// App will control the actuators if true
bool lightNominal = true;
bool heatNominal = true;
bool pumpNominal = true;
bool canGoToScreenSaver = true;

bool modeNeedsRefresh = true;
ModeParameters parameters;

// *** PUBLIC METHODS ***
public:
// Constructor
Application();
void Init();
void Update();

// Retrieve obfuscated data
float GetCurrentTemperature();
float GetCurrentLightLevel();
bool GetPumpState();

void LoadScene(Scene *scene);

// Intertask communication
void SendAction(uint8_t PWMChannel, float percentage, uint32_t fadetime);
void PlayMelody(Melodies melody);
void ChangeLight(uint8_t percentage, uint32_t fade_time);
void ChangePump(uint8_t percentage, uint32_t fadetime);

// *** PRIVATE METHODS ***
private:
// Actuator management
void Lighting();
void Heating();
void Pump();

// Booleans test
bool IsDay();
bool IsDebouncedInput(BTN btn);

// *** PRIVATE MEMBERS ***
private:
Scene *m_current_scene;
uint8_t m_current_pump_level = 0;
uint8_t m_current_light_level = 0;
float m_current_temperature = -1;
uint64_t m_last_btn_press_time = 0;
bool m_is_in_screensaver = false;
ModeParameters m_mode_hibernation;
ModeParameters m_mode_normal;
};

#endif

+ 50
- 0
MK3_Firmware/include/DataSaveLoad.h 查看文件

@@ -0,0 +1,50 @@
#ifndef DATA_SAVE_LOAD_H
#define DATA_SAVE_LOAD_H

#include "DataTypes.h"
#include <EEPROM.h>

namespace DataSaveLoad
{
// The numbers are indexes of each data in EEPROM
// it needs to take in in account each data memory size in bytes
enum EEPROM_INDEX
{
INITIALIZED = 0, // bool
CURRENT_MODE_NB = 1, // uint8_t
BOOT_NB = 2, // uint64_t
THERMOMETER_ADJUSTEMENT = 10, // float
HEATING_PERCENTAGE = 14, // uint8_t
SCREENSAVE = 15, // bool
CUSTOM_MODE = 16 // ModeParameters (struct of 7 bytes ? just put it as last element..)
};

void InitEEPROM();
void Clear();

uint8_t Load(int index);
void Write(int index, uint8_t data);

void SetDeviceInitialized(bool initialized);
bool ReadDeviceInitialized();

void SetCurrentMode(uint8_t mode_nb);
uint8_t ReadCurrentMode();

void SetBootNb(uint64_t boot_nb);
uint64_t ReadBootNb();

void SetThermometerAdjustement(float adjustement);
float ReadThermometerAdjustement();

void SetCurrentHeatingPercentage(uint8_t heating_percentage);
uint8_t ReadCurrentHeatingPercentage();

void SetCanScreenSave(bool canScreenSave);
bool ReadCanScreenSave();

void SetCustomMode(ModeParameters mode);
ModeParameters ReadCustomMode();
}

#endif

+ 37
- 0
MK3_Firmware/include/DataTypes.h 查看文件

@@ -0,0 +1,37 @@
#ifndef DATA_TYPES_H
#define DATA_TYPES_H

#include <Arduino.h>

enum class BTN { NONE, LEFT, MIDDLE, RIGHT };
enum class Melodies { BOOT, VALID, ERROR };

struct BtnEvent
{
BTN btn;
bool isPressed; // on press = true, on release = false
};

// Stores the parameters associated with a mode
struct ModeParameters
{
// Lighting data
uint8_t light_max; // max day light in percentage 0-100%
uint8_t hour_dusk; // hour at which the day starts
uint8_t hour_dawn; // hour at which the night starts

// Heating data
uint8_t temperature_day;
uint8_t temperature_night;

// Agitation data
uint8_t pump_cycles_per_hour; // MAXIMUM 30
uint8_t pump_cycle_lenght; // MAXIMUM 120 (in seconds)

ModeParameters();
ModeParameters(uint8_t light_max, uint8_t hour_dusk, uint8_t hour_dawn,
uint8_t temperature_day, uint8_t temperature_night,
uint8_t pump_cycles_per_hour, uint8_t pump_cycle_lenght);
};

#endif

+ 5
- 0
MK3_Firmware/include/GraphicsEngine/DayCycleDrawing.h 查看文件

@@ -0,0 +1,5 @@
#ifndef DAYCYCLEDRAWING_H
#define DAYCYCLEDRAWING_H


#endif

+ 38
- 0
MK3_Firmware/include/GraphicsEngine/GraphicsEngine.h 查看文件

@@ -0,0 +1,38 @@
#ifndef GRAPHICS_ENGINE_H
#define GRAPHICS_ENGINE_H

#include <TFT_eSPI.h>
#include "IODefinitions.h"
#include "SpriteArrays.h"

#define WIN_WIDTH 160
#define WIN_HEIGHT 128

// La Spirulerie's color scheme in RGB 565
#define SPIRULERIE_GREEN 0x2C6B
#define SPIRULERIE_BLUE 0x7D57
#define SPIRULERIE_RED 0xE904
#define SPIRULERIE_LIGHT 0xEFBE
#define SPIRULERIE_GREY 0x2965

class GraphicsEngine
{
public:
TFT_eSPI TftSPI;
TFT_eSprite Screen;
GraphicsEngine();
void Init();
void PushToScreen();
void LoadFont(String font_name, uint32_t font_color, uint32_t bg_color);

// DRAW ROUTINES
void DrawScreen(uint32_t color);
void DrawImage(const uint16_t *color_array, int16_t x, int16_t y, uint16_t w, uint16_t h);
void DrawProgressBar(uint8_t progress,
int32_t x, int32_t y, int32_t width, int32_t height,
uint32_t color_bg, uint32_t color_progress);
void DrawRightArrow();
void DrawLeftArrow();
};

#endif

+ 55
- 0
MK3_Firmware/include/GraphicsEngine/SimplexNoise.h 查看文件

@@ -0,0 +1,55 @@
/**
* @file SimplexNoise.h
* @brief A Perlin Simplex Noise C++ Implementation (1D, 2D, 3D).
*
* Copyright (c) 2014-2018 Sebastien Rombauts (sebastien.rombauts@gmail.com)
*
* Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt
* or copy at http://opensource.org/licenses/MIT)
*/
#pragma once

#include <cstddef> // size_t

/**
* @brief A Perlin Simplex Noise C++ Implementation (1D, 2D, 3D, 4D).
*/
class SimplexNoise {
public:
// 1D Perlin simplex noise
static float noise(float x);
// 2D Perlin simplex noise
static float noise(float x, float y);
// 3D Perlin simplex noise
static float noise(float x, float y, float z);

// Fractal/Fractional Brownian Motion (fBm) noise summation
float fractal(size_t octaves, float x) const;
float fractal(size_t octaves, float x, float y) const;
float fractal(size_t octaves, float x, float y, float z) const;

/**
* Constructor of to initialize a fractal noise summation
*
* @param[in] frequency Frequency ("width") of the first octave of noise (default to 1.0)
* @param[in] amplitude Amplitude ("height") of the first octave of noise (default to 1.0)
* @param[in] lacunarity Lacunarity specifies the frequency multiplier between successive octaves (default to 2.0).
* @param[in] persistence Persistence is the loss of amplitude between successive octaves (usually 1/lacunarity)
*/
explicit SimplexNoise(float frequency = 1.0f,
float amplitude = 1.0f,
float lacunarity = 2.0f,
float persistence = 0.5f) :
mFrequency(frequency),
mAmplitude(amplitude),
mLacunarity(lacunarity),
mPersistence(persistence) {
}

private:
// Parameters of Fractional Brownian Motion (fBm) : sum of N "octaves" of noise
float mFrequency; ///< Frequency ("width") of the first octave of noise (default to 1.0)
float mAmplitude; ///< Amplitude ("height") of the first octave of noise (default to 1.0)
float mLacunarity; ///< Lacunarity specifies the frequency multiplier between successive octaves (default to 2.0).
float mPersistence; ///< Persistence is the loss of amplitude between successive octaves (usually 1/lacunarity)
};

+ 1146
- 0
MK3_Firmware/include/GraphicsEngine/SpriteArrays.h
文件差異過大導致無法顯示
查看文件


+ 13
- 0
MK3_Firmware/include/GraphicsEngine/Vector2.h 查看文件

@@ -0,0 +1,13 @@
#ifndef VECTORS_H
#define VECTORS_H

struct Vector2
{
float X;
float Y;

Vector2(float x = 0, float y = 0);
void Normalize();
};

#endif

+ 47
- 0
MK3_Firmware/include/IODefinitions.h 查看文件

@@ -0,0 +1,47 @@
#ifndef DEFINITIONS_H
#define DEFINITIONS_H

// ---------- ZONE EDITION UTILISATEUR -----

// version number is visible on the backside of the Spirulerie motherboard
// le numéro de version est visible sur la face arrière de la carte Spirulerie
// comment every version number except yours

//#define SPIRULERIE_104 // Spirulerie v1.4 2020
#define SPIRULERIE_105 // Spirulerie v1.5 (or 1.51) 2020
//#define SPIRULERIE_106 // Spirulerie v1.6 2021 ?

// ---------- ZONE NON EDITION -----
// PIN DEFINITIONS
#define PIN_LCDLIGHT 17

#define PIN_12V_A 12
#define PIN_12V_B 26
#define PIN_12V_D 27

#define PIN_DS18B20 4

#define PIN_DACBUZZER 25

#ifdef SPIRULERIE_104
#define PIN_BTN_LEFT 35
#define PIN_BTN_MIDDLE 33
#define PIN_BTN_RIGHT 32
#define PIN_12V_C 14
#endif
#ifdef SPIRULERIE_105
#define PIN_BTN_LEFT 35
#define PIN_BTN_MIDDLE 36
#define PIN_BTN_RIGHT 39
#define PIN_12V_C 16
#endif

// PWM Channels
#define PWMC_DAC 0
#define PWMC_IO_A 1
#define PWMC_IO_B 2
#define PWMC_IO_C 3
#define PWMC_IO_D 4
#define PWMC_BRIGHTNESS 5

#endif

+ 39
- 0
MK3_Firmware/include/README 查看文件

@@ -0,0 +1,39 @@

This directory is intended for project header files.

A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.

```src/main.c

#include "header.h"

int main (void)
{
...
}
```

Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.

In C, the usual convention is to give header files names that end with `.h'.
It is most portable to use only letters, digits, dashes, and underscores in
header file names, and at most one dot.

Read more about using header files in official GCC documentation:

* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes

https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html

+ 26
- 0
MK3_Firmware/include/Scenes/Harvest.h 查看文件

@@ -0,0 +1,26 @@
#ifndef HARVEST_H
#define HARVEST_H

#include "Scenes/Scene.h"

class Harvest : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
uint8_t m_progress = 0;
uint8_t m_speed = 5;

void PumpHarvest();

void DrawPreparation();
void DrawHarvest();
void DrawStop();
};

#endif

+ 25
- 0
MK3_Firmware/include/Scenes/Purge.h 查看文件

@@ -0,0 +1,25 @@
#ifndef PURGE_H
#define PURGE_H

#include "Scenes/Scene.h"

class Purge : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
uint8_t m_progress = 0;

void PumpHarvest();

void DrawPreparation();
void DrawPurge();
void DrawStop();
};

#endif

+ 26
- 0
MK3_Firmware/include/Scenes/Scene.h 查看文件

@@ -0,0 +1,26 @@
#ifndef SCENE_H
#define SCENE_H

#include "DataTypes.h"
#include "GraphicsEngine/GraphicsEngine.h"

// forward declaration. Need including App.h in each scene .c files
class Application;

// Base class for inherited screens.
// Screens are small scenes with graphics and button logic
class Scene
{
public:
virtual void Initialize();
virtual void Update();
virtual void Destroy();

virtual void Draw(GraphicsEngine *graphics);
virtual void OnButtonClic(BTN btn);

protected:
Application *app; // storing a reference to the Application;
};

#endif

+ 27
- 0
MK3_Firmware/include/Scenes/SceneCustomModeSettings.h 查看文件

@@ -0,0 +1,27 @@
#ifndef SCENE_CUSTOM_MODE_SETTINGS
#define SCENE_CUSTOM_MODE_SETTINGS

#include "Scenes/Scene.h"

class SceneCustomModeSettings : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
void Validate();

int8_t m_selection;
uint8_t m_progress = 0;
String m_title_text;
String m_helper_text;
String m_selection_text;
ModeParameters m_custom_mode;
};


#endif

+ 20
- 0
MK3_Firmware/include/Scenes/SceneHeatingSettings.h 查看文件

@@ -0,0 +1,20 @@
#ifndef SCENE_HEATING_SETTINGS_H
#define SCENE_HEATING_SETTINGS_H

#include "Scenes/Scene.h"
#include "DataSaveLoad.h"

class SceneHeatingSettings : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
int8_t m_current_percentage;
};

#endif

+ 21
- 0
MK3_Firmware/include/Scenes/SceneLoadingScreen.h 查看文件

@@ -0,0 +1,21 @@
#ifndef SCENE_LOADING_SCREEN_H
#define SCENE_LOADING_SCREEN_H

#include "Scenes/Scene.h"

#define BOOT_TIME 3300

class SceneLoadingScreen : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
unsigned long start_millis = 0;
};

#endif

+ 20
- 0
MK3_Firmware/include/Scenes/SceneMainMenu.h 查看文件

@@ -0,0 +1,20 @@
#ifndef SCENE_MAIN_MENU_H
#define SCENE_MAIN_MENU_H

#include "Scenes/Scene.h"

class SceneMainMenu : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
void DrawDayNightCycle(uint8_t hour, uint8_t dawn, uint8_t dusk);
void DrawTemperature(uint16_t x, uint16_t y, float temperature);
};

#endif

+ 21
- 0
MK3_Firmware/include/Scenes/SceneModeSelection.h 查看文件

@@ -0,0 +1,21 @@
#ifndef SCENE_MODE_SELECTION_H
#define SCENE_MODE_SELECTION_H

#include "Scenes/Scene.h"

class SceneModeSelection : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
int8_t m_selection;
uint8_t m_progress = 0;
String m_selection_text;
};

#endif

+ 20
- 0
MK3_Firmware/include/Scenes/ScenePumpUse.h 查看文件

@@ -0,0 +1,20 @@
#ifndef SCENE_PUMP_USE_H
#define SCENE_PUMP_USE_H

#include "Scenes/Scene.h"

class ScenePumpUse : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
uint8_t m_progress;
uint8_t m_pump_mode;
};

#endif

+ 20
- 0
MK3_Firmware/include/Scenes/SceneScreenSaverSettings.h 查看文件

@@ -0,0 +1,20 @@
#ifndef SCENE_SCREENSAVER_SETTINGS_H
#define SCENE_SCREENSAVER_SETTINGS_H

#include "Scenes/Scene.h"
#include "DataSaveLoad.h"

class SceneScreenSaverSettings : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
bool m_current_selection;
};

#endif

+ 22
- 0
MK3_Firmware/include/Scenes/SceneSettingsMenu.h 查看文件

@@ -0,0 +1,22 @@
#ifndef SCENE_SETTINGS_MENU_H
#define SCENE_SETTINGS_MENU_H

#include "Scenes/Scene.h"

class SceneSettingsMenu : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
int8_t m_selection = 0;
String m_menu_name;

void ValidateSelection();
};

#endif

+ 20
- 0
MK3_Firmware/include/Scenes/SceneThermometerCalibration.h 查看文件

@@ -0,0 +1,20 @@
#ifndef SCENE_THERMOMETER_CALIBRATION_H
#define SCENE_THERMOMETER_CALIBRATION_H

#include "Scenes/Scene.h"
#include "DataSaveLoad.h"

class SceneThermometerCalibration : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
float adjustement;
};

#endif

+ 19
- 0
MK3_Firmware/include/Scenes/SceneTime.h 查看文件

@@ -0,0 +1,19 @@
#ifndef SCENE_TIME_H
#define SCENE_TIME_H

#include "Scenes/Scene.h"

class SceneTime : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
int8_t m_time;
};

#endif

+ 22
- 0
MK3_Firmware/include/Scenes/SceneTopMenu.h 查看文件

@@ -0,0 +1,22 @@
#ifndef SCENE_TOP_MENU_H
#define SCENE_TOP_MENU_H

#include "Scenes/Scene.h"

class SceneTopMenu : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;

private:
int8_t m_selection = 0;
String m_menu_name;

void ValidateSelection();
};

#endif

+ 16
- 0
MK3_Firmware/include/Scenes/TestScene.h 查看文件

@@ -0,0 +1,16 @@
#ifndef TEST_SCENE_H
#define TEST_SCENE_H

#include "Scenes/Scene.h"

class TestScene : public Scene
{
public:
void Initialize() override;
void Update() override;
void Draw(GraphicsEngine *graphics) override;
void OnButtonClic(BTN btn) override;
void Destroy() override;
};

#endif

+ 37
- 0
MK3_Firmware/include/TFTSetup.h 查看文件

@@ -0,0 +1,37 @@
#ifndef TFT_SETUP_H
#define TFT_SETUP_H

// ##################################################################################
//
// Configuration file for TFTeSPI to work with LA SPIRULERIE's hardware
//
// ##################################################################################

#define ST7735_DRIVER
#define TFT_WIDTH 128
#define TFT_HEIGHT 160
#define ST7735_BLACKTAB

#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 5 // Chip select control pin
#define TFT_DC 2 // Data Command control pin

#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT

#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
#define SPI_READ_FREQUENCY 20000000

#endif

+ 36
- 0
MK3_Firmware/include/Tasks/TaskActuators.h 查看文件

@@ -0,0 +1,36 @@
#ifndef TASK_ACTUATORS_H
#define TASK_ACTUATORS_H

#include <Arduino.h>
#include "App.h"

#define PWM_FREQ_IO 40000 // 40 khz
#define PWM_RESOLUTION_BITS 10
#define PWM_MAX_RESOLUTION 1023

// data container for PWM output
struct ActuatorPWMAction
{
uint8_t channel;
float percentage;
uint32_t speed;
};

// Entry point
TaskHandle_t InitActuators();

// RTOS tasks
void ActuatorTask(void *parameter);
void Task_IO_A(void *parameter);
void Task_IO_B(void *parameter);
void Task_IO_C(void *parameter);
void Task_IO_D(void *parameter);
//void Task_Brightness(void *parameter);

// Functions
void ChannelTaskFunc(uint8_t channel, QueueHandle_t queue);
void InitPWM(uint8_t channel, double frequency, uint8_t pin);
void PWM_Write(uint8_t channel, uint16_t duty);
void PWM_Fade(uint8_t channel, uint16_t from_duty, uint16_t to_duty, uint32_t ms);

#endif

+ 10
- 0
MK3_Firmware/include/Tasks/TaskApplication.h 查看文件

@@ -0,0 +1,10 @@
#ifndef TASK_APPLICATION_H
#define TASK_APPLICATION_H

#include <Arduino.h>
#include "App.h"

void InitApplication();
void ApplicationTask(void *parameter);

#endif

+ 12
- 0
MK3_Firmware/include/Tasks/TaskAudioEngine.h 查看文件

@@ -0,0 +1,12 @@
#ifndef AUDIO_ENGINE_H
#define AUDIO_ENGINE_H

#include <Arduino.h>
#include "App.h"

// Functions
TaskHandle_t InitAudio();
void PlayNote(note_t note, uint8_t octave, uint32_t time);
void AudioEngineTask(void *parameter);

#endif

+ 18
- 0
MK3_Firmware/include/Tasks/TaskInput.h 查看文件

@@ -0,0 +1,18 @@
#ifndef INPUT_H
#define INPUT_H

#include "App.h"

struct InputData
{
uint8_t btnNum;
int64_t timing;
};

// Entry point
TaskHandle_t InitInputManagement();

// RTOS task
void InputManagementTask(void *parameter);

#endif

+ 33
- 0
MK3_Firmware/include/Tasks/TaskThermometer.h 查看文件

@@ -0,0 +1,33 @@
#ifndef THERMOMETER_H
#define THERMOMETER_H

#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include "App.h"

#define READING_DELAY 10000 //30000

// Global Variables
class Thermometer
{
public:
// Members
OneWire oneWire;
DallasTemperature DS18B20;
DeviceAddress adress;
// Methods
Thermometer();
bool StartDevice();
float GetTemperature();

};

// Functions
TaskHandle_t InitThermometer(); // entry point
void ThermometerTask(void *parameter); // RTOS task loop


#endif

+ 80
- 0
MK3_Firmware/include/TextContent.h 查看文件

@@ -0,0 +1,80 @@
#ifndef TEXT_CONTENT_H
#define TEXT_CONTENT_H

#include <pgmspace.h>

namespace TextContent
{
const char text_title[] PROGMEM = "La Spirulerie";

// ********** FRENCH TEXT ********** //
// **** MENUS ****
const char text_menu_pump_FR[] PROGMEM = "pompe";
const char text_menu_mode_FR[] PROGMEM = "mode";
const char text_menu_settings_FR[] PROGMEM = "réglages";
const char text_menu_games_FR[] PROGMEM = "jeux";
const char text_menu_time_FR[] PROGMEM = "heure";
const char text_menu_therm_FR[] PROGMEM = "thermomètre";

// **** PUMP ****
const char text_pump_preparation_01_FR[] = "> préparer le tube";
const char text_pump_preparation_02_FR[] = "> et autre matériel";

const char text_pump_stop_01_FR[] = "> replacer tube";

// **** RECOLTE ****
const char text_harvest_00_FR[] PROGMEM = "> préparer le tube";
const char text_harvest_01_FR[] PROGMEM = "> préparer le filtre";
const char text_harvest_10_FR[] PROGMEM = "récolte en cours";
const char text_harvest_20_FR[] PROGMEM = "> presser filtre";
const char text_harvest_21_FR[] PROGMEM = "> spiruline 0-5°C";

// **** PURGE ****
const char text_purge_00_FR[] PROGMEM = "> préparer le tube";
const char text_purge_10_FR[] PROGMEM = "purge en cours";
const char text_purge_20_FR[] PROGMEM = "> replacer le tube";

// **** THERMOMETRE ****
const char text_therm_calibration_FR[] PROGMEM = "écart de T en C°";

// **** CHAUFFAGE ****
const char text_chauffage_puissance_FR[] PROGMEM = "puissance";

// **** VEILLE ****
const char text_veille_actif_FR[] PROGMEM = "écran veille ?";

// **** MENU PARAMETRE ****
const char text_settings_heure_FR[] PROGMEM = "heure";
const char text_settings_therm_FR[] PROGMEM = "thermomètre";
const char text_settings_chauffage[] PROGMEM = "chauffage";
const char text_settings_veille[] PROGMEM = "veille";

// **** MODES
const char text_mode_hibernation_FR[] PROGMEM = "hibernation";
const char text_mode_normal_FR[] PROGMEM = "normal";
const char text_mode_custom_FR[] PROGMEM = "personnalisé";

// **** MODE CUSTOMISATION
const char text_custom_mode_title_light_FR[] PROGMEM = "lumière";
const char text_custom_mode_title_day_FR[] PROGMEM = "journée";
const char text_custom_mode_title_temperature_FR[] PROGMEM = "température";
const char text_custom_mode_title_pump_FR[] PROGMEM = "pompe";

const char text_custom_mode_light_max_FR[] PROGMEM = "puissance max";
const char text_custom_mode_day_start_FR[] PROGMEM = "début du jour";
const char text_custom_mode_day_stop_FR[] PROGMEM = "fin du jour";
const char text_custom_mode_temperature_day_FR[] PROGMEM = "en journée";
const char text_custom_mode_temperature_night_FR[] PROGMEM = "la nuit";
const char text_custom_mode_pump_cycles_per_hour_FR[] PROGMEM = "nombre de cycles";
const char text_custom_mode_pump_cycle_lenght_FR[] PROGMEM = "durée du cycle";

// **** GENERAL ****
const char text_start_FR[] PROGMEM = "[commencer]";
const char text_stop_FR[] PROGMEM = "[arreter]";
const char text_validate_FR[] PROGMEM = "[valider]";
const char text_select_FR[] PROGMEM = "[selectionner]";
const char text_oui_FR[] PROGMEM = "oui";
const char text_non_FR[] PROGMEM = "non";
}

#endif

+ 19
- 0
MK3_Firmware/include/TimeSystem.h 查看文件

@@ -0,0 +1,19 @@
#ifndef TIME_SYSTEM_H
#define TIME_SYSTEM_H

#include <Arduino.h>
#include <Time.h>

/*
** Simple helper functions to change and get time
*/

namespace TimeSystem
{
void SetTime(tmElements_t t);
void SetTime(int hour, int minute);
tmElements_t GetTime();
void ResetToFactoryTime();
};

#endif

+ 26
- 0
MK3_Firmware/include/WiFiSystem.h 查看文件

@@ -0,0 +1,26 @@
#ifndef WIFI_SYSTEM_H
#define WIFI_SYSTEM_H

#include "Arduino.h"
#include "WiFi.h"
#include "DNSServer.h"

#define DNS_PORT 53

class WiFiSystem
{
public:
// Methods
WiFiSystem();
void Start();
void Stop();
void Update();

private:
// Members
WiFiServer m_wifiServer;
//DNSServer m_dnsServer;
IPAddress m_apIP;
};

#endif

+ 16
- 0
MK3_Firmware/lib/DallasTemperature_Modified/.gitignore 查看文件

@@ -0,0 +1,16 @@
.idea
classes
target
out
build
*.iml
*.ipr
*.iws
*.log
*.war
.idea
.project
.classpath
.settings
.gradle
.vscode

+ 69
- 0
MK3_Firmware/lib/DallasTemperature_Modified/.library.json 查看文件

@@ -0,0 +1,69 @@
{
"name": "DallasTemperature",
"repository": {
"url": "https://github.com/milesburton/Arduino-Temperature-Control-Library.git",
"type": "git"
},
"platforms": [
"atmelavr",
"atmelmegaavr",
"atmelsam",
"espressif32",
"espressif8266",
"gd32v",
"infineonxmc",
"intel_arc32",
"kendryte210",
"microchippic32",
"nordicnrf51",
"nordicnrf52",
"ststm32",
"ststm8",
"teensy",
"timsp430"
],
"frameworks": [
"arduino"
],
"dependencies": {
"frameworks": "arduino",
"name": "OneWire",
"authors": "Paul Stoffregen"
},
"version": "3.8.1",
"authors": [
{
"maintainer": true,
"name": "Miles Burton",
"url": "http://www.milesburton.com",
"email": "miles@mnetcs.com"
},
{
"url": null,
"maintainer": false,
"email": "nuisance@casualhacker.net",
"name": "Tim Newsome"
},
{
"url": null,
"maintainer": false,
"email": "gfbarros@bappos.com",
"name": "Guil Barros"
},
{
"url": null,
"maintainer": false,
"email": "rob.tillaart@gmail.com",
"name": "Rob Tillaart"
}
],
"keywords": [
"bus",
"sensor",
"1-wire",
"onewire",
"temperature"
],
"id": 54,
"description": "Arduino Library for Dallas Temperature ICs (DS18B20, DS18S20, DS1822, DS1820)"
}

+ 940
- 0
MK3_Firmware/lib/DallasTemperature_Modified/DallasTemperature.cpp 查看文件

@@ -0,0 +1,940 @@
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
#include "DallasTemperature.h"
#if ARDUINO >= 100
#include "Arduino.h"
#else
extern "C" {
#include "WConstants.h"
}
#endif
// OneWire commands
#define STARTCONVO 0x44 // Tells device to take a temperature reading and put it on the scratchpad
#define COPYSCRATCH 0x48 // Copy EEPROM
#define READSCRATCH 0xBE // Read EEPROM
#define WRITESCRATCH 0x4E // Write to EEPROM
#define RECALLSCRATCH 0xB8 // Reload from last known
#define READPOWERSUPPLY 0xB4 // Determine if device needs parasite power
#define ALARMSEARCH 0xEC // Query bus for devices with an alarm condition
// Scratchpad locations
#define TEMP_LSB 0
#define TEMP_MSB 1
#define HIGH_ALARM_TEMP 2
#define LOW_ALARM_TEMP 3
#define CONFIGURATION 4
#define INTERNAL_BYTE 5
#define COUNT_REMAIN 6
#define COUNT_PER_C 7
#define SCRATCHPAD_CRC 8
// Device resolution
#define TEMP_9_BIT 0x1F // 9 bit
#define TEMP_10_BIT 0x3F // 10 bit
#define TEMP_11_BIT 0x5F // 11 bit
#define TEMP_12_BIT 0x7F // 12 bit
#define NO_ALARM_HANDLER ((AlarmHandler *)0)
DallasTemperature::DallasTemperature()
{
#if REQUIRESALARMS
setAlarmHandler(NO_ALARM_HANDLER);
#endif
useExternalPullup = false;
}
DallasTemperature::DallasTemperature(OneWire* _oneWire)
{
setOneWire(_oneWire);
#if REQUIRESALARMS
setAlarmHandler(NO_ALARM_HANDLER);
#endif
useExternalPullup = false;
}
bool DallasTemperature::validFamily(const uint8_t* deviceAddress) {
switch (deviceAddress[0]) {
case DS18S20MODEL:
case DS18B20MODEL:
case DS1822MODEL:
case DS1825MODEL:
case DS28EA00MODEL:
return true;
default:
return false;
}
}
/*
* Constructs DallasTemperature with strong pull-up turned on. Strong pull-up is mandated in DS18B20 datasheet for parasitic
* power (2 wires) setup. (https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf, p. 7, section 'Powering the DS18B20').
*/
DallasTemperature::DallasTemperature(OneWire* _oneWire, uint8_t _pullupPin) : DallasTemperature(_oneWire){
setPullupPin(_pullupPin);
}
void DallasTemperature::setPullupPin(uint8_t _pullupPin) {
useExternalPullup = true;
pullupPin = _pullupPin;
pinMode(pullupPin, OUTPUT);
deactivateExternalPullup();
}
void DallasTemperature::setOneWire(OneWire* _oneWire) {
_wire = _oneWire;
devices = 0;
ds18Count = 0;
parasite = false;
bitResolution = 9;
waitForConversion = true;
checkForConversion = true;
}
// initialise the bus
void DallasTemperature::begin(void) {
DeviceAddress deviceAddress;
_wire->reset_search();
devices = 0; // Reset the number of devices when we enumerate wire devices
ds18Count = 0; // Reset number of DS18xxx Family devices
while (_wire->search(deviceAddress)) {
if (validAddress(deviceAddress)) {
if (!parasite && readPowerSupply(deviceAddress))
parasite = true;
bitResolution = max(bitResolution, getResolution(deviceAddress));
devices++;
if (validFamily(deviceAddress)) {
ds18Count++;
}
}
}
}
// returns the number of devices found on the bus
uint8_t DallasTemperature::getDeviceCount(void) {
return devices;
}
uint8_t DallasTemperature::getDS18Count(void) {
return ds18Count;
}
// returns true if address is valid
bool DallasTemperature::validAddress(const uint8_t* deviceAddress) {
return (_wire->crc8(deviceAddress, 7) == deviceAddress[7]);
}
// finds an address at a given index on the bus
// returns true if the device was found
bool DallasTemperature::getAddress(uint8_t* deviceAddress, uint8_t index) {
uint8_t depth = 0;
_wire->reset_search();
while (depth <= index && _wire->search(deviceAddress)) {
if (depth == index && validAddress(deviceAddress))
return true;
depth++;
}
return false;
}
// attempt to determine if the device at the given address is connected to the bus
bool DallasTemperature::isConnected(const uint8_t* deviceAddress) {
ScratchPad scratchPad;
return isConnected(deviceAddress, scratchPad);
}
// attempt to determine if the device at the given address is connected to the bus
// also allows for updating the read scratchpad
bool DallasTemperature::isConnected(const uint8_t* deviceAddress,
uint8_t* scratchPad) {
bool b = readScratchPad(deviceAddress, scratchPad);
return b && !isAllZeros(scratchPad) && (_wire->crc8(scratchPad, 8) == scratchPad[SCRATCHPAD_CRC]);
}
bool DallasTemperature::readScratchPad(const uint8_t* deviceAddress,
uint8_t* scratchPad) {
// send the reset command and fail fast
int b = _wire->reset();
if (b == 0)
return false;
_wire->select(deviceAddress);
_wire->write(READSCRATCH);
// Read all registers in a simple loop
// byte 0: temperature LSB
// byte 1: temperature MSB
// byte 2: high alarm temp
// byte 3: low alarm temp
// byte 4: DS18S20: store for crc
// DS18B20 & DS1822: configuration register
// byte 5: internal use & crc
// byte 6: DS18S20: COUNT_REMAIN
// DS18B20 & DS1822: store for crc
// byte 7: DS18S20: COUNT_PER_C
// DS18B20 & DS1822: store for crc
// byte 8: SCRATCHPAD_CRC
for (uint8_t i = 0; i < 9; i++) {
scratchPad[i] = _wire->read();
}
b = _wire->reset();
return (b == 1);
}
void DallasTemperature::writeScratchPad(const uint8_t* deviceAddress,
const uint8_t* scratchPad) {
_wire->reset();
_wire->select(deviceAddress);
_wire->write(WRITESCRATCH);
_wire->write(scratchPad[HIGH_ALARM_TEMP]); // high alarm temp
_wire->write(scratchPad[LOW_ALARM_TEMP]); // low alarm temp
// DS1820 and DS18S20 have no configuration register
if (deviceAddress[0] != DS18S20MODEL)
_wire->write(scratchPad[CONFIGURATION]);
_wire->reset();
// save the newly written values to eeprom
_wire->select(deviceAddress);
_wire->write(COPYSCRATCH, parasite);
delay(20); // <--- added 20ms delay to allow 10ms long EEPROM write operation (as specified by datasheet)
if (parasite) {
activateExternalPullup();
delay(10); // 10ms delay
deactivateExternalPullup();
}
_wire->reset();
}
// returns true if parasite mode is used (2 wire)
// returns false if normal mode is used (3 wire)
// if no address is given (or nullptr) it checks if any device on the bus
// uses parasite mode.
// See issue #145
bool DallasTemperature::readPowerSupply(const uint8_t* deviceAddress)
{
bool parasiteMode = false;
_wire->reset();
if (deviceAddress == nullptr)
_wire->skip();
else
_wire->select(deviceAddress);
_wire->write(READPOWERSUPPLY);
if (_wire->read_bit() == 0)
parasiteMode = true;
_wire->reset();
return parasiteMode;
}
// set resolution of all devices to 9, 10, 11, or 12 bits
// if new resolution is out of range, it is constrained.
void DallasTemperature::setResolution(uint8_t newResolution) {
bitResolution = constrain(newResolution, 9, 12);
DeviceAddress deviceAddress;
for (int i = 0; i < devices; i++) {
getAddress(deviceAddress, i);
setResolution(deviceAddress, bitResolution, true);
}
}
// set resolution of a device to 9, 10, 11, or 12 bits
// if new resolution is out of range, 9 bits is used.
bool DallasTemperature::setResolution(const uint8_t* deviceAddress,
uint8_t newResolution, bool skipGlobalBitResolutionCalculation) {
// ensure same behavior as setResolution(uint8_t newResolution)
newResolution = constrain(newResolution, 9, 12);
// return when stored value == new value
if (getResolution(deviceAddress) == newResolution)
return true;
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad)) {
// DS1820 and DS18S20 have no resolution configuration register
if (deviceAddress[0] != DS18S20MODEL) {
switch (newResolution) {
case 12:
scratchPad[CONFIGURATION] = TEMP_12_BIT;
break;
case 11:
scratchPad[CONFIGURATION] = TEMP_11_BIT;
break;
case 10:
scratchPad[CONFIGURATION] = TEMP_10_BIT;
break;
case 9:
default:
scratchPad[CONFIGURATION] = TEMP_9_BIT;
break;
}
writeScratchPad(deviceAddress, scratchPad);
// without calculation we can always set it to max
bitResolution = max(bitResolution, newResolution);
if (!skipGlobalBitResolutionCalculation
&& (bitResolution > newResolution)) {
bitResolution = newResolution;
DeviceAddress deviceAddr;
for (int i = 0; i < devices; i++) {
getAddress(deviceAddr, i);
bitResolution = max(bitResolution,
getResolution(deviceAddr));
}
}
}
return true; // new value set
}
return false;
}
// returns the global resolution
uint8_t DallasTemperature::getResolution() {
return bitResolution;
}
// returns the current resolution of the device, 9-12
// returns 0 if device not found
uint8_t DallasTemperature::getResolution(const uint8_t* deviceAddress) {
// DS1820 and DS18S20 have no resolution configuration register
if (deviceAddress[0] == DS18S20MODEL)
return 12;
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad)) {
switch (scratchPad[CONFIGURATION]) {
case TEMP_12_BIT:
return 12;
case TEMP_11_BIT:
return 11;
case TEMP_10_BIT:
return 10;
case TEMP_9_BIT:
return 9;
}
}
return 0;
}
// sets the value of the waitForConversion flag
// TRUE : function requestTemperature() etc returns when conversion is ready
// FALSE: function requestTemperature() etc returns immediately (USE WITH CARE!!)
// (1) programmer has to check if the needed delay has passed
// (2) but the application can do meaningful things in that time
void DallasTemperature::setWaitForConversion(bool flag) {
waitForConversion = flag;
}
// gets the value of the waitForConversion flag
bool DallasTemperature::getWaitForConversion() {
return waitForConversion;
}
// sets the value of the checkForConversion flag
// TRUE : function requestTemperature() etc will 'listen' to an IC to determine whether a conversion is complete
// FALSE: function requestTemperature() etc will wait a set time (worst case scenario) for a conversion to complete
void DallasTemperature::setCheckForConversion(bool flag) {
checkForConversion = flag;
}
// gets the value of the waitForConversion flag
bool DallasTemperature::getCheckForConversion() {
return checkForConversion;
}
bool DallasTemperature::isConversionComplete() {
uint8_t b = _wire->read_bit();
return (b == 1);
}
// sends command for all devices on the bus to perform a temperature conversion
void DallasTemperature::requestTemperatures() {
_wire->reset();
_wire->skip();
_wire->write(STARTCONVO, parasite);
// ASYNC mode?
if (!waitForConversion)
return;
blockTillConversionComplete(bitResolution);
}
// sends command for one device to perform a temperature by address
// returns FALSE if device is disconnected
// returns TRUE otherwise
bool DallasTemperature::requestTemperaturesByAddress(
const uint8_t* deviceAddress) {
uint8_t bitResolution = getResolution(deviceAddress);
if (bitResolution == 0) {
return false; //Device disconnected
}
_wire->reset(); // Commented by La Spirulerie
_wire->select(deviceAddress);
_wire->write(STARTCONVO, parasite);
// CODE SPIRULERIE
return (true);
// ORIGINAL CODE BELOW
// ASYNC mode?
if (!waitForConversion)
return true;
blockTillConversionComplete(bitResolution);
return true;
}
// Continue to check if the IC has responded with a temperature
void DallasTemperature::blockTillConversionComplete(uint8_t bitResolution) {
unsigned long delms = millisToWaitForConversion(bitResolution);
if (checkForConversion && !parasite) {
unsigned long start = millis();
while (!isConversionComplete() && (millis() - start < delms))
yield();
} else {
activateExternalPullup();
delay(delms);
deactivateExternalPullup();
}
}
// returns number of milliseconds to wait till conversion is complete (based on IC datasheet)
int16_t DallasTemperature::millisToWaitForConversion(uint8_t bitResolution) {
switch (bitResolution) {
case 9:
return 94;
case 10:
return 188;
case 11:
return 375;
default:
return 750;
}
}
void DallasTemperature::activateExternalPullup() {
if(useExternalPullup)
digitalWrite(pullupPin, LOW);
}
void DallasTemperature::deactivateExternalPullup() {
if(useExternalPullup)
digitalWrite(pullupPin, HIGH);
}
// sends command for one device to perform a temp conversion by index
bool DallasTemperature::requestTemperaturesByIndex(uint8_t deviceIndex) {
DeviceAddress deviceAddress;
getAddress(deviceAddress, deviceIndex);
return requestTemperaturesByAddress(deviceAddress);
}
// Fetch temperature for device index
float DallasTemperature::getTempCByIndex(uint8_t deviceIndex) {
DeviceAddress deviceAddress;
if (!getAddress(deviceAddress, deviceIndex)) {
return DEVICE_DISCONNECTED_C;
}
return getTempC((uint8_t*) deviceAddress);
}
// Fetch temperature for device index
float DallasTemperature::getTempFByIndex(uint8_t deviceIndex) {
DeviceAddress deviceAddress;
if (!getAddress(deviceAddress, deviceIndex)) {
return DEVICE_DISCONNECTED_F;
}
return getTempF((uint8_t*) deviceAddress);
}
// reads scratchpad and returns fixed-point temperature, scaling factor 2^-7
int16_t DallasTemperature::calculateTemperature(const uint8_t* deviceAddress,
uint8_t* scratchPad) {
int16_t fpTemperature = (((int16_t) scratchPad[TEMP_MSB]) << 11)
| (((int16_t) scratchPad[TEMP_LSB]) << 3);
/*
DS1820 and DS18S20 have a 9-bit temperature register.
Resolutions greater than 9-bit can be calculated using the data from
the temperature, and COUNT REMAIN and COUNT PER °C registers in the
scratchpad. The resolution of the calculation depends on the model.
While the COUNT PER °C register is hard-wired to 16 (10h) in a
DS18S20, it changes with temperature in DS1820.
After reading the scratchpad, the TEMP_READ value is obtained by
truncating the 0.5°C bit (bit 0) from the temperature data. The
extended resolution temperature can then be calculated using the
following equation:
COUNT_PER_C - COUNT_REMAIN
TEMPERATURE = TEMP_READ - 0.25 + --------------------------
COUNT_PER_C
Hagai Shatz simplified this to integer arithmetic for a 12 bits
value for a DS18S20, and James Cameron added legacy DS1820 support.
See - http://myarduinotoy.blogspot.co.uk/2013/02/12bit-result-from-ds18s20.html
*/
if ((deviceAddress[0] == DS18S20MODEL) && (scratchPad[COUNT_PER_C] != 0)) {
fpTemperature = ((fpTemperature & 0xfff0) << 3) - 32
+ (((scratchPad[COUNT_PER_C] - scratchPad[COUNT_REMAIN]) << 7)
/ scratchPad[COUNT_PER_C]);
}
return fpTemperature;
}
// returns temperature in 1/128 degrees C or DEVICE_DISCONNECTED_RAW if the
// device's scratch pad cannot be read successfully.
// the numeric value of DEVICE_DISCONNECTED_RAW is defined in
// DallasTemperature.h. It is a large negative number outside the
// operating range of the device
int16_t DallasTemperature::getTemp(const uint8_t* deviceAddress) {
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad))
return calculateTemperature(deviceAddress, scratchPad);
return DEVICE_DISCONNECTED_RAW;
}
// returns temperature in degrees C or DEVICE_DISCONNECTED_C if the
// device's scratch pad cannot be read successfully.
// the numeric value of DEVICE_DISCONNECTED_C is defined in
// DallasTemperature.h. It is a large negative number outside the
// operating range of the device
float DallasTemperature::getTempC(const uint8_t* deviceAddress) {
return rawToCelsius(getTemp(deviceAddress));
}
// returns temperature in degrees F or DEVICE_DISCONNECTED_F if the
// device's scratch pad cannot be read successfully.
// the numeric value of DEVICE_DISCONNECTED_F is defined in
// DallasTemperature.h. It is a large negative number outside the
// operating range of the device
float DallasTemperature::getTempF(const uint8_t* deviceAddress) {
return rawToFahrenheit(getTemp(deviceAddress));
}
// returns true if the bus requires parasite power
bool DallasTemperature::isParasitePowerMode(void) {
return parasite;
}
// IF alarm is not used one can store a 16 bit int of userdata in the alarm
// registers. E.g. an ID of the sensor.
// See github issue #29
// note if device is not connected it will fail writing the data.
void DallasTemperature::setUserData(const uint8_t* deviceAddress,
int16_t data) {
// return when stored value == new value
if (getUserData(deviceAddress) == data)
return;
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad)) {
scratchPad[HIGH_ALARM_TEMP] = data >> 8;
scratchPad[LOW_ALARM_TEMP] = data & 255;
writeScratchPad(deviceAddress, scratchPad);
}
}
int16_t DallasTemperature::getUserData(const uint8_t* deviceAddress) {
int16_t data = 0;
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad)) {
data = scratchPad[HIGH_ALARM_TEMP] << 8;
data += scratchPad[LOW_ALARM_TEMP];
}
return data;
}
// note If address cannot be found no error will be reported.
int16_t DallasTemperature::getUserDataByIndex(uint8_t deviceIndex) {
DeviceAddress deviceAddress;
getAddress(deviceAddress, deviceIndex);
return getUserData((uint8_t*) deviceAddress);
}
void DallasTemperature::setUserDataByIndex(uint8_t deviceIndex, int16_t data) {
DeviceAddress deviceAddress;
getAddress(deviceAddress, deviceIndex);
setUserData((uint8_t*) deviceAddress, data);
}
// Convert float Celsius to Fahrenheit
float DallasTemperature::toFahrenheit(float celsius) {
return (celsius * 1.8) + 32;
}
// Convert float Fahrenheit to Celsius
float DallasTemperature::toCelsius(float fahrenheit) {
return (fahrenheit - 32) * 0.555555556;
}
// convert from raw to Celsius
float DallasTemperature::rawToCelsius(int16_t raw) {
if (raw <= DEVICE_DISCONNECTED_RAW)
return DEVICE_DISCONNECTED_C;
// C = RAW/128
return (float) raw * 0.0078125;
}
// convert from raw to Fahrenheit
float DallasTemperature::rawToFahrenheit(int16_t raw) {
if (raw <= DEVICE_DISCONNECTED_RAW)
return DEVICE_DISCONNECTED_F;
// C = RAW/128
// F = (C*1.8)+32 = (RAW/128*1.8)+32 = (RAW*0.0140625)+32
return ((float) raw * 0.0140625) + 32;
}
// Returns true if all bytes of scratchPad are '\0'
bool DallasTemperature::isAllZeros(const uint8_t * const scratchPad, const size_t length) {
for (size_t i = 0; i < length; i++) {
if (scratchPad[i] != 0) {
return false;
}
}
return true;
}
#if REQUIRESALARMS
/*
ALARMS:
TH and TL Register Format
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
S 2^6 2^5 2^4 2^3 2^2 2^1 2^0
Only bits 11 through 4 of the temperature register are used
in the TH and TL comparison since TH and TL are 8-bit
registers. If the measured temperature is lower than or equal
to TL or higher than or equal to TH, an alarm condition exists
and an alarm flag is set inside the DS18B20. This flag is
updated after every temperature measurement; therefore, if the
alarm condition goes away, the flag will be turned off after
the next temperature conversion.
*/
// sets the high alarm temperature for a device in degrees Celsius
// accepts a float, but the alarm resolution will ignore anything
// after a decimal point. valid range is -55C - 125C
void DallasTemperature::setHighAlarmTemp(const uint8_t* deviceAddress,
int8_t celsius) {
// return when stored value == new value
if (getHighAlarmTemp(deviceAddress) == celsius)
return;
// make sure the alarm temperature is within the device's range
if (celsius > 125)
celsius = 125;
else if (celsius < -55)
celsius = -55;
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad)) {
scratchPad[HIGH_ALARM_TEMP] = (uint8_t) celsius;
writeScratchPad(deviceAddress, scratchPad);
}
}
// sets the low alarm temperature for a device in degrees Celsius
// accepts a float, but the alarm resolution will ignore anything
// after a decimal point. valid range is -55C - 125C
void DallasTemperature::setLowAlarmTemp(const uint8_t* deviceAddress,
int8_t celsius) {
// return when stored value == new value
if (getLowAlarmTemp(deviceAddress) == celsius)
return;
// make sure the alarm temperature is within the device's range
if (celsius > 125)
celsius = 125;
else if (celsius < -55)
celsius = -55;
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad)) {
scratchPad[LOW_ALARM_TEMP] = (uint8_t) celsius;
writeScratchPad(deviceAddress, scratchPad);
}
}
// returns a int8_t with the current high alarm temperature or
// DEVICE_DISCONNECTED for an address
int8_t DallasTemperature::getHighAlarmTemp(const uint8_t* deviceAddress) {
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad))
return (int8_t) scratchPad[HIGH_ALARM_TEMP];
return DEVICE_DISCONNECTED_C;
}
// returns a int8_t with the current low alarm temperature or
// DEVICE_DISCONNECTED for an address
int8_t DallasTemperature::getLowAlarmTemp(const uint8_t* deviceAddress) {
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad))
return (int8_t) scratchPad[LOW_ALARM_TEMP];
return DEVICE_DISCONNECTED_C;
}
// resets internal variables used for the alarm search
void DallasTemperature::resetAlarmSearch() {
alarmSearchJunction = -1;
alarmSearchExhausted = 0;
for (uint8_t i = 0; i < 7; i++) {
alarmSearchAddress[i] = 0;
}
}
// This is a modified version of the OneWire::search method.
//
// Also added the OneWire search fix documented here:
// http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295
//
// Perform an alarm search. If this function returns a '1' then it has
// enumerated the next device and you may retrieve the ROM from the
// OneWire::address variable. If there are no devices, no further
// devices, or something horrible happens in the middle of the
// enumeration then a 0 is returned. If a new device is found then
// its address is copied to newAddr. Use
// DallasTemperature::resetAlarmSearch() to start over.
bool DallasTemperature::alarmSearch(uint8_t* newAddr) {
uint8_t i;
int8_t lastJunction = -1;
uint8_t done = 1;
if (alarmSearchExhausted)
return false;
if (!_wire->reset())
return false;
// send the alarm search command
_wire->write(0xEC, 0);
for (i = 0; i < 64; i++) {
uint8_t a = _wire->read_bit();
uint8_t nota = _wire->read_bit();
uint8_t ibyte = i / 8;
uint8_t ibit = 1 << (i & 7);
// I don't think this should happen, this means nothing responded, but maybe if
// something vanishes during the search it will come up.
if (a && nota)
return false;
if (!a && !nota) {
if (i == alarmSearchJunction) {
// this is our time to decide differently, we went zero last time, go one.
a = 1;
alarmSearchJunction = lastJunction;
} else if (i < alarmSearchJunction) {
// take whatever we took last time, look in address
if (alarmSearchAddress[ibyte] & ibit) {
a = 1;
} else {
// Only 0s count as pending junctions, we've already exhausted the 0 side of 1s
a = 0;
done = 0;
lastJunction = i;
}
} else {
// we are blazing new tree, take the 0
a = 0;
alarmSearchJunction = i;
done = 0;
}
// OneWire search fix
// See: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295
}
if (a)
alarmSearchAddress[ibyte] |= ibit;
else
alarmSearchAddress[ibyte] &= ~ibit;
_wire->write_bit(a);
}
if (done)
alarmSearchExhausted = 1;
for (i = 0; i < 8; i++)
newAddr[i] = alarmSearchAddress[i];
return true;
}
// returns true if device address might have an alarm condition
// (only an alarm search can verify this)
bool DallasTemperature::hasAlarm(const uint8_t* deviceAddress) {
ScratchPad scratchPad;
if (isConnected(deviceAddress, scratchPad)) {
int8_t temp = calculateTemperature(deviceAddress, scratchPad) >> 7;
// check low alarm
if (temp <= (int8_t) scratchPad[LOW_ALARM_TEMP])
return true;
// check high alarm
if (temp >= (int8_t) scratchPad[HIGH_ALARM_TEMP])
return true;
}
// no alarm
return false;
}
// returns true if any device is reporting an alarm condition on the bus
bool DallasTemperature::hasAlarm(void) {
DeviceAddress deviceAddress;
resetAlarmSearch();
return alarmSearch(deviceAddress);
}
// runs the alarm handler for all devices returned by alarmSearch()
// unless there no _AlarmHandler exist.
void DallasTemperature::processAlarms(void) {
if (!hasAlarmHandler())
{
return;
}
resetAlarmSearch();
DeviceAddress alarmAddr;
while (alarmSearch(alarmAddr)) {
if (validAddress(alarmAddr)) {
_AlarmHandler(alarmAddr);
}
}
}
// sets the alarm handler
void DallasTemperature::setAlarmHandler(const AlarmHandler *handler) {
_AlarmHandler = handler;
}
// checks if AlarmHandler has been set.
bool DallasTemperature::hasAlarmHandler()
{
return _AlarmHandler != NO_ALARM_HANDLER;
}
#endif
#if REQUIRESNEW
// MnetCS - Allocates memory for DallasTemperature. Allows us to instance a new object
void* DallasTemperature::operator new(unsigned int size) { // Implicit NSS obj size
void * p;// void pointer
p = malloc(size);// Allocate memory
memset((DallasTemperature*)p,0,size);// Initialise memory
//!!! CANT EXPLICITLY CALL CONSTRUCTOR - workaround by using an init() methodR - workaround by using an init() method
return (DallasTemperature*) p;// Cast blank region to NSS pointer
}
// MnetCS 2009 - Free the memory used by this instance
void DallasTemperature::operator delete(void* p) {
DallasTemperature* pNss = (DallasTemperature*) p; // Cast to NSS pointer
pNss->~DallasTemperature();// Destruct the object
free(p);// Free the memory
}
#endif

+ 274
- 0
MK3_Firmware/lib/DallasTemperature_Modified/DallasTemperature.h 查看文件

@@ -0,0 +1,274 @@
#ifndef DallasTemperature_h
#define DallasTemperature_h
#define DALLASTEMPLIBVERSION "3.8.1" // To be deprecated -> TODO remove in 4.0.0
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// set to true to include code for new and delete operators
#ifndef REQUIRESNEW
#define REQUIRESNEW false
#endif
// set to true to include code implementing alarm search functions
#ifndef REQUIRESALARMS
#define REQUIRESALARMS true
#endif
#include <inttypes.h>
#ifdef __STM32F1__
#include <OneWireSTM.h>
#else
#include <OneWire.h>
#endif
// Model IDs
#define DS18S20MODEL 0x10 // also DS1820
#define DS18B20MODEL 0x28
#define DS1822MODEL 0x22
#define DS1825MODEL 0x3B
#define DS28EA00MODEL 0x42
// Error Codes
#define DEVICE_DISCONNECTED_C -127
#define DEVICE_DISCONNECTED_F -196.6
#define DEVICE_DISCONNECTED_RAW -7040
// For readPowerSupply on oneWire bus
#ifndef nullptr
#define nullptr NULL
#endif
typedef uint8_t DeviceAddress[8];
class DallasTemperature {
public:
DallasTemperature();
DallasTemperature(OneWire*);
DallasTemperature(OneWire*, uint8_t);
void setOneWire(OneWire*);
void setPullupPin(uint8_t);
// initialise bus
void begin(void);
// returns the number of devices found on the bus
uint8_t getDeviceCount(void);
// returns the number of DS18xxx Family devices on bus
uint8_t getDS18Count(void);
// returns true if address is valid
bool validAddress(const uint8_t*);
// returns true if address is of the family of sensors the lib supports.
bool validFamily(const uint8_t* deviceAddress);
// finds an address at a given index on the bus
bool getAddress(uint8_t*, uint8_t);
// attempt to determine if the device at the given address is connected to the bus
bool isConnected(const uint8_t*);
// attempt to determine if the device at the given address is connected to the bus
// also allows for updating the read scratchpad
bool isConnected(const uint8_t*, uint8_t*);
// read device's scratchpad
bool readScratchPad(const uint8_t*, uint8_t*);
// write device's scratchpad
void writeScratchPad(const uint8_t*, const uint8_t*);
// read device's power requirements
bool readPowerSupply(const uint8_t* deviceAddress = nullptr);
// get global resolution
uint8_t getResolution();
// set global resolution to 9, 10, 11, or 12 bits
void setResolution(uint8_t);
// returns the device resolution: 9, 10, 11, or 12 bits
uint8_t getResolution(const uint8_t*);
// set resolution of a device to 9, 10, 11, or 12 bits
bool setResolution(const uint8_t*, uint8_t,
bool skipGlobalBitResolutionCalculation = false);
// sets/gets the waitForConversion flag
void setWaitForConversion(bool);
bool getWaitForConversion(void);
// sets/gets the checkForConversion flag
void setCheckForConversion(bool);
bool getCheckForConversion(void);
// sends command for all devices on the bus to perform a temperature conversion
void requestTemperatures(void);
// sends command for one device to perform a temperature conversion by address
bool requestTemperaturesByAddress(const uint8_t*);
// sends command for one device to perform a temperature conversion by index
bool requestTemperaturesByIndex(uint8_t);
// returns temperature raw value (12 bit integer of 1/128 degrees C)
int16_t getTemp(const uint8_t*);
// returns temperature in degrees C
float getTempC(const uint8_t*);
// returns temperature in degrees F
float getTempF(const uint8_t*);
// Get temperature for device index (slow)
float getTempCByIndex(uint8_t);
// Get temperature for device index (slow)
float getTempFByIndex(uint8_t);
// returns true if the bus requires parasite power
bool isParasitePowerMode(void);
// Is a conversion complete on the wire? Only applies to the first sensor on the wire.
bool isConversionComplete(void);
int16_t millisToWaitForConversion(uint8_t);
#if REQUIRESALARMS
typedef void AlarmHandler(const uint8_t*);
// sets the high alarm temperature for a device
// accepts a int8_t. valid range is -55C - 125C
void setHighAlarmTemp(const uint8_t*, int8_t);
// sets the low alarm temperature for a device
// accepts a int8_t. valid range is -55C - 125C
void setLowAlarmTemp(const uint8_t*, int8_t);
// returns a int8_t with the current high alarm temperature for a device
// in the range -55C - 125C
int8_t getHighAlarmTemp(const uint8_t*);
// returns a int8_t with the current low alarm temperature for a device
// in the range -55C - 125C
int8_t getLowAlarmTemp(const uint8_t*);
// resets internal variables used for the alarm search
void resetAlarmSearch(void);
// search the wire for devices with active alarms
bool alarmSearch(uint8_t*);
// returns true if ia specific device has an alarm
bool hasAlarm(const uint8_t*);
// returns true if any device is reporting an alarm on the bus
bool hasAlarm(void);
// runs the alarm handler for all devices returned by alarmSearch()
void processAlarms(void);
// sets the alarm handler
void setAlarmHandler(const AlarmHandler *);
// returns true if an AlarmHandler has been set
bool hasAlarmHandler();
#endif
// if no alarm handler is used the two bytes can be used as user data
// example of such usage is an ID.
// note if device is not connected it will fail writing the data.
// note if address cannot be found no error will be reported.
// in short use carefully
void setUserData(const uint8_t*, int16_t);
void setUserDataByIndex(uint8_t, int16_t);
int16_t getUserData(const uint8_t*);
int16_t getUserDataByIndex(uint8_t);
// convert from Celsius to Fahrenheit
static float toFahrenheit(float);
// convert from Fahrenheit to Celsius
static float toCelsius(float);
// convert from raw to Celsius
static float rawToCelsius(int16_t);
// convert from raw to Fahrenheit
static float rawToFahrenheit(int16_t);
#if REQUIRESNEW
// initialize memory area
void* operator new (unsigned int);
// delete memory reference
void operator delete(void*);
#endif
private:
typedef uint8_t ScratchPad[9];
// parasite power on or off
bool parasite;
// external pullup
bool useExternalPullup;
uint8_t pullupPin;
// used to determine the delay amount needed to allow for the
// temperature conversion to take place
uint8_t bitResolution;
// used to requestTemperature with or without delay
bool waitForConversion;
// used to requestTemperature to dynamically check if a conversion is complete
bool checkForConversion;
// count of devices on the bus
uint8_t devices;
// count of DS18xxx Family devices on bus
uint8_t ds18Count;
// Take a pointer to one wire instance
OneWire* _wire;
// reads scratchpad and returns the raw temperature
int16_t calculateTemperature(const uint8_t*, uint8_t*);
void blockTillConversionComplete(uint8_t);
// Returns true if all bytes of scratchPad are '\0'
bool isAllZeros(const uint8_t* const scratchPad, const size_t length = 9);
// External pullup control
void activateExternalPullup(void);
void deactivateExternalPullup(void);
#if REQUIRESALARMS
// required for alarmSearch
uint8_t alarmSearchAddress[8];
int8_t alarmSearchJunction;
uint8_t alarmSearchExhausted;
// the alarm handler function pointer
AlarmHandler *_AlarmHandler;
#endif
};
#endif

+ 72
- 0
MK3_Firmware/lib/DallasTemperature_Modified/README.md 查看文件

@@ -0,0 +1,72 @@
# Arduino Library for Maxim Temperature Integrated Circuits

## Usage

This library supports the following devices :


* DS18B20
* DS18S20 - Please note there appears to be an issue with this series.
* DS1822
* DS1820
* MAX31820


You will need a pull-up resistor of about 5 KOhm between the 1-Wire data line
and your 5V power. If you are using the DS18B20, ground pins 1 and 3. The
centre pin is the data line '1-wire'.

In case of temperature conversion problems (result is `-85`), strong pull-up setup may be necessary. See section
_Powering the DS18B20_ in
[DS18B20 datasheet](https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf) (page 7)
and use `DallasTemperature(OneWire*, uint8_t)` constructor.

We have included a "REQUIRESNEW" and "REQUIRESALARMS" definition. If you
want to slim down the code feel free to use either of these by including



#define REQUIRESNEW

or

#define REQUIRESALARMS


at the top of DallasTemperature.h

Finally, please include OneWire from Paul Stoffregen in the library manager before you begin.

## Credits

The OneWire code has been derived from
http://www.arduino.cc/playground/Learning/OneWire.
Miles Burton <miles@mnetcs.com> originally developed this library.
Tim Newsome <nuisance@casualhacker.net> added support for multiple sensors on
the same bus.
Guil Barros [gfbarros@bappos.com] added getTempByAddress (v3.5)
Note: these are implemented as getTempC(address) and getTempF(address)
Rob Tillaart [rob.tillaart@gmail.com] added async modus (v3.7.0)


## Website


You can find the latest version of the library at
https://www.milesburton.com/Dallas_Temperature_Control_Library

# License

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

+ 162
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/Alarm/Alarm.pde 查看文件

@@ -0,0 +1,162 @@
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");

// Start up the library
sensors.begin();
// locate devices on the bus
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");

// search for devices on the bus and assign based on an index.
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

// show the addresses we found on the bus
Serial.print("Device 0 Address: ");
printAddress(insideThermometer);
Serial.println();

Serial.print("Device 0 Alarms: ");
printAlarms(insideThermometer);
Serial.println();
Serial.print("Device 1 Address: ");
printAddress(outsideThermometer);
Serial.println();

Serial.print("Device 1 Alarms: ");
printAlarms(outsideThermometer);
Serial.println();
Serial.println("Setting alarm temps...");

// alarm when temp is higher than 30C
sensors.setHighAlarmTemp(insideThermometer, 30);
// alarm when temp is lower than -10C
sensors.setLowAlarmTemp(insideThermometer, -10);
// alarm when temp is higher than 31C
sensors.setHighAlarmTemp(outsideThermometer, 31);
// alarn when temp is lower than 27C
sensors.setLowAlarmTemp(outsideThermometer, 27);
Serial.print("New Device 0 Alarms: ");
printAlarms(insideThermometer);
Serial.println();
Serial.print("New Device 1 Alarms: ");
printAlarms(outsideThermometer);
Serial.println();
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}

void printAlarms(uint8_t deviceAddress[])
{
char temp;
temp = sensors.getHighAlarmTemp(deviceAddress);
Serial.print("High Alarm: ");
Serial.print(temp, DEC);
Serial.print("C/");
Serial.print(DallasTemperature::toFahrenheit(temp));
Serial.print("F | Low Alarm: ");
temp = sensors.getLowAlarmTemp(deviceAddress);
Serial.print(temp, DEC);
Serial.print("C/");
Serial.print(DallasTemperature::toFahrenheit(temp));
Serial.print("F");
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
Serial.print("Device Address: ");
printAddress(deviceAddress);
Serial.print(" ");
printTemperature(deviceAddress);
Serial.println();
}

void checkAlarm(DeviceAddress deviceAddress)
{
if (sensors.hasAlarm(deviceAddress))
{
Serial.print("ALARM: ");
printData(deviceAddress);
}
}

void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");

// Method 1:
// check each address individually for an alarm condition
checkAlarm(insideThermometer);
checkAlarm(outsideThermometer);
/*
// Alternate method:
// Search the bus and iterate through addresses of devices with alarms
// space for the alarm device's address
DeviceAddress alarmAddr;

Serial.println("Searching for alarms...");
// resetAlarmSearch() must be called before calling alarmSearch()
sensors.resetAlarmSearch();
// alarmSearch() returns 0 when there are no devices with alarms
while (sensors.alarmSearch(alarmAddr))
{
Serial.print("ALARM: ");
printData(alarmAddr);
}
*/

}

+ 144
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/AlarmHandler/AlarmHandler.pde 查看文件

@@ -0,0 +1,144 @@
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

// function that will be called when an alarm condition exists during DallasTemperatures::processAlarms();
void newAlarmHandler(uint8_t* deviceAddress)
{
Serial.println("Alarm Handler Start");
printAlarmInfo(deviceAddress);
printTemp(deviceAddress);
Serial.println();
Serial.println("Alarm Handler Finish");
}

void printCurrentTemp(DeviceAddress deviceAddress)
{
printAddress(deviceAddress);
printTemp(deviceAddress);
Serial.println();
}

void printAddress(DeviceAddress deviceAddress)
{
Serial.print("Address: ");
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
Serial.print(" ");
}

void printTemp(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC != DEVICE_DISCONNECTED_C)
{
Serial.print("Current Temp C: ");
Serial.print(tempC);
}
else Serial.print("DEVICE DISCONNECTED");
Serial.print(" ");
}

void printAlarmInfo(DeviceAddress deviceAddress)
{
char temp;
printAddress(deviceAddress);
temp = sensors.getHighAlarmTemp(deviceAddress);
Serial.print("High Alarm: ");
Serial.print(temp, DEC);
Serial.print("C");
Serial.print(" Low Alarm: ");
temp = sensors.getLowAlarmTemp(deviceAddress);
Serial.print(temp, DEC);
Serial.print("C");
Serial.print(" ");
}

void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");

// Start up the library
sensors.begin();
// locate devices on the bus
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");

// search for devices on the bus and assign based on an index
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

Serial.print("Device insideThermometer ");
printAlarmInfo(insideThermometer);
Serial.println();
Serial.print("Device outsideThermometer ");
printAlarmInfo(outsideThermometer);
Serial.println();
// set alarm ranges
Serial.println("Setting alarm temps...");
sensors.setHighAlarmTemp(insideThermometer, 26);
sensors.setLowAlarmTemp(insideThermometer, 22);
sensors.setHighAlarmTemp(outsideThermometer, 25);
sensors.setLowAlarmTemp(outsideThermometer, 21);
Serial.print("New insideThermometer ");
printAlarmInfo(insideThermometer);
Serial.println();
Serial.print("New outsideThermometer ");
printAlarmInfo(outsideThermometer);
Serial.println();

// attach alarm handler
sensors.setAlarmHandler(&newAlarmHandler);

}

void loop(void)
{
// ask the devices to measure the temperature
sensors.requestTemperatures();
// if an alarm condition exists as a result of the most recent
// requestTemperatures() request, it exists until the next time
// requestTemperatures() is called AND there isn't an alarm condition
// on the device
if (sensors.hasAlarm())
{
Serial.println("Oh noes! There is at least one alarm on the bus.");
}

// call alarm handler function defined by sensors.setAlarmHandler
// for each device reporting an alarm
sensors.processAlarms();

if (!sensors.hasAlarm())
{
// just print out the current temperature
printCurrentTemp(insideThermometer);
printCurrentTemp(outsideThermometer);
}
delay(1000);
}

+ 35
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/ExternalPullup/ExternalPullup.ino 查看文件

@@ -0,0 +1,35 @@
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino, while external pullup P-MOSFET gate into port 3
#define ONE_WIRE_BUS 2
#define ONE_WIRE_PULLUP 3
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire, ONE_WIRE_PULLUP);
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
}
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
for(int i=0;i<sensors.getDeviceCount();i++) {
Serial.println("Temperature for Device "+String(i)+" is: " + String(sensors.getTempCByIndex(i)));
}
}

+ 43
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/Multibus_simple/Multibus_simple.ino 查看文件

@@ -0,0 +1,43 @@
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire ds18x20[] = { 3, 7 };
const int oneWireCount = sizeof(ds18x20)/sizeof(OneWire);
DallasTemperature sensor[oneWireCount];

void setup(void) {
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature Multiple Bus Control Library Simple Demo");
Serial.print("============Ready with ");
Serial.print(oneWireCount);
Serial.println(" Sensors================");
// Start up the library on all defined bus-wires
DeviceAddress deviceAddress;
for (int i = 0; i < oneWireCount; i++) {;
sensor[i].setOneWire(&ds18x20[i]);
sensor[i].begin();
if (sensor[i].getAddress(deviceAddress, 0)) sensor[i].setResolution(deviceAddress, 12);
}
}

void loop(void) {
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
for (int i = 0; i < oneWireCount; i++) {
sensor[i].requestTemperatures();
}
Serial.println("DONE");
delay(1000);
for (int i = 0; i < oneWireCount; i++) {
float temperature = sensor[i].getTempCByIndex(0);
Serial.print("Temperature for the sensor ");
Serial.print(i);
Serial.print(" is ");
Serial.println(temperature);
}
Serial.println();
}

+ 148
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/Multiple/Multiple.pde 查看文件

@@ -0,0 +1,148 @@
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

// Assign address manually. The addresses below will beed to be changed
// to valid device addresses on your bus. Device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via
// sensors.getAddress(deviceAddress, index)
// DeviceAddress insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
// DeviceAddress outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");

// Start up the library
sensors.begin();

// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");

// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");

// Search for devices on the bus and assign based on an index. Ideally,
// you would do this to initially discover addresses on the bus and then
// use those addresses and manually assign them (see above) once you know
// the devices on your bus (and assuming they don't change).
//
// method 1: by index
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

// method 2: search()
// search() looks for the next device. Returns 1 if a new address has been
// returned. A zero might mean that the bus is shorted, there are no devices,
// or you have already retrieved all of them. It might be a good idea to
// check the CRC to make sure you didn't get garbage. The order is
// deterministic. You will always get the same devices in the same order
//
// Must be called before search()
//oneWire.reset_search();
// assigns the first address found to insideThermometer
//if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
// assigns the seconds address found to outsideThermometer
//if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");

// show the addresses we found on the bus
Serial.print("Device 0 Address: ");
printAddress(insideThermometer);
Serial.println();

Serial.print("Device 1 Address: ");
printAddress(outsideThermometer);
Serial.println();

// set the resolution to 9 bit per device
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);

Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(insideThermometer), DEC);
Serial.println();

Serial.print("Device 1 Resolution: ");
Serial.print(sensors.getResolution(outsideThermometer), DEC);
Serial.println();
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
return;
}
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}

// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
Serial.print("Resolution: ");
Serial.print(sensors.getResolution(deviceAddress));
Serial.println();
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
Serial.print("Device Address: ");
printAddress(deviceAddress);
Serial.print(" ");
printTemperature(deviceAddress);
Serial.println();
}

/*
Main function, calls the temperatures in a loop.
*/
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");

// print the device information
printData(insideThermometer);
printData(outsideThermometer);
}

+ 47
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/SetUserData/SetUserData.ino 查看文件

@@ -0,0 +1,47 @@
//
// This sketch does not use the ALARM registers and uses those 2 bytes as a counter
// these 2 bytes can be used for other purposes as well e.g. last temperature or
// a specific ID.
//

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

int count = 0;

void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");

// Start up the library
sensors.begin();
}

void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));
count++;
sensors.setUserDataByIndex(0, count);
int x = sensors.getUserDataByIndex(0);
Serial.println(count);
}

+ 51
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/Simple/Simple.pde 查看文件

@@ -0,0 +1,51 @@
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

/*
* The setup function. We only start the sensors here
*/
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");

// Start up the library
sensors.begin();
}

/*
* Main function, get and show the temperature
*/
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
// After we got the temperatures, we can print them here.
// We use the function ByIndex, and as an example get the temperature from the first sensor only.
float tempC = sensors.getTempCByIndex(0);

// Check if reading was successful
if(tempC != DEVICE_DISCONNECTED_C)
{
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(tempC);
}
else
{
Serial.println("Error: Could not read temperature data");
}
}

+ 121
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/Single/Single.pde 查看文件

@@ -0,0 +1,121 @@
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;

/*
* Setup function. Here we do the basics
*/
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");

// locate devices on the bus
Serial.print("Locating devices...");
sensors.begin();
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");

// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
// Assign address manually. The addresses below will beed to be changed
// to valid device addresses on your bus. Device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via
// sensors.getAddress(deviceAddress, index)
// Note that you will need to use your specific address here
//insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

// Method 1:
// Search for devices on the bus and assign based on an index. Ideally,
// you would do this to initially discover addresses on the bus and then
// use those addresses and manually assign them (see above) once you know
// the devices on your bus (and assuming they don't change).
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
// method 2: search()
// search() looks for the next device. Returns 1 if a new address has been
// returned. A zero might mean that the bus is shorted, there are no devices,
// or you have already retrieved all of them. It might be a good idea to
// check the CRC to make sure you didn't get garbage. The order is
// deterministic. You will always get the same devices in the same order
//
// Must be called before search()
//oneWire.reset_search();
// assigns the first address found to insideThermometer
//if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");

// show the addresses we found on the bus
Serial.print("Device 0 Address: ");
printAddress(insideThermometer);
Serial.println();

// set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
sensors.setResolution(insideThermometer, 9);
Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(insideThermometer), DEC);
Serial.println();
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
// method 1 - slower
//Serial.print("Temp C: ");
//Serial.print(sensors.getTempC(deviceAddress));
//Serial.print(" Temp F: ");
//Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

// method 2 - faster
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
return;
}
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}
/*
* Main function. It will request the tempC from the sensors and display on Serial.
*/
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
// It responds almost immediately. Let's print out the data
printTemperature(insideThermometer); // Use a simple function to print out the data
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}

+ 129
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/Tester/Tester.pde 查看文件

@@ -0,0 +1,129 @@
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9 // Lower resolution

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address

void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");

// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");

// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++)
{
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i))
{
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
printAddress(tempDeviceAddress);
Serial.println();
Serial.print("Setting resolution to ");
Serial.println(TEMPERATURE_PRECISION, DEC);
// set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
Serial.print("Resolution actually set to: ");
Serial.print(sensors.getResolution(tempDeviceAddress), DEC);
Serial.println();
}else{
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
}

}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
// method 1 - slower
//Serial.print("Temp C: ");
//Serial.print(sensors.getTempC(deviceAddress));
//Serial.print(" Temp F: ");
//Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

// method 2 - faster
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
return;
}
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}

void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++)
{
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i))
{
// Output the device ID
Serial.print("Temperature for device: ");
Serial.println(i,DEC);
// It responds almost immediately. Let's print out the data
printTemperature(tempDeviceAddress); // Use a simple function to print out the data
}
//else ghost device! Check your power requirements and cabling
}
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}

+ 45
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/TwoPin_DS18B20/TwoPin_DS18B20.ino 查看文件

@@ -0,0 +1,45 @@
//
// FILE: TwoPin_DS18B20.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// PURPOSE: two pins for two sensors demo
// DATE: 2014-06-13
// URL: http://forum.arduino.cc/index.php?topic=216835.msg1764333#msg1764333
//
// Released to the public domain
//

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS_1 2
#define ONE_WIRE_BUS_2 4

OneWire oneWire_in(ONE_WIRE_BUS_1);
OneWire oneWire_out(ONE_WIRE_BUS_2);

DallasTemperature sensor_inhouse(&oneWire_in);
DallasTemperature sensor_outhouse(&oneWire_out);

void setup(void)
{
Serial.begin(9600);
Serial.println("Dallas Temperature Control Library Demo - TwoPin_DS18B20");

sensor_inhouse.begin();
sensor_outhouse.begin();
}

void loop(void)
{
Serial.print("Requesting temperatures...");
sensor_inhouse.requestTemperatures();
sensor_outhouse.requestTemperatures();
Serial.println(" done");

Serial.print("Inhouse: ");
Serial.println(sensor_inhouse.getTempCByIndex(0));

Serial.print("Outhouse: ");
Serial.println(sensor_outhouse.getTempCByIndex(0));
}

+ 115
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/UserDataDemo/UserDataDemo.ino 查看文件

@@ -0,0 +1,115 @@
//
// FILE: UserDataDemo.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.0
// PURPOSE: use of alarm field as user identification demo
// DATE: 2019-12-23
// URL:
//
// Released to the public domain
//

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

uint8_t deviceCount = 0;

// Add 4 prepared sensors to the bus
// use the UserDataWriteBatch demo to prepare 4 different labeled sensors
struct
{
int id;
DeviceAddress addr;
} T[4];

float getTempByID(int id)
{
for (uint8_t index = 0; index < deviceCount; index++)
{
if (T[index].id == id)
{
return sensors.getTempC(T[index].addr);
}
}
return -999;
}

void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}

void setup(void)
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.println("Dallas Temperature Demo");

sensors.begin();
// count devices
deviceCount = sensors.getDeviceCount();
Serial.print("#devices: ");
Serial.println(deviceCount);

// Read ID's per sensor
// and put them in T array
for (uint8_t index = 0; index < deviceCount; index++)
{
// go through sensors
sensors.getAddress(T[index].addr, index);
T[index].id = sensors.getUserData(T[index].addr);
}

// Check all 4 sensors are set
for (uint8_t index = 0; index < deviceCount; index++)
{
Serial.println();
Serial.println(T[index].id);
printAddress(T[index].addr);
Serial.println();
}
Serial.println();

}


void loop(void)
{
Serial.println();
Serial.print(millis());
Serial.println("\treq temp");
sensors.requestTemperatures();

Serial.print(millis());
Serial.println("\tGet temp by address");
for (int i = 0; i < 4; i++)
{
Serial.print(millis());
Serial.print("\t temp:\t");
Serial.println(sensors.getTempC(T[i].addr));
}

Serial.print(millis());
Serial.println("\tGet temp by ID"); // assume ID = 0, 1, 2, 3
for (int id = 0; id < 4; id++)
{
Serial.print(millis());
Serial.print("\t temp:\t");
Serial.println(getTempByID(id));
}

delay(1000);
}

// END OF FILE

+ 107
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/UserDataWriteBatch/UserDataWriteBatch.ino 查看文件

@@ -0,0 +1,107 @@
//
// FILE: UserDataWriteBatch.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.0
// PURPOSE: use of alarm field as user identification demo
// DATE: 2019-12-23
// URL:
//
// Released to the public domain
//

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

uint8_t deviceCount = 0;

void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}



void setup(void)
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.println("Write user ID to DS18B20\n");

sensors.begin();

// count devices
deviceCount = sensors.getDeviceCount();
Serial.print("#devices: ");
Serial.println(deviceCount);
Serial.println();
Serial.println("current ID's");
for (uint8_t index = 0; index < deviceCount; index++)
{
DeviceAddress t;
sensors.getAddress(t, index);
printAddress(t);
Serial.print("\t\tID: ");
int id = sensors.getUserData(t);
Serial.println(id);
}
Serial.println();
Serial.print("Enter ID for batch: ");
int c = 0;
int id = 0;
while (c != '\n' && c != '\r')
{
c = Serial.read();
switch(c)
{
case '0'...'9':
id *= 10;
id += (c - '0');
break;
default:
break;
}
}
Serial.println();
Serial.println(id);
Serial.println();

Serial.println("Start labeling ...");
for (uint8_t index = 0; index < deviceCount; index++)
{
Serial.print(".");
DeviceAddress t;
sensors.getAddress(t, index);
sensors.setUserData(t, id);
}
Serial.println();

Serial.println();
Serial.println("Show results ...");
for (uint8_t index = 0; index < deviceCount; index++)
{
DeviceAddress t;
sensors.getAddress(t, index);
printAddress(t);
Serial.print("\t\tID: ");
int id = sensors.getUserData(t);
Serial.println(id);
}
Serial.println("Done ...");

}

void loop(void) {}

// END OF FILE

+ 66
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/WaitForConversion/WaitForConversion.pde 查看文件

@@ -0,0 +1,66 @@
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup(void)
{
// start serial port
Serial.begin(115200);
Serial.println("Dallas Temperature Control Library - Async Demo");
Serial.println("\nDemo shows the difference in length of the call\n\n");

// Start up the library
sensors.begin();
}

void loop(void)
{
// Request temperature conversion (traditional)
Serial.println("Before blocking requestForConversion");
unsigned long start = millis();

sensors.requestTemperatures();

unsigned long stop = millis();
Serial.println("After blocking requestForConversion");
Serial.print("Time used: ");
Serial.println(stop - start);
// get temperature
Serial.print("Temperature: ");
Serial.println(sensors.getTempCByIndex(0));
Serial.println("\n");
// Request temperature conversion - non-blocking / async
Serial.println("Before NON-blocking/async requestForConversion");
start = millis();
sensors.setWaitForConversion(false); // makes it async
sensors.requestTemperatures();
sensors.setWaitForConversion(true);
stop = millis();
Serial.println("After NON-blocking/async requestForConversion");
Serial.print("Time used: ");
Serial.println(stop - start);
// 9 bit resolution by default
// Note the programmer is responsible for the right delay
// we could do something usefull here instead of the delay
int resolution = 9;
delay(750/ (1 << (12-resolution)));
// get temperature
Serial.print("Temperature: ");
Serial.println(sensors.getTempCByIndex(0));
Serial.println("\n\n\n\n");
delay(5000);
}

+ 80
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/WaitForConversion2/WaitForConversion2.pde 查看文件

@@ -0,0 +1,80 @@
//
// Sample of using Async reading of Dallas Temperature Sensors
//
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

DeviceAddress tempDeviceAddress;

int resolution = 12;
unsigned long lastTempRequest = 0;
int delayInMillis = 0;
float temperature = 0.0;
int idle = 0;
//
// SETUP
//
void setup(void)
{
Serial.begin(115200);
Serial.println("Dallas Temperature Control Library - Async Demo");
Serial.print("Library Version: ");
Serial.println(DALLASTEMPLIBVERSION);
Serial.println("\n");

sensors.begin();
sensors.getAddress(tempDeviceAddress, 0);
sensors.setResolution(tempDeviceAddress, resolution);
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
delayInMillis = 750 / (1 << (12 - resolution));
lastTempRequest = millis();
pinMode(13, OUTPUT);
}

void loop(void)
{
if (millis() - lastTempRequest >= delayInMillis) // waited long enough??
{
digitalWrite(13, LOW);
Serial.print(" Temperature: ");
temperature = sensors.getTempCByIndex(0);
Serial.println(temperature, resolution - 8);
Serial.print(" Resolution: ");
Serial.println(resolution);
Serial.print("Idle counter: ");
Serial.println(idle);
Serial.println();
idle = 0;
// immediately after fetching the temperature we request a new sample
// in the async modus
// for the demo we let the resolution change to show differences
resolution++;
if (resolution > 12) resolution = 9;
sensors.setResolution(tempDeviceAddress, resolution);
sensors.requestTemperatures();
delayInMillis = 750 / (1 << (12 - resolution));
lastTempRequest = millis();
}
digitalWrite(13, HIGH);
// we can do usefull things here
// for the demo we just count the idle time in millis
delay(1);
idle++;
}

+ 67
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/oneWireSearch/oneWireSearch.ino 查看文件

@@ -0,0 +1,67 @@
//
// FILE: oneWireSearch.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.02
// PURPOSE: scan for 1-Wire devices + code snippet generator
// DATE: 2015-june-30
// URL: http://forum.arduino.cc/index.php?topic=333923
//
// inspired by http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
//
// Released to the public domain
//
// 0.1.00 initial version
// 0.1.01 first published version
// 0.1.02 small output changes

#include <OneWire.h>

void setup()
{
Serial.begin(115200);
Serial.println("//\n// Start oneWireSearch.ino \n//");

for (uint8_t pin = 2; pin < 13; pin++)
{
findDevices(pin);
}
Serial.println("\n//\n// End oneWireSearch.ino \n//");
}

void loop()
{
}

uint8_t findDevices(int pin)
{
OneWire ow(pin);

uint8_t address[8];
uint8_t count = 0;


if (ow.search(address))
{
Serial.print("\nuint8_t pin");
Serial.print(pin, DEC);
Serial.println("[][8] = {");
do {
count++;
Serial.println(" {");
for (uint8_t i = 0; i < 8; i++)
{
Serial.print("0x");
if (address[i] < 0x10) Serial.print("0");
Serial.print(address[i], HEX);
if (i < 7) Serial.print(", ");
}
Serial.println(" },");
} while (ow.search(address));

Serial.println("};");
Serial.print("// nr devices found: ");
Serial.println(count);
}

return count;
}

+ 92
- 0
MK3_Firmware/lib/DallasTemperature_Modified/examples/readPowerSupply/readPowerSupply.ino 查看文件

@@ -0,0 +1,92 @@
//
// FILE: readPowerSupply.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.0
// PURPOSE: demo
// DATE: 2020-02-10
//
// Released to the public domain
//

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;
// Assign address manually. The addresses below will beed to be changed
// to valid device addresses on your bus. Device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via
// sensors.getAddress(deviceAddress, index)
// DeviceAddress insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
// DeviceAddress outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

int devCount = 0;

/*
* The setup function. We only start the sensors here
*/
void setup(void)
{
Serial.begin(115200);
Serial.println("Arduino Temperature Control Library Demo - readPowerSupply");

sensors.begin();

devCount = sensors.getDeviceCount();
Serial.print("#devices: ");
Serial.println(devCount);

// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.readPowerSupply()) Serial.println("ON"); // no address means "scan all devices for parasite mode"
else Serial.println("OFF");

// Search for devices on the bus and assign based on an index.
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

// show the addresses we found on the bus
Serial.print("Device 0 Address: ");
printAddress(insideThermometer);
Serial.println();
Serial.print("Power = parasite: ");
Serial.println(sensors.readPowerSupply(insideThermometer));
Serial.println();
Serial.println();

Serial.print("Device 1 Address: ");
printAddress(outsideThermometer);
Serial.println();
Serial.print("Power = parasite: ");
Serial.println(sensors.readPowerSupply(outsideThermometer));
Serial.println();
Serial.println();
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 0x10) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}

// empty on purpose
void loop(void)
{
}

// END OF FILE

+ 54
- 0
MK3_Firmware/lib/DallasTemperature_Modified/keywords.txt 查看文件

@@ -0,0 +1,54 @@
#######################################
# Syntax Coloring Map For DallasTemperature
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################
DallasTemperature KEYWORD1
OneWire KEYWORD1
AlarmHandler KEYWORD1
DeviceAddress KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

setResolution KEYWORD2
getResolution KEYWORD2
getTempC KEYWORD2
toFahrenheit KEYWORD2
getTempF KEYWORD2
getTempCByIndex KEYWORD2
getTempFByIndex KEYWORD2
setWaitForConversion KEYWORD2
getWaitForConversion KEYWORD2
requestTemperatures KEYWORD2
requestTemperaturesByAddress KEYWORD2
requestTemperaturesByIndex KEYWORD2
isParasitePowerMode KEYWORD2
begin KEYWORD2
getDeviceCount KEYWORD2
getAddress KEYWORD2
validAddress KEYWORD2
isConnected KEYWORD2
readScratchPad KEYWORD2
writeScratchPad KEYWORD2
readPowerSupply KEYWORD2
setHighAlarmTemp KEYWORD2
setLowAlarmTemp KEYWORD2
getHighAlarmTemp KEYWORD2
getLowAlarmTemp KEYWORD2
resetAlarmSearch KEYWORD2
alarmSearch KEYWORD2
hasAlarm KEYWORD2
toCelsius KEYWORD2
processAlarmss KEYWORD2
setAlarmHandlers KEYWORD2
defaultAlarmHandler KEYWORD2
calculateTemperature KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################


+ 40
- 0
MK3_Firmware/lib/DallasTemperature_Modified/library.json 查看文件

@@ -0,0 +1,40 @@
{
"name": "DallasTemperature",
"keywords": "onewire, 1-wire, bus, sensor, temperature",
"description": "Arduino Library for Dallas Temperature ICs (DS18B20, DS18S20, DS1822, DS1820)",
"repository":
{
"type": "git",
"url": "https://github.com/milesburton/Arduino-Temperature-Control-Library.git"
},
"authors":
[
{
"name": "Miles Burton",
"email": "miles@mnetcs.com",
"url": "http://www.milesburton.com",
"maintainer": true
},
{
"name": "Tim Newsome",
"email": "nuisance@casualhacker.net"
},
{
"name": "Guil Barros",
"email": "gfbarros@bappos.com"
},
{
"name": "Rob Tillaart",
"email": "rob.tillaart@gmail.com"
}
],
"dependencies":
{
"name": "OneWire",
"authors": "Paul Stoffregen",
"frameworks": "arduino"
},
"version": "3.8.1",
"frameworks": "arduino",
"platforms": "*"
}

+ 10
- 0
MK3_Firmware/lib/DallasTemperature_Modified/library.properties 查看文件

@@ -0,0 +1,10 @@
name=DallasTemperature
version=3.8.1
author=Miles Burton <miles@mnetcs.com>, Tim Newsome <nuisance@casualhacker.net>, Guil Barros <gfbarros@bappos.com>, Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Miles Burton <miles@mnetcs.com>
sentence=Arduino Library for Dallas Temperature ICs
paragraph=Supports DS18B20, DS18S20, DS1822, DS1820
category=Sensors
url=https://github.com/milesburton/Arduino-Temperature-Control-Library
architectures=*
depends=OneWire

+ 46
- 0
MK3_Firmware/lib/README 查看文件

@@ -0,0 +1,46 @@

This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into executable file.

The source code of each library should be placed in a an own separate directory
("lib/your_library_name/[here are source files]").

For example, see a structure of the following two libraries `Foo` and `Bar`:

|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c

and a contents of `src/main.c`:
```
#include <Foo.h>
#include <Bar.h>

int main (void)
{
...
}

```

PlatformIO Library Dependency Finder will find automatically dependent
libraries scanning project source files.

More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html

+ 17
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/.gitattributes 查看文件

@@ -0,0 +1,17 @@
# Auto detect text files and perform LF normalization
* text=auto

# Custom for Visual Studio
*.cs diff=csharp

# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain

+ 47
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/.gitignore 查看文件

@@ -0,0 +1,47 @@
# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

# =========================
# Operating System Files
# =========================

# OSX
# =========================

.DS_Store
.AppleDouble
.LSOverride

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

+ 44
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/.library.json 查看文件

@@ -0,0 +1,44 @@
{
"name": "TFT_eSPI",
"repository": {
"url": "https://github.com/Bodmer/TFT_eSPI",
"type": "git"
},
"platforms": [
"espressif32",
"ststm32",
"espressif8266"
],
"frameworks": [
"arduino"
],
"version": "2.2.1",
"authors": [
{
"maintainer": true,
"name": "Bodmer",
"url": null,
"email": "bodmer@anola.net"
}
],
"keywords": [
"st7735",
"ili9486",
"esp8266",
"arduino",
"esp32",
"epaper",
"stm32",
"st7789",
"nodemcu",
"m5stack",
"ili9163",
"tft",
"s6d02a1",
"display",
"ili9341",
"rm68140"
],
"id": 1559,
"description": "A TFT and ePaper SPI graphics library with optimisation for ESP8266, ESP32 and STM32"
}

+ 95
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Button.cpp 查看文件

@@ -0,0 +1,95 @@
/***************************************************************************************
** Code for the GFX button UI element
** Grabbed from Adafruit_GFX library and enhanced to handle any label font
***************************************************************************************/
TFT_eSPI_Button::TFT_eSPI_Button(void) {
_gfx = 0;
_xd = 0;
_yd = 0;
_textdatum = MC_DATUM;
}

// Classic initButton() function: pass center & size
void TFT_eSPI_Button::initButton(
TFT_eSPI *gfx, int16_t x, int16_t y, uint16_t w, uint16_t h,
uint16_t outline, uint16_t fill, uint16_t textcolor,
char *label, uint8_t textsize)
{
// Tweak arguments and pass to the newer initButtonUL() function...
initButtonUL(gfx, x - (w / 2), y - (h / 2), w, h, outline, fill,
textcolor, label, textsize);
}

// Newer function instead accepts upper-left corner & size
void TFT_eSPI_Button::initButtonUL(
TFT_eSPI *gfx, int16_t x1, int16_t y1, uint16_t w, uint16_t h,
uint16_t outline, uint16_t fill, uint16_t textcolor,
char *label, uint8_t textsize)
{
_x1 = x1;
_y1 = y1;
_w = w;
_h = h;
_outlinecolor = outline;
_fillcolor = fill;
_textcolor = textcolor;
_textsize = textsize;
_gfx = gfx;
strncpy(_label, label, 9);
}

// Adjust text datum and x, y deltas
void TFT_eSPI_Button::setLabelDatum(int16_t x_delta, int16_t y_delta, uint8_t datum)
{
_xd = x_delta;
_yd = y_delta;
_textdatum = datum;
}

void TFT_eSPI_Button::drawButton(bool inverted, String long_name) {
uint16_t fill, outline, text;

if(!inverted) {
fill = _fillcolor;
outline = _outlinecolor;
text = _textcolor;
} else {
fill = _textcolor;
outline = _outlinecolor;
text = _fillcolor;
}

uint8_t r = min(_w, _h) / 4; // Corner radius
_gfx->fillRoundRect(_x1, _y1, _w, _h, r, fill);
_gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline);

_gfx->setTextColor(text, fill);
_gfx->setTextSize(_textsize);

uint8_t tempdatum = _gfx->getTextDatum();
_gfx->setTextDatum(_textdatum);
uint16_t tempPadding = _gfx->padX;
_gfx->setTextPadding(0);

if (long_name == "")
_gfx->drawString(_label, _x1 + (_w/2) + _xd, _y1 + (_h/2) - 4 + _yd);
else
_gfx->drawString(long_name, _x1 + (_w/2) + _xd, _y1 + (_h/2) - 4 + _yd);

_gfx->setTextDatum(tempdatum);
_gfx->setTextPadding(tempPadding);
}

bool TFT_eSPI_Button::contains(int16_t x, int16_t y) {
return ((x >= _x1) && (x < (_x1 + _w)) &&
(y >= _y1) && (y < (_y1 + _h)));
}

void TFT_eSPI_Button::press(bool p) {
laststate = currstate;
currstate = p;
}

bool TFT_eSPI_Button::isPressed() { return currstate; }
bool TFT_eSPI_Button::justPressed() { return (currstate && !laststate); }
bool TFT_eSPI_Button::justReleased() { return (!currstate && laststate); }

+ 44
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Button.h 查看文件

@@ -0,0 +1,44 @@
/***************************************************************************************
// The following button class has been ported over from the Adafruit_GFX library so
// should be compatible.
// A slightly different implementation in this TFT_eSPI library allows the button
// legends to be in any font, allow longer labels and to adjust text positioning
// within button
***************************************************************************************/

class TFT_eSPI_Button {

public:
TFT_eSPI_Button(void);
// "Classic" initButton() uses center & size
void initButton(TFT_eSPI *gfx, int16_t x, int16_t y,
uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
uint16_t textcolor, char *label, uint8_t textsize);

// New/alt initButton() uses upper-left corner & size
void initButtonUL(TFT_eSPI *gfx, int16_t x1, int16_t y1,
uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
uint16_t textcolor, char *label, uint8_t textsize);
// Adjust text datum and x, y deltas
void setLabelDatum(int16_t x_delta, int16_t y_delta, uint8_t datum = MC_DATUM);
void drawButton(bool inverted = false, String long_name = "");
bool contains(int16_t x, int16_t y);

void press(bool p);
bool isPressed();
bool justPressed();
bool justReleased();

private:
TFT_eSPI *_gfx;
int16_t _x1, _y1; // Coordinates of top-left corner of button
int16_t _xd, _yd; // Button text datum offsets (wrt center of button)
uint16_t _w, _h; // Width and height of button
uint8_t _textsize, _textdatum; // Text size multiplier and text datum for button
uint16_t _outlinecolor, _fillcolor, _textcolor;
char _label[10]; // Button text is 9 chars maximum unless long_name used

bool currstate, laststate; // Button states
};

+ 519
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Smooth_font.cpp 查看文件

@@ -0,0 +1,519 @@
// Coded by Bodmer 10/2/18, see license in root directory.
// This is part of the TFT_eSPI class and is associated with anti-aliased font functions

////////////////////////////////////////////////////////////////////////////////////////
// New anti-aliased (smoothed) font functions added below
////////////////////////////////////////////////////////////////////////////////////////

/***************************************************************************************
** Function name: loadFont
** Description: loads parameters from a font vlw array in memory
*************************************************************************************x*/
void TFT_eSPI::loadFont(const uint8_t array[])
{
if (array == nullptr) return;
fontPtr = (uint8_t*) array;
loadFont("", false);
}

#ifdef FONT_FS_AVAILABLE
/***************************************************************************************
** Function name: loadFont
** Description: loads parameters from a font vlw file
*************************************************************************************x*/
void TFT_eSPI::loadFont(String fontName, fs::FS &ffs)
{
fontFS = ffs;
loadFont(fontName, false);
}
#endif

/***************************************************************************************
** Function name: loadFont
** Description: loads parameters from a font vlw file
*************************************************************************************x*/
void TFT_eSPI::loadFont(String fontName, bool flash)
{
/*
The vlw font format does not appear to be documented anywhere, so some reverse
engineering has been applied!

Header of vlw file comprises 6 uint32_t parameters (24 bytes total):
1. The gCount (number of character glyphs)
2. A version number (0xB = 11 for the one I am using)
3. The font size (in points, not pixels)
4. Deprecated mboxY parameter (typically set to 0)
5. Ascent in pixels from baseline to top of "d"
6. Descent in pixels from baseline to bottom of "p"

Next are gCount sets of values for each glyph, each set comprises 7 int32t parameters (28 bytes):
1. Glyph Unicode stored as a 32 bit value
2. Height of bitmap bounding box
3. Width of bitmap bounding box
4. gxAdvance for cursor (setWidth in Processing)
5. dY = distance from cursor baseline to top of glyph bitmap (signed value +ve = up)
6. dX = distance from cursor to left side of glyph bitmap (signed value -ve = left)
7. padding value, typically 0

The bitmaps start next at 24 + (28 * gCount) bytes from the start of the file.
Each pixel is 1 byte, an 8 bit Alpha value which represents the transparency from
0xFF foreground colour, 0x00 background. The sketch uses a linear interpolation
between the foreground and background RGB component colours. e.g.
pixelRed = ((fgRed * alpha) + (bgRed * (255 - alpha))/255
To gain a performance advantage fixed point arithmetic is used with rounding and
division by 256 (shift right 8 bits is faster).

After the bitmaps is:
1 byte for font name string length (excludes null)
a zero terminated character string giving the font name
1 byte for Postscript name string length
a zero/one terminated character string giving the font name
last byte is 0 for non-anti-aliased and 1 for anti-aliased (smoothed)


Glyph bitmap example is:
// Cursor coordinate positions for this and next character are marked by 'C'
// C<------- gxAdvance ------->C gxAdvance is how far to move cursor for next glyph cursor position
// | |
// | | ascent is top of "d", descent is bottom of "p"
// +-- gdX --+ ascent
// | +-- gWidth--+ | gdX is offset to left edge of glyph bitmap
// | + x@.........@x + | gdX may be negative e.g. italic "y" tail extending to left of
// | | @@.........@@ | | cursor position, plot top left corner of bitmap at (cursorX + gdX)
// | | @@.........@@ gdY | gWidth and gHeight are glyph bitmap dimensions
// | | .@@@.....@@@@ | |
// | gHeight ....@@@@@..@@ + + <-- baseline
// | | ...........@@ |
// | | ...........@@ | gdY is the offset to the top edge of the bitmap
// | | .@@.......@@. descent plot top edge of bitmap at (cursorY + yAdvance - gdY)
// | + x..@@@@@@@..x | x marks the corner pixels of the bitmap
// | |
// +---------------------------+ yAdvance is y delta for the next line, font size or (ascent + descent)
// some fonts can overlay in y direction so may need a user adjust value

*/

if (fontLoaded) unloadFont();

#ifdef FONT_FS_AVAILABLE
if (fontName == "") fs_font = false;
else { fontPtr = nullptr; fs_font = true; }

if (fs_font) {
spiffs = flash; // true if font is in SPIFFS

if(spiffs) fontFS = SPIFFS;

// Avoid a crash on the ESP32 if the file does not exist
if (fontFS.exists("/" + fontName + ".vlw") == false) {
Serial.println("Font file " + fontName + " not found!");
return;
}

fontFile = fontFS.open( "/" + fontName + ".vlw", "r");

if(!fontFile) return;

fontFile.seek(0, fs::SeekSet);
}
#else
// Avoid unused varaible warning
fontName = fontName;
flash = flash;
#endif

gFont.gArray = (const uint8_t*)fontPtr;

gFont.gCount = (uint16_t)readInt32(); // glyph count in file
readInt32(); // vlw encoder version - discard
gFont.yAdvance = (uint16_t)readInt32(); // Font size in points, not pixels
readInt32(); // discard
gFont.ascent = (uint16_t)readInt32(); // top of "d"
gFont.descent = (uint16_t)readInt32(); // bottom of "p"

// These next gFont values might be updated when the Metrics are fetched
gFont.maxAscent = gFont.ascent; // Determined from metrics
gFont.maxDescent = gFont.descent; // Determined from metrics
gFont.yAdvance = gFont.ascent + gFont.descent;
gFont.spaceWidth = gFont.yAdvance / 4; // Guess at space width

fontLoaded = true;

// Fetch the metrics for each glyph
loadMetrics();
}


/***************************************************************************************
** Function name: loadMetrics
** Description: Get the metrics for each glyph and store in RAM
*************************************************************************************x*/
//#define SHOW_ASCENT_DESCENT
void TFT_eSPI::loadMetrics(void)
{
uint32_t headerPtr = 24;
uint32_t bitmapPtr = headerPtr + gFont.gCount * 28;

#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT)
if ( psramFound() )
{
gUnicode = (uint16_t*)ps_malloc( gFont.gCount * 2); // Unicode 16 bit Basic Multilingual Plane (0-FFFF)
gHeight = (uint8_t*)ps_malloc( gFont.gCount ); // Height of glyph
gWidth = (uint8_t*)ps_malloc( gFont.gCount ); // Width of glyph
gxAdvance = (uint8_t*)ps_malloc( gFont.gCount ); // xAdvance - to move x cursor
gdY = (int16_t*)ps_malloc( gFont.gCount * 2); // offset from bitmap top edge from lowest point in any character
gdX = (int8_t*)ps_malloc( gFont.gCount ); // offset for bitmap left edge relative to cursor X
gBitmap = (uint32_t*)ps_malloc( gFont.gCount * 4); // seek pointer to glyph bitmap in the file
}
else
#endif
{
gUnicode = (uint16_t*)malloc( gFont.gCount * 2); // Unicode 16 bit Basic Multilingual Plane (0-FFFF)
gHeight = (uint8_t*)malloc( gFont.gCount ); // Height of glyph
gWidth = (uint8_t*)malloc( gFont.gCount ); // Width of glyph
gxAdvance = (uint8_t*)malloc( gFont.gCount ); // xAdvance - to move x cursor
gdY = (int16_t*)malloc( gFont.gCount * 2); // offset from bitmap top edge from lowest point in any character
gdX = (int8_t*)malloc( gFont.gCount ); // offset for bitmap left edge relative to cursor X
gBitmap = (uint32_t*)malloc( gFont.gCount * 4); // seek pointer to glyph bitmap in the file
}

#ifdef SHOW_ASCENT_DESCENT
Serial.print("ascent = "); Serial.println(gFont.ascent);
Serial.print("descent = "); Serial.println(gFont.descent);
#endif

#ifdef FONT_FS_AVAILABLE
if (fs_font) fontFile.seek(headerPtr, fs::SeekSet);
#endif

uint16_t gNum = 0;

while (gNum < gFont.gCount)
{
gUnicode[gNum] = (uint16_t)readInt32(); // Unicode code point value
gHeight[gNum] = (uint8_t)readInt32(); // Height of glyph
gWidth[gNum] = (uint8_t)readInt32(); // Width of glyph
gxAdvance[gNum] = (uint8_t)readInt32(); // xAdvance - to move x cursor
gdY[gNum] = (int16_t)readInt32(); // y delta from baseline
gdX[gNum] = (int8_t)readInt32(); // x delta from cursor
readInt32(); // ignored

//Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gHeight = "); Serial.println(gHeight[gNum]);
//Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gWidth = "); Serial.println(gWidth[gNum]);
//Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gxAdvance = "); Serial.println(gxAdvance[gNum]);
//Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gdY = "); Serial.println(gdY[gNum]);

// Different glyph sets have different ascent values not always based on "d", so we could get
// the maximum glyph ascent by checking all characters. BUT this method can generate bad values
// for non-existant glyphs, so we will reply on processing for the value and disable this code for now...
/*
if (gdY[gNum] > gFont.maxAscent)
{
// Try to avoid UTF coding values and characters that tend to give duff values
if (((gUnicode[gNum] > 0x20) && (gUnicode[gNum] < 0x7F)) || (gUnicode[gNum] > 0xA0))
{
gFont.maxAscent = gdY[gNum];
#ifdef SHOW_ASCENT_DESCENT
Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", maxAscent = "); Serial.println(gFont.maxAscent);
#endif
}
}
*/

// Different glyph sets have different descent values not always based on "p", so get maximum glyph descent
if (((int16_t)gHeight[gNum] - (int16_t)gdY[gNum]) > gFont.maxDescent)
{
// Avoid UTF coding values and characters that tend to give duff values
if (((gUnicode[gNum] > 0x20) && (gUnicode[gNum] < 0xA0) && (gUnicode[gNum] != 0x7F)) || (gUnicode[gNum] > 0xFF))
{
gFont.maxDescent = gHeight[gNum] - gdY[gNum];
#ifdef SHOW_ASCENT_DESCENT
Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", maxDescent = "); Serial.println(gHeight[gNum] - gdY[gNum]);
#endif
}
}

gBitmap[gNum] = bitmapPtr;

bitmapPtr += gWidth[gNum] * gHeight[gNum];

gNum++;
yield();
}

gFont.yAdvance = gFont.maxAscent + gFont.maxDescent;

gFont.spaceWidth = (gFont.ascent + gFont.descent) * 2/7; // Guess at space width
}


/***************************************************************************************
** Function name: deleteMetrics
** Description: Delete the old glyph metrics and free up the memory
*************************************************************************************x*/
void TFT_eSPI::unloadFont( void )
{
if (gUnicode)
{
free(gUnicode);
gUnicode = NULL;
}

if (gHeight)
{
free(gHeight);
gHeight = NULL;
}

if (gWidth)
{
free(gWidth);
gWidth = NULL;
}

if (gxAdvance)
{
free(gxAdvance);
gxAdvance = NULL;
}

if (gdY)
{
free(gdY);
gdY = NULL;
}

if (gdX)
{
free(gdX);
gdX = NULL;
}

if (gBitmap)
{
free(gBitmap);
gBitmap = NULL;
}

gFont.gArray = nullptr;

#ifdef FONT_FS_AVAILABLE
if (fs_font && fontFile) fontFile.close();
#endif

fontLoaded = false;
}


/***************************************************************************************
** Function name: readInt32
** Description: Get a 32 bit integer from the font file
*************************************************************************************x*/
uint32_t TFT_eSPI::readInt32(void)
{
uint32_t val = 0;

#ifdef FONT_FS_AVAILABLE
if (fs_font) {
val |= fontFile.read() << 24;
val |= fontFile.read() << 16;
val |= fontFile.read() << 8;
val |= fontFile.read();
}
else
#endif
{
val |= pgm_read_byte(fontPtr++) << 24;
val |= pgm_read_byte(fontPtr++) << 16;
val |= pgm_read_byte(fontPtr++) << 8;
val |= pgm_read_byte(fontPtr++);
}

return val;
}


/***************************************************************************************
** Function name: getUnicodeIndex
** Description: Get the font file index of a Unicode character
*************************************************************************************x*/
bool TFT_eSPI::getUnicodeIndex(uint16_t unicode, uint16_t *index)
{
for (uint16_t i = 0; i < gFont.gCount; i++)
{
if (gUnicode[i] == unicode)
{
*index = i;
return true;
}
}
return false;
}


/***************************************************************************************
** Function name: drawGlyph
** Description: Write a character to the TFT cursor position
*************************************************************************************x*/
// Expects file to be open
void TFT_eSPI::drawGlyph(uint16_t code)
{
if (code < 0x21)
{
if (code == 0x20) {
cursor_x += gFont.spaceWidth;
return;
}

if (code == '\n') {
cursor_x = 0;
cursor_y += gFont.yAdvance;
if (cursor_y >= _height) cursor_y = 0;
return;
}
}

uint16_t gNum = 0;
bool found = getUnicodeIndex(code, &gNum);
uint16_t fg = textcolor;
uint16_t bg = textbgcolor;

if (found)
{

if (textwrapX && (cursor_x + gWidth[gNum] + gdX[gNum] > _width))
{
cursor_y += gFont.yAdvance;
cursor_x = 0;
}
if (textwrapY && ((cursor_y + gFont.yAdvance) >= _height)) cursor_y = 0;
if (cursor_x == 0) cursor_x -= gdX[gNum];

uint8_t* pbuffer = nullptr;
const uint8_t* gPtr = (const uint8_t*) gFont.gArray;

#ifdef FONT_FS_AVAILABLE
if (fs_font)
{
fontFile.seek(gBitmap[gNum], fs::SeekSet); // This is taking >30ms for a significant position shift
pbuffer = (uint8_t*)malloc(gWidth[gNum]);
}
#endif

int16_t xs = 0;
uint32_t dl = 0;
uint8_t pixel;

int16_t cy = cursor_y + gFont.maxAscent - gdY[gNum];
int16_t cx = cursor_x + gdX[gNum];

startWrite(); // Avoid slow ESP32 transaction overhead for every pixel

for (int y = 0; y < gHeight[gNum]; y++)
{
#ifdef FONT_FS_AVAILABLE
if (fs_font) {
if (spiffs)
{
fontFile.read(pbuffer, gWidth[gNum]);
//Serial.println("SPIFFS");
}
else
{
endWrite(); // Release SPI for SD card transaction
fontFile.read(pbuffer, gWidth[gNum]);
startWrite(); // Re-start SPI for TFT transaction
//Serial.println("Not SPIFFS");
}
}
#endif
for (int x = 0; x < gWidth[gNum]; x++)
{
#ifdef FONT_FS_AVAILABLE
if (fs_font) pixel = pbuffer[x];
else
#endif
pixel = pgm_read_byte(gPtr + gBitmap[gNum] + x + gWidth[gNum] * y);

if (pixel)
{
if (pixel != 0xFF)
{
if (dl) {
if (dl==1) drawPixel(xs, y + cy, fg);
else drawFastHLine( xs, y + cy, dl, fg);
dl = 0;
}
if (getColor) bg = getColor(x + cx, y + cy);
drawPixel(x + cx, y + cy, alphaBlend(pixel, fg, bg));
}
else
{
if (dl==0) xs = x + cx;
dl++;
}
}
else
{
if (dl) { drawFastHLine( xs, y + cy, dl, fg); dl = 0; }
}
}
if (dl) { drawFastHLine( xs, y + cy, dl, fg); dl = 0; }
}

if (pbuffer) free(pbuffer);
cursor_x += gxAdvance[gNum];
endWrite();
}
else
{
// Not a Unicode in font so draw a rectangle and move on cursor
drawRect(cursor_x, cursor_y + gFont.maxAscent - gFont.ascent, gFont.spaceWidth, gFont.ascent, fg);
cursor_x += gFont.spaceWidth + 1;
}
}

/***************************************************************************************
** Function name: showFont
** Description: Page through all characters in font, td ms between screens
*************************************************************************************x*/
void TFT_eSPI::showFont(uint32_t td)
{
if(!fontLoaded) return;

int16_t cursorX = width(); // Force start of new page to initialise cursor
int16_t cursorY = height();// for the first character
uint32_t timeDelay = 0; // No delay before first page

fillScreen(textbgcolor);
for (uint16_t i = 0; i < gFont.gCount; i++)
{
// Check if this will need a new screen
if (cursorX + gdX[i] + gWidth[i] >= width()) {
cursorX = -gdX[i];

cursorY += gFont.yAdvance;
if (cursorY + gFont.maxAscent + gFont.descent >= height()) {
cursorX = -gdX[i];
cursorY = 0;
delay(timeDelay);
timeDelay = td;
fillScreen(textbgcolor);
}
}

setCursor(cursorX, cursorY);
drawGlyph(gUnicode[i]);
cursorX += gxAdvance[i];
//cursorX += printToSprite( cursorX, cursorY, i );
yield();
}

delay(timeDelay);
fillScreen(textbgcolor);
//fontFile.close();

}

+ 61
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Smooth_font.h 查看文件

@@ -0,0 +1,61 @@
// Coded by Bodmer 10/2/18, see license in root directory.
// This is part of the TFT_eSPI class and is associated with anti-aliased font functions

public:

// These are for the new antialiased fonts
void loadFont(const uint8_t array[]);
#ifdef FONT_FS_AVAILABLE
void loadFont(String fontName, fs::FS &ffs);
#endif
void loadFont(String fontName, bool flash = true);
void unloadFont( void );
bool getUnicodeIndex(uint16_t unicode, uint16_t *index);

virtual void drawGlyph(uint16_t code);

void showFont(uint32_t td);

// This is for the whole font
typedef struct
{
const uint8_t* gArray; //array start pointer
uint16_t gCount; // Total number of characters
uint16_t yAdvance; // Line advance
uint16_t spaceWidth; // Width of a space character
int16_t ascent; // Height of top of 'd' above baseline, other characters may be taller
int16_t descent; // Offset to bottom of 'p', other characters may have a larger descent
uint16_t maxAscent; // Maximum ascent found in font
uint16_t maxDescent; // Maximum descent found in font
} fontMetrics;

fontMetrics gFont = { nullptr, 0, 0, 0, 0, 0, 0, 0 };

// These are for the metrics for each individual glyph (so we don't need to seek this in file and waste time)
uint16_t* gUnicode = NULL; //UTF-16 code, the codes are searched so do not need to be sequential
uint8_t* gHeight = NULL; //cheight
uint8_t* gWidth = NULL; //cwidth
uint8_t* gxAdvance = NULL; //setWidth
int16_t* gdY = NULL; //topExtent
int8_t* gdX = NULL; //leftExtent
uint32_t* gBitmap = NULL; //file pointer to greyscale bitmap

bool fontLoaded = false; // Flags when a anti-aliased font is loaded

#ifdef FONT_FS_AVAILABLE
fs::File fontFile;
fs::FS &fontFS = SPIFFS;
bool spiffs = true;
bool fs_font = false; // For ESP32/8266 use smooth font file or FLASH (PROGMEM) array

#else
bool fontFile = true;
#endif

private:

void loadMetrics(void);
uint32_t readInt32(void);

uint8_t* fontPtr = nullptr;


+ 2421
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Sprite.cpp
文件差異過大導致無法顯示
查看文件


+ 185
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Sprite.h 查看文件

@@ -0,0 +1,185 @@
/***************************************************************************************
// The following class creates Sprites in RAM, graphics can then be drawn in the Sprite
// and rendered quickly onto the TFT screen. The class inherits the graphics functions
// from the TFT_eSPI class. Some functions are overridden by this class so that the
// graphics are written to the Sprite rather than the TFT.
***************************************************************************************/

class TFT_eSprite : public TFT_eSPI {

public:

TFT_eSprite(TFT_eSPI *tft);

// Create a sprite of width x height pixels, return a pointer to the RAM area
// Sketch can cast returned value to (uint16_t*) for 16 bit depth if needed
// RAM required is:
// - 1 bit per pixel for 1 bit colour depth
// - 1 byte per pixel for 8 bit colour
// - 2 bytes per pixel for 16 bit color depth
~TFT_eSprite(void);

void* createSprite(int16_t width, int16_t height, uint8_t frames = 1);

// Delete the sprite to free up the RAM
void deleteSprite(void);

// Select the frame buffer for graphics write (for 2 colour ePaper and DMA toggle buffer)
// Returns a pointer to the Sprite frame buffer
void* frameBuffer(int8_t f);
// Set or get the colour depth to 4, 8 or 16 bits. Can be used to change depth an existing
// sprite, but clears it to black, returns a new pointer if sprite is re-created.
void* setColorDepth(int8_t b);
int8_t getColorDepth(void);

// Set the palette for a 4 bit depth sprite. Only the first 16 colours in the map are used.
void createPalette(uint16_t *palette, int colors = 16); // Palette in RAM
void createPalette(const uint16_t *palette, int colors = 16); // Palette in FLASH

// Set a single palette index to the given color
void setPaletteColor(uint8_t index, uint16_t color);

// Get the color at the given palette index
uint16_t getPaletteColor(uint8_t index);

// Set foreground and background colours for 1 bit per pixel Sprite
void setBitmapColor(uint16_t fg, uint16_t bg);

void drawPixel(int32_t x, int32_t y, uint32_t color);

void drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t font),

// Fill Sprite with a colour
fillSprite(uint32_t color),

// Define a window to push 16 bit colour pixels into in a raster order
// Colours are converted to the set Sprite colour bit depth
setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1),
// Push a color (aka singe pixel) to the screen
pushColor(uint32_t color),
// Push len colors (pixels) to the screen
pushColor(uint32_t color, uint16_t len),
// Push a pixel preformatted as a 8 or 16 bit colour (avoids conversion overhead)
writeColor(uint16_t color),

// Set the scroll zone, top left corner at x,y with defined width and height
// The colour (optional, black is default) is used to fill the gap after the scroll
setScrollRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t color = TFT_BLACK),
// Scroll the defined zone dx,dy pixels. Negative values left,up, positive right,down
// dy is optional (default is then no up/down scroll).
// The sprite coordinate frame does not move because pixels are moved
scroll(int16_t dx, int16_t dy = 0),

// Draw lines
drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color),
drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color),
drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color),

// Fill a rectangular area with a color (aka draw a filled rectangle)
fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color);

// Set the sprite text cursor position for print class (does not change the TFT screen cursor)
//setCursor(int16_t x, int16_t y); // Not needed, so uses TFT class function

// Set the coordinate rotation of the Sprite (for 1bpp Sprites only)
// Note: this uses coordinate rotation and is primarily for ePaper which does not support
// CGRAM rotation (like TFT drivers do) within the displays internal hardware
void setRotation(uint8_t rotation);
uint8_t getRotation(void);

// Push a rotated copy of Sprite to TFT with optional transparent colour
bool pushRotated(int16_t angle, int32_t transp = -1); // Using fixed point maths
// Push a rotated copy of Sprite to another different Sprite with optional transparent colour
bool pushRotated(TFT_eSprite *spr, int16_t angle, int32_t transp = -1); // Using fixed point maths

// Set and get the pivot point for this Sprite
void setPivot(int16_t x, int16_t y);
int16_t getPivotX(void),
getPivotY(void);

// Get the TFT bounding box for a rotated copy of this Sprite
bool getRotatedBounds(int16_t angle, int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y);
// Get the destination Sprite bounding box for a rotated copy of this Sprite
bool getRotatedBounds(TFT_eSprite *spr, int16_t angle, int16_t *min_x, int16_t *min_y,
int16_t *max_x, int16_t *max_y);
// Bounding box support function
void getRotatedBounds(int16_t angle, int16_t w, int16_t h, int16_t xp, int16_t yp,
int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y);

// Read the colour of a pixel at x,y and return value in 565 format
uint16_t readPixel(int32_t x0, int32_t y0);

// return the numerical value of the pixel at x,y (used when scrolling)
// 16bpp = colour, 8bpp = byte, 4bpp = colour index, 1bpp = 1 or 0
uint16_t readPixelValue(int32_t x, int32_t y);

// Write an image (colour bitmap) to the sprite. Not implemented for _bpp == 4.
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data);
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, const uint16_t *data);

// Swap the byte order for pushImage() - corrects different image endianness
void setSwapBytes(bool swap);
bool getSwapBytes(void);

// Push the sprite to the TFT screen, this fn calls pushImage() in the TFT class.
// Optionally a "transparent" colour can be defined, pixels of that colour will not be rendered
void pushSprite(int32_t x, int32_t y);
void pushSprite(int32_t x, int32_t y, uint16_t transparent);

int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font),
drawChar(uint16_t uniCode, int32_t x, int32_t y);

// Return the width and height of the sprite
int16_t width(void),
height(void);

// Used by print class to print text to cursor position
size_t write(uint8_t);

// Functions associated with anti-aliased fonts
void drawGlyph(uint16_t code);
void printToSprite(String string);
void printToSprite(char *cbuffer, uint16_t len);
int16_t printToSprite(int16_t x, int16_t y, uint16_t index);

private:

TFT_eSPI *_tft;

// Reserve memory for the Sprite and return a pointer
void* callocSprite(int16_t width, int16_t height, uint8_t frames = 1);

protected:

uint8_t _bpp; // bits per pixel (1, 8 or 16)
uint16_t *_img; // pointer to 16 bit sprite
uint8_t *_img8; // pointer to 8 bit sprite
uint8_t *_img4; // pointer to 4 bit sprite (uses color map)
uint8_t *_img8_1; // pointer to frame 1
uint8_t *_img8_2; // pointer to frame 2

uint16_t *_colorMap; // color map: 16 entries, used with 4 bit color map.

int16_t _xpivot; // x pivot point coordinate
int16_t _ypivot; // y pivot point coordinate
int32_t _sinra;
int32_t _cosra;

bool _created; // A Sprite has been created and memory reserved
bool _gFont = false;

// int32_t _icursor_x, _icursor_y;
uint8_t _rotation = 0;
int32_t _xs, _ys, _xe, _ye, _xptr, _yptr; // for setWindow
int32_t _sx, _sy; // x,y for scroll zone
uint32_t _sw, _sh; // w,h for scroll zone
uint32_t _scolor; // gap fill colour for scroll zone

bool _iswapBytes; // Swap the byte order for Sprite pushImage()

int32_t _iwidth, _iheight; // Sprite memory image bit width and height (swapped during rotations)
int32_t _dwidth, _dheight; // Real display width and height (for <8bpp Sprites)
int32_t _bitwidth; // Sprite image bit width for drawPixel (for <8bpp Sprites, not swapped)

};

+ 343
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Touch.cpp 查看文件

@@ -0,0 +1,343 @@
// The following touch screen support code by maxpautsch was merged 1/10/17
// https://github.com/maxpautsch

// Define TOUCH_CS is the user setup file to enable this code

// A demo is provided in examples Generic folder

// Additions by Bodmer to double sample, use Z value to improve detection reliability
// and to correct rotation handling

// See license in root directory.

/***************************************************************************************
** Function name: begin_touch_read_write - was spi_begin_touch
** Description: Start transaction and select touch controller
***************************************************************************************/
// The touch controller has a low SPI clock rate
inline void TFT_eSPI::begin_touch_read_write(void){
DMA_BUSY_CHECK;
CS_H; // Just in case it has been left low
#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS)
if (locked) {locked = false; spi.beginTransaction(SPISettings(SPI_TOUCH_FREQUENCY, MSBFIRST, SPI_MODE0));}
#else
spi.setFrequency(SPI_TOUCH_FREQUENCY);
#endif
SET_BUS_READ_MODE;
T_CS_L;
}

/***************************************************************************************
** Function name: end_touch_read_write - was spi_end_touch
** Description: End transaction and deselect touch controller
***************************************************************************************/
inline void TFT_eSPI::end_touch_read_write(void){
T_CS_H;
#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS)
if(!inTransaction) {if (!locked) {locked = true; spi.endTransaction();}}
#else
spi.setFrequency(SPI_FREQUENCY);
#endif
SET_BUS_WRITE_MODE;
}

/***************************************************************************************
** Function name: Legacy - deprecated
** Description: Start/end transaction
***************************************************************************************/
void TFT_eSPI::spi_begin_touch() {begin_touch_read_write();}
void TFT_eSPI::spi_end_touch() { end_touch_read_write();}

/***************************************************************************************
** Function name: getTouchRaw
** Description: read raw touch position. Always returns true.
***************************************************************************************/
uint8_t TFT_eSPI::getTouchRaw(uint16_t *x, uint16_t *y){
uint16_t tmp;

begin_touch_read_write();
// Start YP sample request for x position, read 4 times and keep last sample
spi.transfer(0xd0); // Start new YP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0xd0); // Read last 8 bits and start new YP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0xd0); // Read last 8 bits and start new YP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0xd0); // Read last 8 bits and start new YP conversion

tmp = spi.transfer(0); // Read first 8 bits
tmp = tmp <<5;
tmp |= 0x1f & (spi.transfer(0x90)>>3); // Read last 8 bits and start new XP conversion

*x = tmp;

// Start XP sample request for y position, read 4 times and keep last sample
spi.transfer(0); // Read first 8 bits
spi.transfer(0x90); // Read last 8 bits and start new XP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0x90); // Read last 8 bits and start new XP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0x90); // Read last 8 bits and start new XP conversion

tmp = spi.transfer(0); // Read first 8 bits
tmp = tmp <<5;
tmp |= 0x1f & (spi.transfer(0)>>3); // Read last 8 bits

*y = tmp;

end_touch_read_write();

return true;
}

/***************************************************************************************
** Function name: getTouchRawZ
** Description: read raw pressure on touchpad and return Z value.
***************************************************************************************/
uint16_t TFT_eSPI::getTouchRawZ(void){

begin_touch_read_write();

// Z sample request
int16_t tz = 0xFFF;
spi.transfer(0xb0); // Start new Z1 conversion
tz += spi.transfer16(0xc0) >> 3; // Read Z1 and start Z2 conversion
tz -= spi.transfer16(0x00) >> 3; // Read Z2

end_touch_read_write();

return (uint16_t)tz;
}

/***************************************************************************************
** Function name: validTouch
** Description: read validated position. Return false if not pressed.
***************************************************************************************/
#define _RAWERR 20 // Deadband error allowed in successive position samples
uint8_t TFT_eSPI::validTouch(uint16_t *x, uint16_t *y, uint16_t threshold){
uint16_t x_tmp, y_tmp, x_tmp2, y_tmp2;

// Wait until pressure stops increasing to debounce pressure
uint16_t z1 = 1;
uint16_t z2 = 0;
while (z1 > z2)
{
z2 = z1;
z1 = getTouchRawZ();
delay(1);
}

// Serial.print("Z = ");Serial.println(z1);

if (z1 <= threshold) return false;
getTouchRaw(&x_tmp,&y_tmp);

// Serial.print("Sample 1 x,y = "); Serial.print(x_tmp);Serial.print(",");Serial.print(y_tmp);
// Serial.print(", Z = ");Serial.println(z1);

delay(1); // Small delay to the next sample
if (getTouchRawZ() <= threshold) return false;

delay(2); // Small delay to the next sample
getTouchRaw(&x_tmp2,&y_tmp2);
// Serial.print("Sample 2 x,y = "); Serial.print(x_tmp2);Serial.print(",");Serial.println(y_tmp2);
// Serial.print("Sample difference = ");Serial.print(abs(x_tmp - x_tmp2));Serial.print(",");Serial.println(abs(y_tmp - y_tmp2));

if (abs(x_tmp - x_tmp2) > _RAWERR) return false;
if (abs(y_tmp - y_tmp2) > _RAWERR) return false;
*x = x_tmp;
*y = y_tmp;
return true;
}
/***************************************************************************************
** Function name: getTouch
** Description: read callibrated position. Return false if not pressed.
***************************************************************************************/
#define Z_THRESHOLD 350 // Touch pressure threshold for validating touches
uint8_t TFT_eSPI::getTouch(uint16_t *x, uint16_t *y, uint16_t threshold){
uint16_t x_tmp, y_tmp;
if (threshold<20) threshold = 20;
if (_pressTime > millis()) threshold=20;

uint8_t n = 5;
uint8_t valid = 0;
while (n--)
{
if (validTouch(&x_tmp, &y_tmp, threshold)) valid++;;
}

if (valid<1) { _pressTime = 0; return false; }
_pressTime = millis() + 50;

convertRawXY(&x_tmp, &y_tmp);

if (x_tmp >= _width || y_tmp >= _height) return false;

_pressX = x_tmp;
_pressY = y_tmp;
*x = _pressX;
*y = _pressY;
return valid;
}

/***************************************************************************************
** Function name: convertRawXY
** Description: convert raw touch x,y values to screen coordinates
***************************************************************************************/
void TFT_eSPI::convertRawXY(uint16_t *x, uint16_t *y)
{
uint16_t x_tmp = *x, y_tmp = *y, xx, yy;

if(!touchCalibration_rotate){
xx=(x_tmp-touchCalibration_x0)*_width/touchCalibration_x1;
yy=(y_tmp-touchCalibration_y0)*_height/touchCalibration_y1;
if(touchCalibration_invert_x)
xx = _width - xx;
if(touchCalibration_invert_y)
yy = _height - yy;
} else {
xx=(y_tmp-touchCalibration_x0)*_width/touchCalibration_x1;
yy=(x_tmp-touchCalibration_y0)*_height/touchCalibration_y1;
if(touchCalibration_invert_x)
xx = _width - xx;
if(touchCalibration_invert_y)
yy = _height - yy;
}
*x = xx;
*y = yy;
}

/***************************************************************************************
** Function name: calibrateTouch
** Description: generates calibration parameters for touchscreen.
***************************************************************************************/
void TFT_eSPI::calibrateTouch(uint16_t *parameters, uint32_t color_fg, uint32_t color_bg, uint8_t size){
int16_t values[] = {0,0,0,0,0,0,0,0};
uint16_t x_tmp, y_tmp;



for(uint8_t i = 0; i<4; i++){
fillRect(0, 0, size+1, size+1, color_bg);
fillRect(0, _height-size-1, size+1, size+1, color_bg);
fillRect(_width-size-1, 0, size+1, size+1, color_bg);
fillRect(_width-size-1, _height-size-1, size+1, size+1, color_bg);

if (i == 5) break; // used to clear the arrows
switch (i) {
case 0: // up left
drawLine(0, 0, 0, size, color_fg);
drawLine(0, 0, size, 0, color_fg);
drawLine(0, 0, size , size, color_fg);
break;
case 1: // bot left
drawLine(0, _height-size-1, 0, _height-1, color_fg);
drawLine(0, _height-1, size, _height-1, color_fg);
drawLine(size, _height-size-1, 0, _height-1 , color_fg);
break;
case 2: // up right
drawLine(_width-size-1, 0, _width-1, 0, color_fg);
drawLine(_width-size-1, size, _width-1, 0, color_fg);
drawLine(_width-1, size, _width-1, 0, color_fg);
break;
case 3: // bot right
drawLine(_width-size-1, _height-size-1, _width-1, _height-1, color_fg);
drawLine(_width-1, _height-1-size, _width-1, _height-1, color_fg);
drawLine(_width-1-size, _height-1, _width-1, _height-1, color_fg);
break;
}

// user has to get the chance to release
if(i>0) delay(1000);

for(uint8_t j= 0; j<8; j++){
// Use a lower detect threshold as corners tend to be less sensitive
while(!validTouch(&x_tmp, &y_tmp, Z_THRESHOLD/2));
values[i*2 ] += x_tmp;
values[i*2+1] += y_tmp;
}
values[i*2 ] /= 8;
values[i*2+1] /= 8;
}


// from case 0 to case 1, the y value changed.
// If the measured delta of the touch x axis is bigger than the delta of the y axis, the touch and TFT axes are switched.
touchCalibration_rotate = false;
if(abs(values[0]-values[2]) > abs(values[1]-values[3])){
touchCalibration_rotate = true;
touchCalibration_x0 = (values[1] + values[3])/2; // calc min x
touchCalibration_x1 = (values[5] + values[7])/2; // calc max x
touchCalibration_y0 = (values[0] + values[4])/2; // calc min y
touchCalibration_y1 = (values[2] + values[6])/2; // calc max y
} else {
touchCalibration_x0 = (values[0] + values[2])/2; // calc min x
touchCalibration_x1 = (values[4] + values[6])/2; // calc max x
touchCalibration_y0 = (values[1] + values[5])/2; // calc min y
touchCalibration_y1 = (values[3] + values[7])/2; // calc max y
}

// in addition, the touch screen axis could be in the opposite direction of the TFT axis
touchCalibration_invert_x = false;
if(touchCalibration_x0 > touchCalibration_x1){
values[0]=touchCalibration_x0;
touchCalibration_x0 = touchCalibration_x1;
touchCalibration_x1 = values[0];
touchCalibration_invert_x = true;
}
touchCalibration_invert_y = false;
if(touchCalibration_y0 > touchCalibration_y1){
values[0]=touchCalibration_y0;
touchCalibration_y0 = touchCalibration_y1;
touchCalibration_y1 = values[0];
touchCalibration_invert_y = true;
}

// pre calculate
touchCalibration_x1 -= touchCalibration_x0;
touchCalibration_y1 -= touchCalibration_y0;

if(touchCalibration_x0 == 0) touchCalibration_x0 = 1;
if(touchCalibration_x1 == 0) touchCalibration_x1 = 1;
if(touchCalibration_y0 == 0) touchCalibration_y0 = 1;
if(touchCalibration_y1 == 0) touchCalibration_y1 = 1;

// export parameters, if pointer valid
if(parameters != NULL){
parameters[0] = touchCalibration_x0;
parameters[1] = touchCalibration_x1;
parameters[2] = touchCalibration_y0;
parameters[3] = touchCalibration_y1;
parameters[4] = touchCalibration_rotate | (touchCalibration_invert_x <<1) | (touchCalibration_invert_y <<2);
}
}


/***************************************************************************************
** Function name: setTouch
** Description: imports calibration parameters for touchscreen.
***************************************************************************************/
void TFT_eSPI::setTouch(uint16_t *parameters){
touchCalibration_x0 = parameters[0];
touchCalibration_x1 = parameters[1];
touchCalibration_y0 = parameters[2];
touchCalibration_y1 = parameters[3];

if(touchCalibration_x0 == 0) touchCalibration_x0 = 1;
if(touchCalibration_x1 == 0) touchCalibration_x1 = 1;
if(touchCalibration_y0 == 0) touchCalibration_y0 = 1;
if(touchCalibration_y1 == 0) touchCalibration_y1 = 1;

touchCalibration_rotate = parameters[4] & 0x01;
touchCalibration_invert_x = parameters[4] & 0x02;
touchCalibration_invert_y = parameters[4] & 0x04;
}

+ 37
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Extensions/Touch.h 查看文件

@@ -0,0 +1,37 @@
// Coded by Bodmer 10/2/18, see license in root directory.
// This is part of the TFT_eSPI class and is associated with the Touch Screen handlers

public:
// Get raw x,y ADC values from touch controller
uint8_t getTouchRaw(uint16_t *x, uint16_t *y);
// Get raw z (i.e. pressure) ADC value from touch controller
uint16_t getTouchRawZ(void);
// Convert raw x,y values to calibrated and correctly rotated screen coordinates
void convertRawXY(uint16_t *x, uint16_t *y);
// Get the screen touch coordinates, returns true if screen has been touched
// if the touch cordinates are off screen then x and y are not updated
uint8_t getTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600);

// Run screen calibration and test, report calibration values to the serial port
void calibrateTouch(uint16_t *data, uint32_t color_fg, uint32_t color_bg, uint8_t size);
// Set the screen calibration values
void setTouch(uint16_t *data);

private:
// Legacy support only - deprecated TODO: delete
void spi_begin_touch();
void spi_end_touch();

// Handlers for the touch controller bus settings
inline void begin_touch_read_write() __attribute__((always_inline));
inline void end_touch_read_write() __attribute__((always_inline));

// Private function to validate a touch, allow settle time and reduce spurious coordinates
uint8_t validTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600);

// Initialise with example calibration values so processor does not crash if setTouch() not called in setup()
uint16_t touchCalibration_x0 = 300, touchCalibration_x1 = 3600, touchCalibration_y0 = 300, touchCalibration_y1 = 3600;
uint8_t touchCalibration_rotate = 1, touchCalibration_invert_x = 2, touchCalibration_invert_y = 0;

uint32_t _pressTime; // Press and hold time-out
uint16_t _pressX, _pressY; // For future use (last sampled calibrated coordinates)

+ 199
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Orbitron_Light_24.h 查看文件

@@ -0,0 +1,199 @@
// Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const uint8_t Orbitron_Light_24Bitmaps[] PROGMEM = {

// Bitmap Data:
0x00, // ' '
0xFF,0xFF,0xFF,0x03,0xC0, // '!'
0xCF,0x3C,0xC0, // '"'
0x01,0x81,0x80,0xC0,0xC0,0x30,0x30,0x0C,0x0C,0x7F,0xFF,0xDF,0xFF,0xF0,0x60,0x60,0x30,0x30,0x0C,0x0C,0x03,0x03,0x01,0x81,0x83,0xFF,0xFE,0xFF,0xFF,0x8C,0x04,0x03,0x03,0x00,0xC0,0xC0,0x20,0x30,0x00, // '#'
0x00,0xC0,0x00,0x30,0x00,0x0C,0x01,0xFF,0xFE,0xFF,0xFF,0xF0,0x30,0x3C,0x0C,0x03,0x03,0x00,0xC0,0xC0,0x30,0x30,0x0F,0xFF,0xF9,0xFF,0xFF,0x00,0xC0,0xC0,0x30,0x30,0x0C,0x0C,0x03,0x03,0xC0,0xC0,0xF0,0x30,0x3F,0xFF,0xFD,0xFF,0xFE,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00, // '$'
0x00,0x00,0x03,0xF0,0x00,0xBF,0xC0,0x0D,0x86,0x00,0xEC,0x30,0x1E,0x61,0x81,0xE3,0x0C,0x1C,0x1F,0xE1,0xC0,0x7E,0x3C,0x00,0x03,0xC0,0x00,0x3C,0xFC,0x03,0x8F,0xF0,0x38,0x60,0x87,0x83,0x04,0x78,0x18,0x23,0x80,0xC1,0x10,0x07,0xF8,0x00,0x1F,0x80, // '%'
0x3F,0xFF,0x03,0xFF,0xFC,0x18,0x00,0x60,0xC0,0x03,0x06,0x00,0x00,0x30,0x00,0x01,0xC0,0x00,0x07,0x80,0x00,0xCE,0x00,0x06,0x1C,0x0C,0x30,0x38,0x61,0x80,0x73,0x0C,0x00,0xF8,0x60,0x01,0xE3,0x00,0x07,0xDF,0xFF,0xF7,0x7F,0xFF,0x08, // '&'
0xFC, // '''
0x7F,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCF,0x70, // '('
0xEF,0x33,0x33,0x33,0x33,0x33,0x33,0x3F,0xE0, // ')'
0x06,0x00,0x60,0x06,0x07,0x6E,0x7F,0xE0,0xF0,0x0F,0x01,0x98,0x39,0xC1,0x08, // '*'
0x0C,0x06,0x03,0x1F,0xFF,0xF8,0x60,0x30,0x18,0x0C,0x00, // '+'
0xFF,0x80, // ','
0xFF,0xFF,0xC0, // '-'
0xF0, // '.'
0x00,0x00,0x01,0x00,0x30,0x03,0x00,0x60,0x0C,0x01,0x80,0x38,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0x00,0x60,0x0C,0x00,0x80,0x00,0x00, // '/'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0xF8,0x00,0xFC,0x00,0xFE,0x00,0xEF,0x01,0xC7,0x81,0xC3,0xC1,0xC1,0xE1,0xC0,0xF1,0xC0,0x7B,0x80,0x3F,0x80,0x1F,0x80,0x0F,0x80,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '0'
0x07,0x0F,0x1F,0x3B,0x73,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, // '1'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x7F,0xFF,0xFF,0xFF,0xB0,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x80, // '2'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x3F,0xFF,0x1F,0xFF,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '3'
0x00,0x1C,0x00,0x1E,0x00,0x1F,0x00,0x1F,0x80,0x1C,0xC0,0x1C,0x60,0x1C,0x30,0x1C,0x18,0x3C,0x0C,0x38,0x06,0x38,0x03,0x1F,0xFF,0xFF,0xFF,0xF8,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00, // '4'
0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFE,0xFF,0xFF,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '5'
0x7F,0xFC,0x7F,0xFE,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFE,0xFF,0xFF,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '6'
0xFF,0xFD,0xFF,0xFC,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06, // '7'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '8'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xFF,0xFF,0xBF,0xFF,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '9'
0xF0,0x00,0x00,0xF0, // ':'
0xF0,0x00,0x00,0xFF,0x80, // ';'
0x00,0x40,0x70,0x78,0x3C,0x3C,0x3C,0x0E,0x03,0x80,0x78,0x07,0x00,0xF0,0x0F,0x00,0xC0,0x10, // '<'
0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0, // '='
0x80,0x30,0x0F,0x00,0xF0,0x1E,0x01,0xE0,0x1C,0x07,0x07,0x87,0x87,0x83,0xC0,0xC0,0x00,0x00, // '>'
0xFF,0xFD,0xFF,0xFC,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x0F,0xFE,0x3F,0xF8,0x60,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x18,0x00, // '?'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x3E,0x1E,0x3F,0x8F,0x30,0x67,0x98,0x33,0xCC,0x19,0xE6,0x0C,0xF3,0x06,0x79,0xFF,0xFC,0x7F,0xFE,0x00,0x03,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0x80, // '@'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0x80, // 'A'
0xFF,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x00, // 'B'
0x7F,0xFF,0xFF,0xFF,0xF0,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0x80, // 'C'
0xFF,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x00, // 'D'
0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFF,0xF8,0xFF,0xF8,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFF,0xFF,0xFF,0xFF, // 'E'
0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFF,0xF8,0xFF,0xF8,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00, // 'F'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x1F,0xE0,0x0F,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'G'
0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xC0, // 'H'
0xFF,0xFF,0xFF,0xFF,0xC0, // 'I'
0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'J'
0xC0,0x03,0x60,0x03,0x30,0x03,0x18,0x03,0x0C,0x03,0x06,0x03,0x83,0x03,0x81,0xFF,0x80,0xFF,0xC0,0x60,0x60,0x30,0x18,0x18,0x06,0x0C,0x03,0x86,0x00,0xE3,0x00,0x31,0x80,0x0C,0xC0,0x03,0x00, // 'K'
0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xC0, // 'L'
0xE0,0x00,0x7F,0x00,0x0F,0xF8,0x01,0xFD,0xC0,0x3B,0xCE,0x07,0x3C,0x60,0xE3,0xC3,0x0C,0x3C,0x19,0x83,0xC1,0xF8,0x3C,0x0F,0x03,0xC0,0x60,0x3C,0x00,0x03,0xC0,0x00,0x3C,0x00,0x03,0xC0,0x00,0x3C,0x00,0x03,0xC0,0x00,0x30, // 'M'
0xE0,0x01,0xF8,0x00,0xFE,0x00,0x7B,0x80,0x3C,0xC0,0x1E,0x30,0x0F,0x0C,0x07,0x87,0x03,0xC1,0xC1,0xE0,0x70,0xF0,0x18,0x78,0x06,0x3C,0x01,0x9E,0x00,0xEF,0x00,0x3F,0x80,0x0F,0xC0,0x03,0x80, // 'N'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'O'
0xFF,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xD8,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00,0x00, // 'P'
0x7F,0xFF,0x0F,0xFF,0xF8,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8F,0xFF,0xFF,0x7F,0xFF,0xF0, // 'Q'
0xFF,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xD8,0x06,0x0C,0x03,0x86,0x00,0xE3,0x00,0x39,0x80,0x0E,0xC0,0x03,0x00, // 'R'
0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFE,0x7F,0xFF,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'S'
0xFF,0xFF,0xFF,0xFF,0xC0,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00, // 'T'
0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'U'
0x60,0x00,0x0E,0x30,0x00,0x0C,0x38,0x00,0x1C,0x18,0x00,0x18,0x1C,0x00,0x30,0x0C,0x00,0x30,0x06,0x00,0x60,0x07,0x00,0xE0,0x03,0x00,0xC0,0x03,0x81,0xC0,0x01,0x81,0x80,0x00,0xC3,0x00,0x00,0xC7,0x00,0x00,0x66,0x00,0x00,0x7E,0x00,0x00,0x3C,0x00,0x00,0x18,0x00, // 'V'
0x60,0x07,0x00,0x66,0x00,0xF0,0x06,0x30,0x0F,0x00,0xE3,0x00,0xD8,0x0C,0x18,0x19,0x80,0xC1,0x81,0x98,0x1C,0x18,0x18,0xC1,0x80,0xC3,0x0C,0x18,0x0C,0x30,0xE3,0x00,0xC7,0x06,0x30,0x06,0x60,0x63,0x00,0x66,0x03,0x60,0x07,0xE0,0x36,0x00,0x3C,0x03,0xE0,0x03,0xC0,0x1C,0x00,0x18,0x01,0xC0,0x01,0x80,0x18,0x00, // 'W'
0x60,0x03,0x9C,0x01,0xC3,0x80,0xE0,0x70,0x30,0x0C,0x18,0x01,0x8C,0x00,0x37,0x00,0x07,0x80,0x01,0xC0,0x00,0xF8,0x00,0x37,0x00,0x18,0xC0,0x0C,0x18,0x07,0x03,0x03,0x80,0xE1,0xC0,0x1C,0x60,0x03,0x80, // 'X'
0xE0,0x01,0xD8,0x00,0xE3,0x00,0x30,0x60,0x18,0x1C,0x0E,0x03,0x87,0x00,0x73,0x80,0x0C,0xC0,0x03,0xF0,0x00,0x78,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00, // 'Y'
0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0x80, // 'Z'
0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCF,0xF0, // '['
0x00,0x08,0x00,0xC0,0x0C,0x00,0x60,0x03,0x00,0x18,0x00,0xC0,0x0C,0x00,0x60,0x03,0x00,0x18,0x00,0xC0,0x0C,0x00,0x60,0x03,0x00,0x10,0x00, // '\'
0xFF,0x33,0x33,0x33,0x33,0x33,0x33,0x3F,0xF0, // ']'
0x00, // '^'
0xFF,0xFF,0xFF,0xFF,0xC0, // '_'
0x66,0x60, // '`'
0xFF,0xFB,0xFF,0xF0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x3F,0xFF,0xFF,0xFF,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xF0, // 'a'
0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0xFF,0xEF,0xFF,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0xFF,0xFF,0xFF,0x80, // 'b'
0x7F,0xFF,0xFF,0xFC,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xFF,0xFD,0xFF,0xF0, // 'c'
0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0D,0xFF,0xFF,0xFF,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0xFF,0xF7,0xFF,0xC0, // 'd'
0x7F,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3F,0xFF,0xFF,0xFF,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xFF,0xFD,0xFF,0xF0, // 'e'
0x7F,0xFF,0xC0,0xC0,0xC0,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0, // 'f'
0x7F,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xF0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x31,0xFF,0xC7,0xFE, // 'g'
0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0xFF,0xEF,0xFF,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xC0, // 'h'
0xF0,0x3F,0xFF,0xFF,0xFC, // 'i'
0x01,0x80,0xC0,0x00,0x00,0x00,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x0C,0x07,0xFF,0xFF,0x00, // 'j'
0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x6C,0x03,0xB0,0x1C,0xC0,0xE3,0x07,0x0C,0x38,0x3F,0xC0,0xFF,0x03,0x0E,0x0C,0x1C,0x30,0x38,0xC0,0x73,0x00,0xEC,0x01,0x80, // 'k'
0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0xF7,0xC0, // 'l'
0xFF,0xFF,0xFB,0xFF,0xFF,0xFC,0x03,0x00,0xF0,0x0C,0x03,0xC0,0x30,0x0F,0x00,0xC0,0x3C,0x03,0x00,0xF0,0x0C,0x03,0xC0,0x30,0x0F,0x00,0xC0,0x3C,0x03,0x00,0xF0,0x0C,0x03,0xC0,0x30,0x0F,0x00,0xC0,0x30, // 'm'
0xFF,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x30, // 'n'
0x7F,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xE0, // 'o'
0xFF,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFF,0xFF,0xEC,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00, // 'p'
0x7F,0xFF,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xF0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03, // 'q'
0x7F,0xFF,0xFF,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x00, // 'r'
0x7F,0xFB,0xFF,0xFC,0x00,0xF0,0x00,0xC0,0x03,0x00,0x0F,0xFF,0x9F,0xFF,0x00,0x0C,0x00,0x30,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xE0, // 's'
0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,0x7F, // 't'
0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xE0, // 'u'
0x60,0x00,0xCE,0x00,0x30,0xC0,0x0E,0x1C,0x01,0x81,0x80,0x70,0x18,0x0C,0x03,0x03,0x80,0x30,0x60,0x06,0x1C,0x00,0x63,0x00,0x0C,0xC0,0x00,0xD8,0x00,0x1E,0x00,0x01,0xC0,0x00, // 'v'
0x60,0x1C,0x01,0x9C,0x07,0x80,0xE3,0x01,0xE0,0x30,0xC0,0xFC,0x0C,0x18,0x33,0x06,0x06,0x1C,0xE1,0x81,0xC6,0x18,0xE0,0x33,0x87,0x30,0x0C,0xC0,0xCC,0x01,0xB0,0x3F,0x00,0x7C,0x07,0x80,0x1E,0x01,0xE0,0x03,0x80,0x70,0x00,0xC0,0x0C,0x00, // 'w'
0x60,0x1C,0xE0,0x70,0xE0,0xC0,0xE3,0x00,0xEE,0x00,0xF8,0x00,0xE0,0x03,0xC0,0x07,0xC0,0x19,0xC0,0x71,0x81,0xC1,0x87,0x01,0x8C,0x03,0x80, // 'x'
0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xF0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x31,0xFF,0xC7,0xFE, // 'y'
0xFF,0xFF,0xFF,0xF0,0x01,0xC0,0x0E,0x00,0x70,0x07,0x00,0x38,0x01,0xC0,0x0E,0x00,0xE0,0x07,0x00,0x38,0x00,0xFF,0xFF,0xFF,0xF0, // 'z'
0x3B,0xD8,0xC6,0x31,0x98,0x86,0x18,0xC6,0x31,0x8F,0x38, // '{'
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC, // '|'
0xE7,0x8C,0x63,0x18,0xC3,0x08,0xCC,0x63,0x18,0xDE,0xE0 // '}'
};
const GFXglyph Orbitron_Light_24Glyphs[] PROGMEM = {
// bitmapOffset, width, height, xAdvance, xOffset, yOffset
{ 0, 1, 1, 8, 0, 0 }, // ' '
{ 1, 2, 17, 6, 1, -17 }, // '!'
{ 6, 6, 3, 10, 1, -17 }, // '"'
{ 9, 18, 17, 21, 1, -17 }, // '#'
{ 48, 18, 23, 21, 1, -20 }, // '$'
{ 100, 21, 18, 24, 1, -18 }, // '%'
{ 148, 21, 17, 23, 1, -17 }, // '&'
{ 193, 2, 3, 6, 1, -17 }, // '''
{ 194, 4, 17, 7, 1, -17 }, // '('
{ 203, 4, 17, 8, 1, -17 }, // ')'
{ 212, 12, 10, 13, 0, -17 }, // '*'
{ 227, 9, 9, 12, 1, -11 }, // '+'
{ 238, 2, 6, 5, 1, -2 }, // ','
{ 240, 9, 2, 13, 1, -8 }, // '-'
{ 243, 2, 2, 6, 1, -2 }, // '.'
{ 244, 12, 18, 15, 1, -18 }, // '/'
{ 271, 17, 17, 20, 1, -17 }, // '0'
{ 308, 8, 17, 10, -1, -17 }, // '1'
{ 325, 17, 17, 20, 1, -17 }, // '2'
{ 362, 17, 17, 20, 1, -17 }, // '3'
{ 399, 17, 17, 20, 1, -17 }, // '4'
{ 436, 17, 17, 20, 1, -17 }, // '5'
{ 473, 17, 17, 20, 1, -17 }, // '6'
{ 510, 15, 17, 17, 0, -17 }, // '7'
{ 542, 17, 17, 20, 1, -17 }, // '8'
{ 579, 17, 17, 20, 1, -17 }, // '9'
{ 616, 2, 14, 6, 1, -14 }, // ':'
{ 620, 2, 18, 5, 1, -14 }, // ';'
{ 625, 10, 14, 13, 1, -14 }, // '<'
{ 643, 12, 7, 15, 1, -11 }, // '='
{ 654, 10, 14, 12, 1, -14 }, // '>'
{ 672, 15, 17, 18, 1, -17 }, // '?'
{ 704, 17, 17, 20, 1, -17 }, // '@'
{ 741, 17, 17, 20, 1, -17 }, // 'A'
{ 778, 17, 17, 20, 1, -17 }, // 'B'
{ 815, 17, 17, 20, 1, -17 }, // 'C'
{ 852, 17, 17, 20, 1, -17 }, // 'D'
{ 889, 16, 17, 19, 1, -17 }, // 'E'
{ 923, 16, 17, 19, 1, -17 }, // 'F'
{ 957, 17, 17, 20, 1, -17 }, // 'G'
{ 994, 18, 17, 21, 1, -17 }, // 'H'
{ 1033, 2, 17, 6, 1, -17 }, // 'I'
{ 1038, 17, 17, 20, 1, -17 }, // 'J'
{ 1075, 17, 17, 20, 1, -17 }, // 'K'
{ 1112, 18, 17, 20, 1, -17 }, // 'L'
{ 1151, 20, 17, 23, 1, -17 }, // 'M'
{ 1194, 17, 17, 20, 1, -17 }, // 'N'
{ 1231, 17, 17, 20, 1, -17 }, // 'O'
{ 1268, 17, 17, 20, 1, -17 }, // 'P'
{ 1305, 20, 17, 22, 1, -17 }, // 'Q'
{ 1348, 17, 17, 20, 1, -17 }, // 'R'
{ 1385, 17, 17, 20, 1, -17 }, // 'S'
{ 1422, 17, 17, 20, 1, -17 }, // 'T'
{ 1459, 17, 17, 20, 1, -17 }, // 'U'
{ 1496, 24, 17, 25, 0, -17 }, // 'V'
{ 1547, 28, 17, 29, 0, -17 }, // 'W'
{ 1607, 18, 17, 20, 1, -17 }, // 'X'
{ 1646, 18, 17, 20, 0, -17 }, // 'Y'
{ 1685, 17, 17, 20, 1, -17 }, // 'Z'
{ 1722, 4, 17, 7, 1, -17 }, // '['
{ 1731, 12, 18, 15, 1, -18 }, // '\'
{ 1758, 4, 17, 8, 1, -17 }, // ']'
{ 1767, 1, 1, 1, 0, 0 }, // '^'
{ 1768, 17, 2, 20, 1, 0 }, // '_'
{ 1773, 4, 3, 6, 0, -24 }, // '`'
{ 1775, 14, 14, 17, 1, -14 }, // 'a'
{ 1800, 14, 19, 17, 1, -19 }, // 'b'
{ 1834, 14, 14, 17, 1, -14 }, // 'c'
{ 1859, 14, 19, 17, 1, -19 }, // 'd'
{ 1893, 14, 14, 17, 1, -14 }, // 'e'
{ 1918, 8, 19, 11, 1, -19 }, // 'f'
{ 1937, 14, 20, 17, 1, -14 }, // 'g'
{ 1972, 14, 19, 17, 1, -19 }, // 'h'
{ 2006, 2, 19, 6, 1, -19 }, // 'i'
{ 2011, 9, 25, 7, -4, -19 }, // 'j'
{ 2040, 14, 19, 16, 1, -19 }, // 'k'
{ 2074, 6, 19, 8, 1, -19 }, // 'l'
{ 2089, 22, 14, 25, 1, -14 }, // 'm'
{ 2128, 14, 14, 17, 1, -14 }, // 'n'
{ 2153, 14, 14, 17, 1, -14 }, // 'o'
{ 2178, 14, 20, 17, 1, -14 }, // 'p'
{ 2213, 14, 20, 17, 1, -14 }, // 'q'
{ 2248, 11, 14, 13, 1, -14 }, // 'r'
{ 2268, 14, 14, 17, 1, -14 }, // 's'
{ 2293, 8, 19, 11, 1, -19 }, // 't'
{ 2312, 14, 14, 17, 1, -14 }, // 'u'
{ 2337, 19, 14, 20, 0, -14 }, // 'v'
{ 2371, 26, 14, 27, 0, -14 }, // 'w'
{ 2417, 15, 14, 18, 1, -14 }, // 'x'
{ 2444, 14, 20, 17, 1, -14 }, // 'y'
{ 2479, 14, 14, 17, 1, -14 }, // 'z'
{ 2504, 5, 17, 8, 1, -17 }, // '{'
{ 2515, 2, 23, 6, 1, -20 }, // '|'
{ 2521, 5, 17, 8, 1, -17 } // '}'
};
const GFXfont Orbitron_Light_24 PROGMEM = {
(uint8_t *)Orbitron_Light_24Bitmaps,(GFXglyph *)Orbitron_Light_24Glyphs,0x20, 0x7D, 24};

+ 199
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Orbitron_Light_32.h 查看文件

@@ -0,0 +1,199 @@
// Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const uint8_t Orbitron_Light_32Bitmaps[] PROGMEM = {

// Bitmap Data:
0x00, // ' '
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x3F, // '!'
0xE7,0xE7,0xE7,0xE7, // '"'
0x00,0x70,0x0E,0x00,0x60,0x0C,0x00,0xE0,0x1C,0x00,0xE0,0x1C,0x00,0xC0,0x18,0x01,0xC0,0x38,0x7F,0xFF,0xFF,0x7F,0xFF,0xFF,0x03,0x80,0x70,0x03,0x80,0x70,0x03,0x00,0x60,0x07,0x00,0xE0,0x07,0x00,0xE0,0x06,0x00,0xE0,0x06,0x00,0xC0,0x0E,0x01,0xC0,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0x1C,0x03,0x80,0x18,0x03,0x80,0x38,0x03,0x00,0x38,0x07,0x00,0x38,0x07,0x00,0x30,0x06,0x00, // '#'
0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x01,0xFF,0xFF,0xC7,0xFF,0xFF,0xDC,0x07,0x01,0xF8,0x0E,0x03,0xF0,0x1C,0x07,0xE0,0x38,0x01,0xC0,0x70,0x03,0x80,0xE0,0x07,0x01,0xC0,0x0E,0x03,0x80,0x1C,0x07,0x00,0x1F,0xFF,0xFE,0x1F,0xFF,0xFE,0x00,0x38,0x0E,0x00,0x70,0x1C,0x00,0xE0,0x38,0x01,0xC0,0x70,0x03,0x80,0xE0,0x07,0x01,0xF8,0x0E,0x03,0xF0,0x1C,0x07,0xE0,0x38,0x0E,0xFF,0xFF,0xF8,0xFF,0xFF,0xE0,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00, // '$'
0x00,0x00,0x00,0x03,0xF8,0x00,0x04,0x7F,0xC0,0x00,0xCC,0x06,0x00,0x1C,0xC0,0x60,0x03,0xCC,0x06,0x00,0x78,0xC0,0x60,0x0F,0x0C,0x06,0x03,0xC0,0xC0,0x60,0x78,0x0C,0x06,0x0F,0x00,0x7F,0xC1,0xE0,0x03,0xF8,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x1F,0xC0,0x07,0xC3,0xFE,0x00,0xF0,0x60,0x30,0x1E,0x06,0x03,0x03,0xC0,0x60,0x30,0x78,0x06,0x03,0x0F,0x00,0x60,0x31,0xE0,0x06,0x03,0x1C,0x00,0x60,0x31,0x80,0x03,0xFE,0x00,0x00,0x1F,0xC0, // '%'
0x1F,0xFF,0xF0,0x03,0xFF,0xFF,0x80,0x70,0x00,0x1C,0x07,0x00,0x01,0xC0,0x70,0x00,0x1C,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x07,0x78,0x00,0x00,0xE3,0xE0,0x00,0x0E,0x0F,0x80,0xE0,0xE0,0x3C,0x0E,0x0E,0x00,0xF0,0xE0,0xE0,0x07,0xCE,0x0E,0x00,0x1E,0xE0,0xE0,0x00,0x7E,0x0E,0x00,0x01,0xF0,0xE0,0x00,0x0F,0x8E,0x00,0x00,0xFE,0x7F,0xFF,0xFC,0x73,0xFF,0xFF,0x81, // '&'
0xFF,0xF0, // '''
0x3B,0xF9,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x71,0xE7, // '('
0xE7,0x8E,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9F,0xDC, // ')'
0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x27,0x39,0xCF,0xFF,0x8F,0xFE,0x03,0xE0,0x0F,0xE0,0x1D,0xC0,0x79,0xC1,0xE3,0xC1,0x83,0x00,0x00,0x00, // '*'
0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0xFF,0xFF,0xFF,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00, // '+'
0xFF,0xFF,0xA0, // ','
0xFF,0xFF,0xFF, // '-'
0xFC, // '.'
0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x30,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x03,0x00,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x30,0x00,0x70,0x00,0xE0,0x00,0xC0,0x00,0x80,0x00,0x00,0x00, // '/'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x7F,0x00,0x01,0xFE,0x00,0x07,0xFC,0x00,0x1F,0xF8,0x00,0x7B,0xF0,0x01,0xE7,0xE0,0x07,0x8F,0xC0,0x1E,0x1F,0x80,0x78,0x3F,0x01,0xE0,0x7E,0x07,0x80,0xFC,0x1E,0x01,0xF8,0x78,0x03,0xF1,0xE0,0x07,0xE7,0x80,0x0F,0xDE,0x00,0x1F,0xF8,0x00,0x3F,0xE0,0x00,0x7F,0x80,0x00,0xFE,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '0'
0x03,0xC1,0xF0,0xFC,0x7F,0x3D,0xCE,0x77,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07, // '1'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x73,0xFF,0xFF,0xCF,0xFF,0xFF,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF, // '2'
0x3F,0xFF,0xF0,0xFF,0xFF,0xF3,0x80,0x00,0x77,0x00,0x00,0xEE,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x3F,0xFF,0xE0,0x7F,0xFF,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '3'
0x00,0x01,0xE0,0x00,0x0F,0x80,0x00,0x7E,0x00,0x03,0xF8,0x00,0x1F,0xE0,0x00,0xFB,0x80,0x07,0xCE,0x00,0x3E,0x38,0x01,0xF0,0xE0,0x0F,0x83,0x80,0x78,0x0E,0x03,0xC0,0x38,0x1E,0x00,0xE0,0xF0,0x03,0x87,0x80,0x0E,0x3C,0x00,0x38,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x0E,0x00,0x00,0x38,0x00,0x00,0xE0,0x00,0x03,0x80,0x00,0x0E,0x00,0x00,0x38, // '4'
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0xFF,0xFF,0xCF,0xFF,0xFF,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '5'
0x3F,0xFF,0xE0,0xFF,0xFF,0xC3,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0xFF,0xFF,0xCF,0xFF,0xFF,0xDC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '6'
0xFF,0xFF,0xCF,0xFF,0xFE,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07, // '7'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3B,0xFF,0xFF,0xE7,0xFF,0xFF,0xDC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '8'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x77,0xFF,0xFF,0xE7,0xFF,0xFF,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '9'
0xFC,0x00,0x00,0x00,0x00,0x00,0x1F,0x80, // ':'
0xFC,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xA0, // ';'
0x00,0x08,0x00,0xC0,0x1E,0x03,0xF0,0x7E,0x07,0xC0,0xF8,0x1F,0x80,0xF0,0x07,0x00,0x3E,0x00,0xF8,0x01,0xF0,0x07,0xE0,0x0F,0xC0,0x1F,0x00,0x38,0x00,0xC0,0x00, // '<'
0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x80, // '='
0x80,0x06,0x00,0x3C,0x01,0xF8,0x03,0xE0,0x07,0xC0,0x1F,0x80,0x3F,0x00,0x78,0x01,0xC0,0x3E,0x03,0xE0,0x7C,0x0F,0xC0,0xF8,0x1F,0x00,0xF0,0x06,0x00,0x00,0x00, // '>'
0xFF,0xFF,0xE7,0xFF,0xFF,0x80,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x3F,0xFF,0x03,0xFF,0xF0,0x38,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x01,0xC0,0x00, // '?'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x7F,0x07,0xE1,0xFF,0x0F,0xC6,0x03,0x1F,0x8C,0x06,0x3F,0x18,0x0C,0x7E,0x30,0x18,0xFC,0x60,0x31,0xF8,0xC0,0x63,0xF1,0x80,0xC7,0xE1,0xFF,0xFF,0xC1,0xFF,0xFF,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x1F,0xFF,0xFF,0x9F,0xFF,0xFF, // '@'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07, // 'A'
0xFF,0xFF,0xF1,0xFF,0xFF,0xF3,0x80,0x00,0x77,0x00,0x00,0xEE,0x00,0x01,0xDC,0x00,0x03,0xB8,0x00,0x07,0x70,0x00,0x0E,0xE0,0x00,0x1D,0xC0,0x00,0x3B,0x80,0x00,0x77,0xFF,0xFF,0xEF,0xFF,0xFF,0xDC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xFF,0xFF,0xFF,0x7F,0xFF,0xFC, // 'B'
0x3F,0xFF,0xFE,0xFF,0xFF,0xFF,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x1F,0xFF,0xFF,0x9F,0xFF,0xFF, // 'C'
0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xFF,0xFF,0xFF,0x7F,0xFF,0xFC, // 'D'
0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xFF,0xFF,0x8F,0xFF,0xFC,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF, // 'E'
0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xFF,0xFF,0x8F,0xFF,0xFC,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00, // 'F'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x1F,0xFC,0x00,0x3F,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'G'
0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07, // 'H'
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // 'I'
0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'J'
0xE0,0x00,0x1D,0xC0,0x00,0x73,0x80,0x01,0xC7,0x00,0x07,0x8E,0x00,0x1E,0x1C,0x00,0x38,0x38,0x00,0xE0,0x70,0x03,0x80,0xE0,0x0F,0x01,0xC0,0x1C,0x03,0x80,0x70,0x07,0xFF,0xC0,0x0F,0xFF,0x80,0x1C,0x03,0x80,0x38,0x03,0x80,0x70,0x07,0x00,0xE0,0x07,0x01,0xC0,0x07,0x03,0x80,0x07,0x07,0x00,0x0F,0x0E,0x00,0x0F,0x1C,0x00,0x0E,0x38,0x00,0x0E,0x70,0x00,0x0E, // 'K'
0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF, // 'L'
0xF0,0x00,0x03,0xFE,0x00,0x01,0xFF,0xC0,0x00,0xFF,0xF8,0x00,0x7F,0xEE,0x00,0x1D,0xF9,0xC0,0x0E,0x7E,0x38,0x07,0x1F,0x8F,0x03,0xC7,0xE1,0xC0,0xE1,0xF8,0x38,0x70,0x7E,0x07,0x38,0x1F,0x81,0xFE,0x07,0xE0,0x3F,0x01,0xF8,0x07,0x80,0x7E,0x00,0xC0,0x1F,0x80,0x20,0x07,0xE0,0x00,0x01,0xF8,0x00,0x00,0x7E,0x00,0x00,0x1F,0x80,0x00,0x07,0xE0,0x00,0x01,0xF8,0x00,0x00,0x7E,0x00,0x00,0x1F,0x80,0x00,0x07, // 'M'
0xF0,0x00,0x0F,0xF0,0x00,0x1F,0xF0,0x00,0x3F,0xF0,0x00,0x7E,0xE0,0x00,0xFC,0xE0,0x01,0xF8,0xE0,0x03,0xF1,0xE0,0x07,0xE1,0xC0,0x0F,0xC1,0xC0,0x1F,0x81,0xC0,0x3F,0x03,0xC0,0x7E,0x03,0xC0,0xFC,0x03,0x81,0xF8,0x03,0x83,0xF0,0x03,0x87,0xE0,0x07,0x8F,0xC0,0x07,0x1F,0x80,0x07,0x3F,0x00,0x07,0x7E,0x00,0x0F,0xFC,0x00,0x0F,0xF8,0x00,0x0F,0xF0,0x00,0x0F, // 'N'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'O'
0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFF,0xFF,0xFF,0xBF,0xFF,0xFE,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00, // 'P'
0x3F,0xFF,0xF8,0x1F,0xFF,0xFF,0x0E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x87,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF, // 'Q'
0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFF,0xFF,0xFF,0xBF,0xFF,0xFE,0x70,0x03,0x80,0xE0,0x07,0x81,0xC0,0x07,0x83,0x80,0x07,0x07,0x00,0x07,0x0E,0x00,0x0F,0x1C,0x00,0x0F,0x38,0x00,0x0F,0x70,0x00,0x0E, // 'R'
0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,0xFF,0xFF,0xC3,0xFF,0xFF,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'S'
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00, // 'T'
0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'U'
0xE0,0x00,0x00,0x3D,0xC0,0x00,0x00,0xE3,0x80,0x00,0x07,0x0E,0x00,0x00,0x1C,0x1C,0x00,0x00,0xE0,0x70,0x00,0x03,0x80,0xE0,0x00,0x1C,0x03,0x80,0x00,0x70,0x07,0x00,0x03,0x80,0x1C,0x00,0x1E,0x00,0x38,0x00,0x70,0x00,0x70,0x03,0x80,0x01,0xC0,0x0E,0x00,0x03,0x80,0x70,0x00,0x0E,0x01,0xC0,0x00,0x1C,0x0E,0x00,0x00,0x70,0x38,0x00,0x00,0xE1,0xC0,0x00,0x03,0x87,0x00,0x00,0x07,0x38,0x00,0x00,0x0D,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xE0,0x00, // 'V'
0xE0,0x00,0xF0,0x00,0x76,0x00,0x0F,0x00,0x0E,0x70,0x01,0xF0,0x00,0xE7,0x00,0x1F,0x80,0x0E,0x30,0x01,0xF8,0x01,0xC3,0x80,0x39,0x80,0x1C,0x38,0x03,0x9C,0x01,0x81,0x80,0x39,0xC0,0x38,0x1C,0x07,0x0C,0x03,0x81,0xC0,0x70,0xE0,0x30,0x0E,0x06,0x0E,0x07,0x00,0xE0,0xE0,0x70,0x70,0x0E,0x0E,0x07,0x06,0x00,0x70,0xC0,0x70,0xE0,0x07,0x1C,0x03,0x8E,0x00,0x31,0xC0,0x38,0xC0,0x03,0x98,0x03,0x9C,0x00,0x3B,0x80,0x1D,0xC0,0x01,0xB8,0x01,0xF8,0x00,0x1F,0x00,0x0F,0x80,0x01,0xF0,0x00,0xF8,0x00,0x0F,0x00,0x0F,0x00,0x00,0xE0,0x00,0x70,0x00,0x0E,0x00,0x07,0x00, // 'W'
0x70,0x00,0x1E,0x38,0x00,0x1C,0x3C,0x00,0x38,0x1E,0x00,0x70,0x0E,0x00,0xF0,0x07,0x01,0xE0,0x03,0x81,0xC0,0x01,0xC3,0x80,0x01,0xE7,0x00,0x00,0xEF,0x00,0x00,0x7E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7E,0x00,0x00,0xFF,0x00,0x01,0xE7,0x00,0x01,0xC3,0x80,0x03,0x81,0xC0,0x07,0x01,0xE0,0x0E,0x00,0xF0,0x1E,0x00,0x70,0x3C,0x00,0x38,0x38,0x00,0x1C,0x70,0x00,0x1E, // 'X'
0x70,0x00,0x07,0x3C,0x00,0x07,0x8E,0x00,0x03,0x83,0x80,0x03,0x80,0xE0,0x03,0x80,0x78,0x03,0xC0,0x1C,0x01,0xC0,0x07,0x01,0xC0,0x03,0xC1,0xE0,0x00,0xF1,0xE0,0x00,0x3D,0xE0,0x00,0x0E,0xE0,0x00,0x07,0xF0,0x00,0x01,0xF0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00, // 'Y'
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x38,0x00,0x01,0xF0,0x00,0x07,0xC0,0x00,0x1E,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x78,0x00,0x03,0xE0,0x00,0x0F,0x80,0x00,0x1C,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF, // 'Z'
0xFF,0xF9,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0xFF, // '['
0x00,0x00,0x80,0x00,0xC0,0x00,0xE0,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x06,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xC0,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0C,0x00,0x0E,0x00,0x07,0x00,0x03,0x00,0x01,0x00,0x00, // '\'
0xFF,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9F,0xFF, // ']'
0x00, // '^'
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC, // '_'
0xEE,0x67, // '`'
0xFF,0xFF,0x9F,0xFF,0xF8,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xFC,0xFF,0xFF,0x80, // 'a'
0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x3F,0xFF,0xE7,0xFF,0xFE,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0xFF,0xFE,0xFF,0xFF,0x80, // 'b'
0x3F,0xFF,0xEF,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x0F,0xFF,0xFC,0xFF,0xFF,0x80, // 'c'
0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xCF,0xFF,0xFB,0xFF,0xFF,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3B,0xFF,0xFF,0x3F,0xFF,0xE0, // 'd'
0x3F,0xFF,0x8F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x0F,0xFF,0xFC,0xFF,0xFF,0x80, // 'e'
0x3F,0xEF,0xFF,0x80,0x70,0x0E,0x01,0xC0,0x3F,0xFF,0xFF,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x07,0x00,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x07,0x00,0xE0,0x00, // 'f'
0x3F,0xFF,0x8F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xFC,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE1,0xFF,0xF8,0x3F,0xFE,0x00, // 'g'
0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x3F,0xFF,0xE7,0xFF,0xFE,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xE0, // 'h'
0xFC,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0, // 'i'
0x00,0x70,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x7F,0xFE,0xFF,0xC0, // 'j'
0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x77,0x00,0x1C,0xE0,0x07,0x9C,0x01,0xE3,0x80,0x78,0x70,0x1E,0x0E,0x07,0x81,0xC0,0xE0,0x3F,0xF8,0x07,0xFF,0x00,0xE0,0x70,0x1C,0x0F,0x03,0x80,0xE0,0x70,0x0E,0x0E,0x00,0xE1,0xC0,0x0E,0x38,0x01,0xE7,0x00,0x1E,0xE0,0x01,0xC0, // 'k'
0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x3F,0x3E, // 'l'
0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xB8,0x01,0xC0,0x0F,0xC0,0x0E,0x00,0x7E,0x00,0x70,0x03,0xF0,0x03,0x80,0x1F,0x80,0x1C,0x00,0xFC,0x00,0xE0,0x07,0xE0,0x07,0x00,0x3F,0x00,0x38,0x01,0xF8,0x01,0xC0,0x0F,0xC0,0x0E,0x00,0x7E,0x00,0x70,0x03,0xF0,0x03,0x80,0x1F,0x80,0x1C,0x00,0xFC,0x00,0xE0,0x07,0xE0,0x07,0x00,0x3F,0x00,0x38,0x01,0xF8,0x01,0xC0,0x0E, // 'm'
0xFF,0xFF,0x9F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0x80, // 'n'
0x3F,0xFF,0x8F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xF8,0xFF,0xFE,0x00, // 'o'
0xFF,0xFF,0x9F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFF,0xFF,0xFB,0xFF,0xFE,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x00, // 'p'
0x3F,0xFF,0xEF,0xFF,0xFF,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xFC,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80, // 'q'
0x3F,0xFE,0xFF,0xFF,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x00, // 'r'
0x3F,0xFF,0x8F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0x7F,0xFF,0x87,0xFF,0xF8,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xF8,0xFF,0xFE,0x00, // 's'
0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x3F,0xFF,0xFF,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x07,0x00,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x03,0xFF,0x3F,0xE0, // 't'
0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xF8,0xFF,0xFE,0x00, // 'u'
0x70,0x00,0x07,0x3C,0x00,0x07,0x0E,0x00,0x03,0x83,0x80,0x03,0x81,0xC0,0x01,0xC0,0x70,0x01,0xC0,0x38,0x00,0xE0,0x0E,0x00,0xE0,0x07,0x00,0x70,0x01,0xC0,0x70,0x00,0xE0,0x38,0x00,0x38,0x38,0x00,0x1C,0x38,0x00,0x07,0x1C,0x00,0x03,0x9C,0x00,0x00,0xEE,0x00,0x00,0x3E,0x00,0x00,0x1F,0x00,0x00,0x07,0x00,0x00, // 'v'
0xE0,0x03,0xC0,0x07,0x38,0x01,0xF0,0x03,0x9C,0x01,0xF8,0x01,0xCE,0x00,0xFE,0x01,0xC3,0x80,0x77,0x00,0xE1,0xC0,0x73,0x80,0x60,0x70,0x38,0xE0,0x70,0x38,0x3C,0x70,0x38,0x1C,0x1C,0x1C,0x38,0x07,0x0E,0x0E,0x1C,0x03,0x8E,0x07,0x8E,0x00,0xE7,0x01,0xCE,0x00,0x77,0x00,0xF7,0x00,0x3B,0x80,0x3B,0x80,0x0F,0xC0,0x1F,0x80,0x07,0xC0,0x07,0xC0,0x03,0xE0,0x03,0xC0,0x00,0xE0,0x00,0xE0,0x00,0x70,0x00,0x70,0x00, // 'w'
0x70,0x00,0xE3,0x80,0x1C,0x1C,0x03,0x81,0xE0,0x78,0x0F,0x0F,0x00,0x79,0xE0,0x03,0x9C,0x00,0x1F,0x80,0x00,0xF0,0x00,0x0F,0x00,0x01,0xF8,0x00,0x3F,0x80,0x03,0x9C,0x00,0x70,0xE0,0x0F,0x0F,0x01,0xE0,0x78,0x3C,0x03,0x83,0x80,0x1C,0x70,0x00,0xE0, // 'x'
0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xFC,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE1,0xFF,0xF8,0x3F,0xFE,0x00, // 'y'
0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x03,0x80,0x01,0xF0,0x00,0x78,0x00,0x1E,0x00,0x07,0x80,0x01,0xE0,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x07,0xC0,0x00,0xE0,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x80, // 'z'
0x0E,0x3C,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x73,0xC7,0x0E,0x1E,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x07,0x87, // '{'
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8, // '|'
0xE3,0xC3,0x8E,0x38,0xE3,0x8E,0x38,0xE1,0xC3,0x0C,0x73,0x8E,0x38,0xE3,0x8E,0x38,0xEF,0x38 // '}'
};
const GFXglyph Orbitron_Light_32Glyphs[] PROGMEM = {
// bitmapOffset, width, height, xAdvance, xOffset, yOffset
{ 0, 1, 1, 10, 0, 0 }, // ' '
{ 1, 3, 24, 9, 2, -24 }, // '!'
{ 10, 8, 4, 13, 2, -24 }, // '"'
{ 14, 24, 24, 27, 1, -24 }, // '#'
{ 86, 23, 31, 26, 1, -27 }, // '$'
{ 176, 28, 25, 32, 2, -25 }, // '%'
{ 264, 28, 24, 31, 2, -24 }, // '&'
{ 348, 3, 4, 9, 2, -24 }, // '''
{ 350, 5, 24, 10, 2, -24 }, // '('
{ 365, 5, 24, 10, 2, -24 }, // ')'
{ 380, 15, 14, 17, 0, -24 }, // '*'
{ 407, 12, 13, 15, 1, -16 }, // '+'
{ 427, 3, 7, 8, 2, -3 }, // ','
{ 430, 12, 2, 17, 2, -10 }, // '-'
{ 433, 3, 2, 8, 2, -2 }, // '.'
{ 434, 16, 24, 19, 1, -24 }, // '/'
{ 482, 23, 24, 28, 2, -24 }, // '0'
{ 551, 10, 24, 14, 0, -24 }, // '1'
{ 581, 23, 24, 27, 2, -24 }, // '2'
{ 650, 23, 24, 27, 2, -24 }, // '3'
{ 719, 22, 24, 25, 1, -24 }, // '4'
{ 785, 23, 24, 27, 2, -24 }, // '5'
{ 854, 23, 24, 27, 2, -24 }, // '6'
{ 923, 20, 24, 23, 0, -24 }, // '7'
{ 983, 23, 24, 28, 2, -24 }, // '8'
{ 1052, 23, 24, 28, 2, -24 }, // '9'
{ 1121, 3, 19, 8, 2, -19 }, // ':'
{ 1129, 3, 23, 8, 2, -19 }, // ';'
{ 1138, 13, 19, 17, 1, -19 }, // '<'
{ 1169, 17, 9, 22, 2, -14 }, // '='
{ 1189, 13, 19, 17, 2, -19 }, // '>'
{ 1220, 21, 24, 24, 1, -24 }, // '?'
{ 1283, 23, 24, 28, 2, -24 }, // '@'
{ 1352, 23, 24, 28, 2, -24 }, // 'A'
{ 1421, 23, 24, 28, 2, -24 }, // 'B'
{ 1490, 23, 24, 28, 2, -24 }, // 'C'
{ 1559, 23, 24, 28, 2, -24 }, // 'D'
{ 1628, 21, 24, 26, 2, -24 }, // 'E'
{ 1691, 21, 24, 25, 2, -24 }, // 'F'
{ 1754, 23, 24, 28, 2, -24 }, // 'G'
{ 1823, 24, 24, 29, 2, -24 }, // 'H'
{ 1895, 3, 24, 9, 2, -24 }, // 'I'
{ 1904, 23, 24, 27, 1, -24 }, // 'J'
{ 1973, 23, 24, 27, 2, -24 }, // 'K'
{ 2042, 23, 24, 27, 2, -24 }, // 'L'
{ 2111, 26, 24, 31, 2, -24 }, // 'M'
{ 2189, 23, 24, 28, 2, -24 }, // 'N'
{ 2258, 23, 24, 28, 2, -24 }, // 'O'
{ 2327, 23, 24, 27, 2, -24 }, // 'P'
{ 2396, 26, 24, 30, 2, -24 }, // 'Q'
{ 2474, 23, 24, 28, 2, -24 }, // 'R'
{ 2543, 23, 24, 28, 2, -24 }, // 'S'
{ 2612, 23, 24, 26, 1, -24 }, // 'T'
{ 2681, 23, 24, 28, 2, -24 }, // 'U'
{ 2750, 30, 24, 33, 1, -24 }, // 'V'
{ 2840, 36, 24, 39, 1, -24 }, // 'W'
{ 2948, 24, 24, 27, 1, -24 }, // 'X'
{ 3020, 25, 24, 27, 0, -24 }, // 'Y'
{ 3095, 23, 24, 28, 2, -24 }, // 'Z'
{ 3164, 5, 24, 10, 2, -24 }, // '['
{ 3179, 16, 24, 19, 1, -24 }, // '\'
{ 3227, 5, 24, 10, 2, -24 }, // ']'
{ 3242, 1, 1, 1, 0, 0 }, // '^'
{ 3243, 23, 2, 27, 2, 1 }, // '_'
{ 3249, 4, 4, 8, 1, -33 }, // '`'
{ 3251, 19, 19, 24, 2, -19 }, // 'a'
{ 3297, 19, 25, 23, 2, -25 }, // 'b'
{ 3357, 19, 19, 24, 2, -19 }, // 'c'
{ 3403, 19, 25, 23, 1, -25 }, // 'd'
{ 3463, 19, 19, 24, 2, -19 }, // 'e'
{ 3509, 11, 25, 14, 2, -25 }, // 'f'
{ 3544, 19, 27, 23, 1, -19 }, // 'g'
{ 3609, 19, 25, 23, 2, -25 }, // 'h'
{ 3669, 3, 25, 8, 2, -25 }, // 'i'
{ 3679, 12, 33, 9, -6, -25 }, // 'j'
{ 3729, 19, 25, 22, 2, -25 }, // 'k'
{ 3789, 7, 25, 11, 2, -25 }, // 'l'
{ 3811, 29, 19, 33, 2, -19 }, // 'm'
{ 3880, 19, 19, 24, 2, -19 }, // 'n'
{ 3926, 19, 19, 24, 2, -19 }, // 'o'
{ 3972, 19, 27, 23, 2, -19 }, // 'p'
{ 4037, 19, 27, 23, 1, -19 }, // 'q'
{ 4102, 15, 19, 18, 2, -19 }, // 'r'
{ 4138, 19, 19, 24, 2, -19 }, // 's'
{ 4184, 11, 25, 14, 2, -25 }, // 't'
{ 4219, 19, 19, 24, 2, -19 }, // 'u'
{ 4265, 25, 19, 26, 0, -19 }, // 'v'
{ 4325, 33, 19, 35, 1, -19 }, // 'w'
{ 4404, 20, 19, 23, 1, -19 }, // 'x'
{ 4452, 19, 27, 23, 1, -19 }, // 'y'
{ 4517, 19, 19, 24, 2, -19 }, // 'z'
{ 4563, 7, 24, 10, 0, -24 }, // '{'
{ 4584, 3, 31, 8, 2, -27 }, // '|'
{ 4596, 6, 24, 10, 2, -24 } // '}'
};
const GFXfont Orbitron_Light_32 PROGMEM = {
(uint8_t *)Orbitron_Light_32Bitmaps,(GFXglyph *)Orbitron_Light_32Glyphs,0x20, 0x7D, 32};

+ 199
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Roboto_Thin_24.h 查看文件

@@ -0,0 +1,199 @@
// Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const uint8_t Roboto_Thin_24Bitmaps[] PROGMEM = {

// Bitmap Data:
0x00, // ' '
0x49,0x24,0x92,0x49,0x20,0x00,0x40, // '!'
0xB6,0xDA, // '"'
0x02,0x10,0x10,0x80,0x42,0x01,0x08,0x04,0x21,0xFF,0xF0,0x44,0x02,0x10,0x08,0x40,0x21,0x00,0x84,0x1F,0xFE,0x10,0x80,0x42,0x01,0x08,0x04,0x20,0x10,0x80, // '#'
0x04,0x01,0x00,0x40,0xFC,0x61,0xB0,0x38,0x06,0x01,0x80,0x10,0x02,0x00,0x60,0x07,0x00,0x20,0x06,0x01,0x80,0x70,0x36,0x18,0x7C,0x04,0x01,0x00,0x40, // '$'
0x38,0x01,0x8C,0x02,0x08,0x44,0x11,0x08,0x22,0x18,0xC8,0x0F,0x10,0x00,0x40,0x01,0x00,0x02,0x78,0x09,0x90,0x22,0x10,0x44,0x21,0x08,0x42,0x10,0x80,0x32,0x00,0x3C, // '%'
0x1E,0x01,0x08,0x10,0x20,0x81,0x04,0x08,0x20,0x80,0x88,0x03,0x80,0x18,0x01,0x20,0x10,0x85,0x02,0x28,0x0A,0x40,0x33,0x01,0x8C,0x14,0x3F,0x10, // '&'
0xF8, // '''
0x00,0x21,0x04,0x21,0x04,0x10,0x42,0x08,0x20,0x82,0x08,0x20,0x82,0x04,0x10,0x40,0x82,0x04,0x08,0x00, // '('
0x01,0x02,0x08,0x10,0x40,0x82,0x08,0x10,0x41,0x04,0x10,0x41,0x04,0x10,0x82,0x08,0x41,0x08,0x40,0x00, // ')'
0x04,0x00,0x80,0x10,0x22,0x23,0xF8,0x08,0x02,0x80,0x88,0x20,0x80,0x00, // '*'
0x02,0x00,0x10,0x00,0x80,0x04,0x00,0x20,0x3F,0xFC,0x08,0x00,0x40,0x02,0x00,0x10,0x00,0x80,0x04,0x00, // '+'
0x55,0x80, // ','
0x7C, // '-'
0x40, // '.'
0x01,0x00,0x80,0x80,0x40,0x20,0x20,0x10,0x10,0x08,0x04,0x04,0x02,0x01,0x01,0x00,0x80,0x80,0x40,0x20,0x20,0x00, // '/'
0x1E,0x08,0x44,0x0B,0x02,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x70,0x34,0x08,0x84,0x1E,0x00, // '0'
0x0D,0xD8,0x41,0x04,0x10,0x41,0x04,0x10,0x41,0x04,0x10,0x41,0x04, // '1'
0x1F,0x0C,0x31,0x03,0x40,0x28,0x04,0x00,0x80,0x20,0x04,0x01,0x00,0x40,0x10,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x7F,0xE0, // '2'
0x1F,0x0C,0x31,0x03,0x40,0x28,0x04,0x00,0x80,0x20,0x0C,0x1E,0x00,0x30,0x01,0x00,0x18,0x03,0x00,0x50,0x1B,0x06,0x1F,0x00, // '3'
0x00,0xC0,0x0A,0x00,0x50,0x04,0x80,0x44,0x02,0x20,0x21,0x02,0x08,0x20,0x41,0x02,0x10,0x11,0xFF,0xF0,0x04,0x00,0x20,0x01,0x00,0x08,0x00,0x40, // '4'
0x3F,0xE4,0x00,0x80,0x20,0x04,0x00,0x80,0x13,0xC3,0x86,0x00,0x40,0x04,0x00,0x80,0x10,0x02,0x80,0x50,0x11,0x06,0x1F,0x00, // '5'
0x07,0x83,0x00,0x80,0x20,0x04,0x01,0x1E,0x2C,0x36,0x02,0x80,0x30,0x06,0x00,0xC0,0x18,0x03,0x80,0xD0,0x11,0x84,0x1F,0x00, // '6'
0xFF,0xE0,0x04,0x01,0x00,0x20,0x08,0x01,0x00,0x40,0x08,0x02,0x00,0x40,0x08,0x02,0x00,0x40,0x10,0x02,0x00,0x80,0x10,0x00, // '7'
0x1F,0x0C,0x1B,0x01,0xC0,0x18,0x03,0x00,0xD8,0x30,0xF8,0x31,0x88,0x0A,0x00,0xC0,0x18,0x03,0x00,0x50,0x13,0x06,0x1F,0x00, // '8'
0x1F,0x04,0x11,0x01,0x60,0x18,0x03,0x00,0x60,0x0C,0x01,0x40,0x6C,0x14,0x7C,0x80,0x10,0x04,0x00,0x80,0x20,0x18,0x1C,0x00, // '9'
0xC0,0x00,0x00,0xC0, // ':'
0xC0,0x00,0x05,0x58, // ';'
0x00,0x00,0x70,0x60,0x60,0x60,0x30,0x03,0x00,0x30,0x03,0x80,0x10, // '<'
0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0, // '='
0x00,0x38,0x01,0x80,0x18,0x01,0x80,0x30,0x30,0x30,0x30,0x30,0x00, // '>'
0x3C,0x42,0x81,0x81,0x81,0x01,0x01,0x02,0x04,0x08,0x10,0x10,0x10,0x00,0x00,0x00,0x18, // '?'
0x01,0xF8,0x00,0xC0,0xC0,0x60,0x04,0x18,0x00,0x42,0x00,0x04,0x81,0xE0,0x90,0x42,0x0C,0x10,0x41,0x84,0x08,0x30,0x81,0x06,0x10,0x20,0xC2,0x04,0x18,0x41,0x03,0x08,0x20,0x61,0x04,0x12,0x11,0x46,0x43,0xC7,0x0C,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0xC0,0x80,0x07,0xE0,0x00, // '@'
0x01,0x00,0x0C,0x00,0x30,0x01,0x20,0x04,0x80,0x21,0x00,0x84,0x02,0x10,0x10,0x20,0x40,0x82,0x02,0x0F,0xFC,0x20,0x11,0x00,0x24,0x00,0x90,0x02,0x80,0x04, // 'A'
0xFE,0x10,0x32,0x03,0x40,0x28,0x05,0x00,0xA0,0x34,0x0C,0xFF,0x10,0x1A,0x01,0x40,0x18,0x03,0x00,0x60,0x1C,0x06,0xFF,0x00, // 'B'
0x0F,0x81,0x83,0x18,0x04,0x80,0x28,0x01,0x40,0x02,0x00,0x10,0x00,0x80,0x04,0x00,0x20,0x01,0x00,0x08,0x01,0x20,0x09,0x80,0x46,0x0C,0x0F,0x80, // 'C'
0xFF,0x08,0x18,0x80,0x48,0x02,0x80,0x28,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x28,0x02,0x80,0x48,0x18,0xFF,0x00, // 'D'
0xFF,0xF0,0x02,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0xFF,0xD0,0x02,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0xFF,0xE0, // 'E'
0xFF,0xF0,0x02,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0xFF,0xD0,0x02,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0x80,0x00, // 'F'
0x0F,0xC1,0x83,0x18,0x04,0x80,0x18,0x00,0xC0,0x02,0x00,0x10,0x00,0x80,0x04,0x0F,0xE0,0x03,0x00,0x1C,0x00,0xA0,0x05,0x80,0x26,0x06,0x0F,0xC0, // 'G'
0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0xFF,0xF8,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x10, // 'H'
0xFF,0xFF,0x80, // 'I'
0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x80,0x60,0x1C,0x09,0x86,0x3E,0x00, // 'J'
0x80,0x24,0x02,0x20,0x21,0x02,0x08,0x20,0x42,0x02,0x20,0x12,0x00,0xA8,0x06,0x20,0x20,0x81,0x02,0x08,0x10,0x40,0x42,0x01,0x10,0x04,0x80,0x10, // 'K'
0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0xFF,0xC0, // 'L'
0x80,0x03,0xC0,0x03,0xC0,0x05,0xA0,0x05,0xA0,0x05,0x90,0x09,0x90,0x09,0x90,0x11,0x88,0x11,0x88,0x21,0x84,0x21,0x84,0x21,0x84,0x41,0x82,0x41,0x82,0x81,0x81,0x81,0x81,0x01, // 'M'
0x80,0x1C,0x01,0xA0,0x1A,0x01,0x90,0x19,0x01,0x88,0x18,0x41,0x84,0x18,0x21,0x81,0x18,0x11,0x80,0x98,0x09,0x80,0x58,0x03,0x80,0x10, // 'N'
0x0F,0x81,0x83,0x18,0x0C,0x80,0x28,0x00,0xC0,0x06,0x00,0x30,0x01,0x80,0x0C,0x00,0x60,0x03,0x00,0x18,0x00,0xA0,0x09,0x80,0xC6,0x0C,0x0F,0x80, // 'O'
0xFF,0x10,0x1A,0x01,0x40,0x18,0x03,0x00,0x60,0x0C,0x03,0x80,0xDF,0xE2,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0x80,0x00, // 'P'
0x0F,0x81,0x83,0x18,0x0C,0x80,0x28,0x00,0xC0,0x06,0x00,0x30,0x01,0x80,0x0C,0x00,0x60,0x03,0x00,0x18,0x01,0x20,0x09,0x80,0x86,0x08,0x0F,0xC0,0x01,0x00,0x08,0x00,0x20, // 'Q'
0xFF,0x08,0x0C,0x80,0x48,0x02,0x80,0x28,0x02,0x80,0x28,0x04,0x80,0xCF,0xF0,0x81,0x08,0x10,0x80,0x88,0x04,0x80,0x48,0x02,0x80,0x10, // 'R'
0x1F,0x86,0x0C,0xC0,0x28,0x01,0x80,0x18,0x00,0x40,0x03,0x00,0x0E,0x00,0x1C,0x00,0x20,0x01,0x80,0x18,0x01,0x40,0x36,0x06,0x1F,0x80, // 'S'
0x7F,0xFC,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00, // 'T'
0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x03,0x40,0x23,0x0C,0x1F,0x80, // 'U'
0x80,0x05,0x00,0x24,0x00,0x90,0x02,0x20,0x10,0x80,0x41,0x01,0x04,0x08,0x10,0x20,0x21,0x00,0x84,0x02,0x10,0x04,0x80,0x12,0x00,0x28,0x00,0xC0,0x01,0x00, // 'V'
0x40,0x20,0x09,0x00,0xC0,0x24,0x05,0x01,0x10,0x14,0x04,0x20,0x48,0x10,0x81,0x20,0x42,0x08,0x82,0x08,0x21,0x08,0x10,0x84,0x20,0x44,0x11,0x01,0x10,0x44,0x02,0x40,0x90,0x0A,0x02,0x40,0x28,0x0A,0x00,0xA0,0x18,0x01,0x80,0x60,0x04,0x00,0x80, // 'W'
0x40,0x08,0x80,0x42,0x01,0x04,0x08,0x08,0x40,0x11,0x00,0x48,0x00,0xC0,0x01,0x00,0x0C,0x00,0x48,0x02,0x10,0x08,0x40,0x40,0x82,0x01,0x10,0x02,0x40,0x08, // 'X'
0x40,0x04,0x80,0x08,0x80,0x20,0x80,0x81,0x01,0x01,0x04,0x02,0x10,0x02,0x20,0x02,0x80,0x05,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00, // 'Y'
0xFF,0xF0,0x01,0x00,0x08,0x00,0x80,0x08,0x00,0x40,0x04,0x00,0x40,0x04,0x00,0x20,0x02,0x00,0x20,0x02,0x00,0x10,0x01,0x00,0x10,0x00,0xFF,0xF0, // 'Z'
0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF0, // '['
0x40,0x20,0x10,0x04,0x02,0x01,0x00,0x40,0x20,0x08,0x04,0x02,0x00,0x80,0x40,0x10,0x08,0x04,0x01,0x00,0x80,0x00, // '\'
0xF1,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0xF0, // ']'
0x10,0x18,0x28,0x24,0x44,0x44,0x42,0x82,0x81, // '^'
0x7F,0xE0, // '_'
0x42,0x20, // '`'
0x3F,0x0C,0x12,0x01,0x00,0x20,0x04,0x3F,0x98,0x16,0x02,0x80,0x50,0x0A,0x03,0x20,0xA3,0xE4, // 'a'
0x80,0x20,0x08,0x02,0x00,0x80,0x27,0x8A,0x1B,0x02,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x18,0x07,0x02,0xA1,0xA7,0x80, // 'b'
0x1F,0x08,0x64,0x0F,0x01,0x80,0x60,0x08,0x02,0x00,0x80,0x20,0x14,0x04,0x86,0x1F,0x00, // 'c'
0x00,0x40,0x10,0x04,0x01,0x00,0x47,0x96,0x15,0x03,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x18,0x05,0x03,0x61,0x47,0x90, // 'd'
0x1E,0x08,0x64,0x0A,0x01,0x80,0x7F,0xF8,0x02,0x00,0x80,0x30,0x04,0x00,0xC2,0x1F,0x00, // 'e'
0x07,0x04,0x04,0x02,0x01,0x00,0x81,0xF8,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x00, // 'f'
0x1E,0x58,0x54,0x0E,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x14,0x0D,0x85,0x1E,0x40,0x10,0x05,0x02,0x21,0x87,0x80, // 'g'
0x80,0x40,0x20,0x10,0x08,0x04,0xF2,0x85,0x81,0xC0,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x40, // 'h'
0x40,0x04,0x92,0x49,0x24,0x92,0x40, // 'i'
0x08,0x00,0x00,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x13,0x80, // 'j'
0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x28,0x12,0x08,0x8C,0x24,0x0A,0x03,0x40,0x88,0x21,0x08,0x22,0x08,0x81,0x20,0x20, // 'k'
0xFF,0xFF,0xC0, // 'l'
0x9E,0x1E,0x50,0x90,0xB0,0x30,0x38,0x10,0x18,0x08,0x0C,0x04,0x06,0x02,0x03,0x01,0x01,0x80,0x80,0xC0,0x40,0x60,0x20,0x30,0x10,0x18,0x08,0x08, // 'm'
0x9E,0x50,0xB0,0x38,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x08, // 'n'
0x1F,0x06,0x31,0x01,0x60,0x38,0x03,0x00,0x60,0x0C,0x01,0x80,0x38,0x0D,0x01,0x10,0x41,0xF0, // 'o'
0x9E,0x28,0x6C,0x0A,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x3C,0x0A,0x86,0x9E,0x20,0x08,0x02,0x00,0x80,0x20,0x00, // 'p'
0x1E,0x58,0x54,0x0E,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x14,0x0D,0x85,0x1E,0x40,0x10,0x04,0x01,0x00,0x40,0x10, // 'q'
0x9D,0x43,0x04,0x08,0x10,0x20,0x40,0x81,0x02,0x04,0x08,0x00, // 'r'
0x3E,0x21,0xA0,0x30,0x18,0x02,0x00,0xF0,0x06,0x00,0xC0,0x60,0x28,0x23,0xE0, // 's'
0x10,0x10,0x10,0x10,0x7E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x0E, // 't'
0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x68,0x53,0xC8, // 'u'
0x80,0x28,0x09,0x01,0x10,0x22,0x08,0x41,0x04,0x20,0x88,0x11,0x01,0x40,0x28,0x03,0x00,0x40, // 'v'
0x40,0x40,0x90,0x30,0x24,0x0C,0x10,0x85,0x04,0x21,0x21,0x08,0x48,0x41,0x22,0x20,0x48,0x48,0x12,0x12,0x05,0x05,0x00,0xC0,0xC0,0x30,0x30,0x08,0x04,0x00, // 'w'
0x40,0x44,0x08,0x82,0x08,0x80,0xA0,0x0C,0x01,0x00,0x50,0x09,0x02,0x20,0x82,0x10,0x24,0x04, // 'x'
0x80,0x24,0x02,0x40,0x42,0x04,0x20,0x82,0x08,0x10,0x81,0x10,0x09,0x00,0xA0,0x0A,0x00,0x60,0x04,0x00,0x40,0x04,0x00,0x80,0x08,0x07,0x00, // 'y'
0xFF,0x80,0x20,0x10,0x08,0x04,0x01,0x00,0x80,0x40,0x20,0x08,0x04,0x02,0x00,0xFF,0xC0, // 'z'
0x00,0x06,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0xC0,0x60,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x04,0x02, // '{'
0xFF,0xFF,0xF0, // '|'
0x00,0x60,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x03,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x40 // '}'
};
const GFXglyph Roboto_Thin_24Glyphs[] PROGMEM = {
// bitmapOffset, width, height, xAdvance, xOffset, yOffset
{ 0, 1, 1, 7, 0, 0 }, // ' '
{ 1, 3, 17, 6, 1, -17 }, // '!'
{ 8, 3, 5, 7, 2, -18 }, // '"'
{ 10, 14, 17, 14, 0, -17 }, // '#'
{ 40, 10, 23, 14, 1, -20 }, // '$'
{ 69, 15, 17, 18, 1, -17 }, // '%'
{ 101, 13, 17, 15, 1, -17 }, // '&'
{ 129, 1, 5, 6, 2, -18 }, // '''
{ 130, 6, 26, 9, 2, -20 }, // '('
{ 150, 6, 26, 9, 0, -20 }, // ')'
{ 170, 11, 10, 12, 0, -17 }, // '*'
{ 184, 13, 12, 15, 0, -14 }, // '+'
{ 204, 2, 5, 6, 1, -2 }, // ','
{ 206, 7, 1, 8, 0, -8 }, // '-'
{ 207, 3, 1, 6, 1, -1 }, // '.'
{ 208, 9, 19, 10, 0, -17 }, // '/'
{ 230, 10, 17, 13, 1, -17 }, // '0'
{ 252, 6, 17, 14, 2, -17 }, // '1'
{ 265, 11, 17, 14, 1, -17 }, // '2'
{ 289, 11, 17, 14, 1, -17 }, // '3'
{ 313, 13, 17, 14, 0, -17 }, // '4'
{ 341, 11, 17, 14, 1, -17 }, // '5'
{ 365, 11, 17, 15, 2, -17 }, // '6'
{ 389, 11, 17, 14, 1, -17 }, // '7'
{ 413, 11, 17, 14, 1, -17 }, // '8'
{ 437, 11, 17, 15, 1, -17 }, // '9'
{ 461, 2, 13, 5, 1, -13 }, // ':'
{ 465, 2, 16, 6, 1, -13 }, // ';'
{ 469, 10, 10, 14, 1, -13 }, // '<'
{ 482, 11, 6, 14, 1, -11 }, // '='
{ 491, 10, 10, 13, 1, -13 }, // '>'
{ 504, 8, 17, 11, 1, -17 }, // '?'
{ 521, 19, 22, 23, 2, -17 }, // '@'
{ 574, 14, 17, 15, 0, -17 }, // 'A'
{ 604, 11, 17, 15, 2, -17 }, // 'B'
{ 628, 13, 17, 17, 2, -17 }, // 'C'
{ 656, 12, 17, 17, 2, -17 }, // 'D'
{ 682, 11, 17, 15, 2, -17 }, // 'E'
{ 706, 11, 17, 15, 2, -17 }, // 'F'
{ 730, 13, 17, 18, 2, -17 }, // 'G'
{ 758, 12, 17, 17, 2, -17 }, // 'H'
{ 784, 1, 17, 8, 3, -17 }, // 'I'
{ 787, 10, 17, 14, 1, -17 }, // 'J'
{ 809, 13, 17, 16, 2, -17 }, // 'K'
{ 837, 10, 17, 13, 2, -17 }, // 'L'
{ 859, 16, 17, 21, 2, -17 }, // 'M'
{ 893, 12, 17, 17, 2, -17 }, // 'N'
{ 919, 13, 17, 18, 2, -17 }, // 'O'
{ 947, 11, 17, 15, 2, -17 }, // 'P'
{ 971, 13, 20, 18, 2, -17 }, // 'Q'
{ 1004, 12, 17, 17, 2, -17 }, // 'R'
{ 1030, 12, 17, 15, 1, -17 }, // 'S'
{ 1056, 15, 17, 16, 0, -17 }, // 'T'
{ 1088, 12, 17, 17, 2, -17 }, // 'U'
{ 1114, 14, 17, 15, 0, -17 }, // 'V'
{ 1144, 22, 17, 23, 0, -17 }, // 'W'
{ 1191, 14, 17, 15, 0, -17 }, // 'X'
{ 1221, 15, 17, 16, 0, -17 }, // 'Y'
{ 1253, 13, 17, 15, 1, -17 }, // 'Z'
{ 1281, 4, 23, 6, 2, -19 }, // '['
{ 1293, 9, 19, 10, 0, -17 }, // '\'
{ 1315, 4, 23, 7, 0, -19 }, // ']'
{ 1327, 8, 9, 11, 1, -17 }, // '^'
{ 1336, 11, 1, 11, -1, 0 }, // '_'
{ 1338, 4, 3, 7, 1, -18 }, // '`'
{ 1340, 11, 13, 14, 1, -13 }, // 'a'
{ 1358, 10, 18, 14, 2, -18 }, // 'b'
{ 1381, 10, 13, 13, 1, -13 }, // 'c'
{ 1398, 10, 18, 14, 1, -18 }, // 'd'
{ 1421, 10, 13, 13, 1, -13 }, // 'e'
{ 1438, 9, 19, 9, 0, -19 }, // 'f'
{ 1460, 10, 18, 14, 1, -13 }, // 'g'
{ 1483, 9, 18, 14, 2, -18 }, // 'h'
{ 1504, 3, 17, 6, 1, -17 }, // 'i'
{ 1511, 6, 22, 6, -2, -17 }, // 'j'
{ 1528, 10, 18, 13, 2, -18 }, // 'k'
{ 1551, 1, 18, 6, 2, -18 }, // 'l'
{ 1554, 17, 13, 22, 2, -13 }, // 'm'
{ 1582, 9, 13, 14, 2, -13 }, // 'n'
{ 1597, 11, 13, 14, 1, -13 }, // 'o'
{ 1615, 10, 18, 14, 2, -13 }, // 'p'
{ 1638, 10, 18, 14, 1, -13 }, // 'q'
{ 1661, 7, 13, 9, 2, -13 }, // 'r'
{ 1673, 9, 13, 12, 1, -13 }, // 's'
{ 1688, 8, 17, 9, 0, -17 }, // 't'
{ 1705, 9, 13, 14, 2, -13 }, // 'u'
{ 1720, 11, 13, 12, 0, -13 }, // 'v'
{ 1738, 18, 13, 19, 0, -13 }, // 'w'
{ 1768, 11, 13, 12, 0, -13 }, // 'x'
{ 1786, 12, 18, 12, 0, -13 }, // 'y'
{ 1813, 10, 13, 12, 1, -13 }, // 'z'
{ 1830, 8, 25, 9, 1, -19 }, // '{'
{ 1855, 1, 20, 6, 2, -17 }, // '|'
{ 1858, 8, 25, 9, -1, -19 } // '}'
};
const GFXfont Roboto_Thin_24 PROGMEM = {
(uint8_t *)Roboto_Thin_24Bitmaps,(GFXglyph *)Roboto_Thin_24Glyphs,0x20, 0x7D, 29};

+ 199
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Satisfy_24.h 查看文件

@@ -0,0 +1,199 @@
// Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const uint8_t Satisfy_24Bitmaps[] PROGMEM = {

// Bitmap Data:
0x00, // ' '
0x06,0x06,0x0E,0x0E,0x0C,0x0C,0x0C,0x1C,0x18,0x18,0x18,0x18,0x30,0x30,0x30,0x00,0x00,0x70,0x60, // '!'
0x00,0x33,0x36,0x36,0x26,0x66,0x6C,0x6C,0x00, // '"'
0x00,0x00,0x66,0x06,0x40,0x4C,0x3F,0xF0,0x88,0x09,0x81,0x90,0x7F,0xE1,0x30,0x33,0x03,0x60,0x00,0x00, // '#'
0x02,0x01,0x03,0xC3,0x31,0x19,0x8C,0xC4,0x30,0x18,0x04,0x03,0x00,0x8C,0x66,0x31,0x30,0xF0,0x30,0x10,0x00, // '$'
0x00,0x00,0x0E,0x06,0x1A,0x0C,0x3B,0x18,0x33,0x10,0x33,0x30,0x32,0x60,0x36,0x40,0x1C,0xC0,0x01,0x80,0x01,0x00,0x03,0x78,0x06,0xCC,0x0C,0xCC,0x0D,0x8C,0x19,0x8C,0x31,0x98,0x31,0x98,0x60,0xE0, // '%'
0x00,0x70,0x04,0x80,0x44,0x06,0x60,0x36,0x01,0xE0,0x0F,0x00,0x70,0x07,0x00,0x78,0x07,0xC0,0x36,0x03,0x30,0x39,0xC1,0x8E,0x0C,0x32,0x61,0xE3,0x8E,0x0F,0xF0,0x00,0x40, // '&'
0x01,0x8C,0x62,0x31,0x8C,0x00, // '''
0x00,0x02,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x20,0x60,0x60,0x60,0x60,0x40,0xC0,0xC0,0xC0,0xC0,0xC0,0x40,0x40,0x40,0x00, // '('
0x00,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x06,0x06,0x06,0x04,0x0C,0x0C,0x08,0x18,0x10,0x30,0x60,0x40,0x80, // ')'
0x00,0x0C,0x4C,0x6B,0x3F,0x18,0x7C,0x66,0x24, // '*'
0x06,0x01,0x80,0x60,0x10,0x7F,0x83,0x00,0xC0,0x20,0x00,0x00, // '+'
0x6E,0x64,0xC0, // ','
0x7F,0x80,0x00, // '-'
0x0E,0xE0, // '.'
0x00,0x00,0x01,0x80,0x18,0x00,0xC0,0x0C,0x00,0x60,0x06,0x00,0x20,0x03,0x00,0x10,0x01,0x80,0x18,0x00,0xC0,0x0C,0x00,0x60,0x06,0x00,0x30,0x03,0x00,0x18,0x00, // '/'
0x07,0x01,0xB0,0x62,0x08,0x63,0x0C,0x41,0x98,0x33,0x06,0x60,0xD8,0x1B,0x07,0x60,0xCC,0x19,0x83,0x30,0xC6,0x18,0x46,0x0D,0x80,0xE0,0x00, // '0'
0x0C,0x38,0x70,0x60,0xC3,0x06,0x0C,0x18,0x20,0xC1,0x83,0x04,0x18,0x30,0x60,0xC0,0x00, // '1'
0x03,0xC0,0x8C,0x31,0x8C,0x31,0x86,0x30,0xC0,0x30,0x06,0x01,0x80,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xFF,0x8F,0xF1,0x02,0x00, // '2'
0x07,0x83,0x98,0x61,0x98,0x33,0x06,0x71,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x7C,0x00,0xC0,0x18,0x03,0x00,0x66,0x18,0xC3,0x1C,0xC0,0xF0,0x00, // '3'
0x00,0x00,0x38,0x0F,0x01,0x40,0x68,0x1B,0x06,0x61,0x8C,0x31,0x0C,0x21,0xFE,0x3F,0xC0,0x30,0x04,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x00, // '4'
0x00,0x00,0xFF,0x0F,0xF0,0x80,0x08,0x01,0x80,0x10,0x01,0x38,0x3F,0xC3,0x8C,0x38,0xC0,0x0C,0x00,0x80,0x08,0x21,0x86,0x10,0x73,0x07,0xE0,0x38,0x00, // '5'
0x03,0x83,0x60,0x98,0x66,0x31,0x8C,0x06,0x01,0xBC,0x79,0x3C,0x6F,0x1B,0x06,0xC1,0xB0,0xEC,0x33,0x0C,0x46,0x19,0x03,0x80, // '6'
0x3F,0xDC,0x34,0x0C,0x06,0x03,0x80,0xC0,0x60,0x38,0x0C,0x07,0x01,0x80,0xE0,0x30,0x1C,0x06,0x01,0x80,0x60,0x18,0x00,0x00, // '7'
0x03,0xC0,0x8C,0x21,0x8C,0x31,0x8E,0x31,0x87,0x70,0xFC,0x0F,0x03,0xE0,0xDC,0x39,0xC6,0x19,0x83,0x30,0x66,0x0C,0xC3,0x08,0xC0,0xF0,0x00, // '8'
0x07,0x03,0x61,0x8C,0xC3,0x30,0xD8,0x36,0x1D,0x87,0x61,0xD8,0xE6,0x29,0xD6,0x39,0x80,0xC0,0x32,0x18,0xCE,0x3F,0x07,0x00, // '9'
0x01,0xCC,0x00,0x03,0x9C, // ':'
0x01,0x9C,0x00,0x03,0x9C,0x62,0x00, // ';'
0x03,0x07,0x07,0x07,0x07,0x03,0x00,0xC0,0x60,0x18,0x0C,0x00, // '<'
0x3F,0xC8,0x00,0x01,0xFE,0x00,0x00, // '='
0x18,0x0C,0x0C,0x06,0x07,0x07,0x0E,0x18,0x30,0x60, // '>'
0x07,0xC0,0xE3,0x06,0x0C,0x70,0x61,0x83,0x00,0x38,0x01,0x80,0x1C,0x01,0xC0,0x7C,0x07,0x80,0x30,0x01,0x80,0x1C,0x00,0xC0,0x04,0x00,0x00,0x03,0x80,0x1C,0x00, // '?'
0x00,0xF8,0x03,0x87,0x03,0x00,0xC3,0x0F,0x61,0x1B,0x99,0x99,0xCD,0x98,0xE6,0xCC,0x23,0x6C,0x11,0xB6,0x18,0xDB,0x08,0xCD,0x8C,0x66,0x7E,0x61,0x83,0x70,0x61,0xE0,0x1E,0x00,0x00,0x00,0x00, // '@'
0x00,0x1C,0x00,0x4C,0x01,0x18,0x06,0x30,0x18,0x60,0x31,0x80,0xC3,0x01,0x86,0x03,0x0C,0x0C,0x38,0x18,0x60,0x30,0xC0,0xFF,0xA7,0xFF,0x9F,0x06,0x0C,0x18,0x18,0x30,0x70,0x60,0xE0,0xC1,0x81,0x87,0x03,0x0C,0x07,0x00,0x0E,0x00,0x00, // 'A'
0x00,0x00,0x03,0xF0,0x0F,0x0C,0x1F,0x0E,0x1F,0x0E,0x06,0x0E,0x06,0x0E,0x06,0x0C,0x0C,0x1C,0x0C,0x18,0x0C,0x30,0x0F,0xE0,0x1F,0xB0,0x18,0x18,0x18,0x18,0x38,0x18,0x30,0x1C,0x30,0x18,0x30,0x38,0x70,0x30,0x70,0x70,0x61,0xC0,0x3F,0x00, // 'B'
0x00,0xF0,0x0C,0x60,0x61,0x83,0x06,0x18,0x1C,0x40,0xE3,0x03,0x8C,0x1C,0x60,0x01,0x80,0x06,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x01,0x06,0x08,0x18,0x60,0x7F,0x00,0x70,0x00, // 'C'
0x07,0xC0,0x3F,0xE0,0x60,0xE0,0x80,0xC0,0x60,0xC1,0xC1,0x83,0x03,0x06,0x06,0x0C,0x0C,0x18,0x1C,0x70,0x30,0xC0,0x61,0x80,0xC3,0x03,0x8E,0x06,0x18,0x1C,0x30,0x30,0x60,0xC1,0x83,0x83,0x0E,0x0E,0x30,0x0F,0x80,0x00, // 'D'
0x00,0xF8,0x0E,0x30,0x60,0xC3,0x03,0x1C,0x1C,0x60,0x61,0x83,0x86,0x00,0x1C,0x00,0x30,0x00,0x7C,0x07,0xE0,0x38,0x01,0xC0,0x06,0x00,0x38,0x04,0xE0,0x13,0x80,0x8E,0x06,0x1C,0x30,0x3F,0x80,0x7C,0x00, // 'E'
0x07,0xF0,0xE0,0x66,0x01,0xD8,0x06,0x7C,0x19,0xE0,0x40,0x03,0x00,0x0C,0x00,0x60,0x01,0x83,0xFF,0x88,0x30,0x01,0x80,0x06,0x00,0x30,0x00,0xC0,0x07,0x00,0x18,0x00,0x60,0x03,0x80,0x0E,0x00,0x38,0x00,0x00,0x00, // 'F'
0x00,0xF0,0x0C,0x40,0x61,0x83,0x06,0x18,0x18,0x60,0xE3,0x07,0x0C,0x1C,0x70,0x01,0x80,0x06,0x00,0x38,0xFE,0xC7,0xFB,0x00,0xCC,0x03,0x30,0x18,0xC0,0x63,0x03,0x04,0x0C,0x18,0x60,0x23,0x00,0x78,0x00, // 'G'
0x00,0x00,0x03,0x00,0x01,0x80,0xC1,0xC0,0xE0,0xC0,0x60,0x60,0x30,0x30,0x38,0x18,0x18,0x18,0x0C,0x0C,0x0E,0x06,0x06,0x03,0xFF,0xC7,0xF1,0xC1,0x9D,0x80,0xC6,0xC0,0x61,0xE0,0x70,0x70,0x38,0x30,0x18,0x18,0x0C,0x0C,0x06,0x06,0x07,0x03,0x03,0x83,0x80, // 'H'
0x00,0x1C,0x00,0xF8,0x03,0xB0,0x06,0x60,0x1C,0xC0,0x33,0x80,0x67,0x00,0xCC,0x01,0x98,0x03,0x70,0x02,0xE0,0x05,0x80,0x03,0x01,0xFF,0xCF,0x98,0x38,0x30,0xC0,0x61,0x81,0x83,0x03,0x03,0x0C,0x07,0x30,0x03,0xC0,0x00, // 'I'
0x01,0xFF,0x00,0x8C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x18,0x03,0x8C,0x03,0xC6,0x03,0x87,0x01,0x83,0x01,0xC1,0x80,0xC1,0xC0,0x60,0xC0,0x30,0x60,0x18,0x60,0x06,0x60,0x01,0xE0,0x00, // 'J'
0x00,0x00,0x06,0x08,0x0C,0x38,0x38,0x60,0x60,0xC0,0xC3,0x83,0x86,0x06,0x1C,0x0C,0x30,0x18,0xC0,0x63,0x00,0xCC,0x01,0xF0,0x07,0xF8,0x0E,0x38,0x18,0x30,0x30,0x60,0x60,0xC0,0xC3,0x03,0x86,0x07,0x18,0x0E,0x30,0x18,0x60,0x00,0x60,0x00,0x78, // 'K'
0x00,0x0F,0x00,0x1F,0x00,0x3B,0x00,0x33,0x00,0x76,0x00,0x6E,0x00,0x7C,0x00,0x70,0x0F,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x3E,0x00,0x6F,0x04,0x7F,0x8C,0x79,0xFC,0x00,0x78, // 'L'
0x00,0x30,0x30,0x07,0x83,0x80,0x3C,0x3C,0x01,0xE1,0xE0,0x1B,0x0B,0x00,0xD8,0xD0,0x06,0xC5,0x80,0x76,0x6C,0x03,0x72,0x60,0x1B,0x33,0x00,0xD9,0x30,0x0E,0xD9,0x83,0x66,0xCC,0x13,0x34,0x61,0x99,0xE7,0x09,0xCE,0x30,0xCC,0x71,0x86,0x63,0x8C,0x33,0x0C,0x61,0xB8,0x07,0x07,0x80,0x1C,0x1C,0x00,0xF0, // 'M'
0x00,0x00,0x0C,0x06,0x0C,0x0D,0x0E,0x19,0x1E,0x1B,0x16,0x1B,0x16,0x36,0x16,0x7C,0x16,0x30,0x26,0x20,0x26,0x20,0x26,0x20,0x26,0x60,0x66,0x60,0x46,0x60,0x46,0x40,0x46,0x40,0xC7,0xC0,0xC7,0xC0,0xC3,0x80,0xC3,0x80,0xC3,0x80,0xC1,0x00, // 'N'
0x01,0xE0,0x1F,0x81,0xCC,0x1C,0x30,0xC1,0x8C,0x0C,0x60,0x67,0x03,0x30,0x19,0x80,0xDC,0x06,0xC0,0x36,0x03,0x30,0x19,0x80,0xCC,0x06,0x60,0x63,0x03,0x18,0x30,0x43,0x03,0x30,0x0F,0x00, // 'O'
0x01,0xF8,0x07,0x0C,0x1F,0x06,0x1B,0x06,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x04,0x0C,0x0C,0x1C,0x0C,0x38,0x0C,0x70,0x0F,0xC0,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x38,0x00,0x30,0x00,0x30,0x00,0x70,0x00,0x60,0x00, // 'P'
0x01,0xE0,0x31,0x83,0x0C,0x38,0x31,0x81,0x9C,0x0C,0xC0,0x6E,0x03,0x70,0x1B,0x00,0xD8,0x0E,0xC0,0x66,0x03,0x30,0x39,0x81,0x8E,0x0C,0x38,0xC0,0x06,0x0F,0xE0,0xE7,0x06,0x7C,0x3E,0x38, // 'Q'
0x01,0xF8,0x07,0x0C,0x1F,0x06,0x1B,0x06,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x06,0x0C,0x0C,0x1C,0x0C,0x38,0x1F,0x70,0x1D,0xC0,0x1F,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x38,0xC0,0x38,0xE0,0x30,0xE0,0x70,0x60,0x60,0x60,0x00,0x78,0x00,0x30, // 'R'
0x00,0x00,0x07,0xC0,0x71,0x81,0x82,0x0C,0x18,0x30,0x61,0xC1,0x83,0x0E,0x0C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0x80,0x07,0x00,0x0C,0x00,0x30,0x00,0xC1,0x83,0x06,0x0C,0x18,0x30,0x61,0x81,0xCE,0x03,0xF0,0x02,0x00, // 'S'
0x00,0x03,0xFF,0xDC,0xC0,0x06,0x00,0x70,0x03,0x00,0x18,0x00,0xC0,0x0E,0x00,0x60,0x03,0x00,0x18,0x00,0xC0,0x0C,0x00,0x60,0x03,0x00,0x18,0x01,0xC0,0x0E,0x00,0x60,0x03,0x00,0x18,0x01,0xC0,0x00, // 'T'
0x00,0x00,0x18,0x18,0x70,0x70,0xE0,0xE1,0x81,0x87,0x07,0x0E,0x0E,0x18,0x18,0x30,0x30,0xE0,0xE1,0x81,0x83,0x03,0x06,0x06,0x1C,0x0C,0x30,0x30,0x60,0x60,0xC0,0xC1,0x83,0x83,0x07,0x06,0x1E,0x06,0x6C,0x0F,0x18,0x00, // 'U'
0x00,0x01,0x81,0x9C,0x0C,0xC0,0xE6,0x06,0x30,0x71,0x83,0x18,0x18,0xC1,0xC6,0x0C,0x30,0x61,0x87,0x0C,0x30,0x61,0x83,0x0C,0x18,0xC0,0xC6,0x06,0x20,0x33,0x00,0x98,0x07,0x80,0x3C,0x00,0xC0,0x00, // 'V'
0x06,0x00,0x60,0xC1,0x06,0x0C,0x30,0x61,0x83,0x06,0x18,0x70,0x63,0x87,0x06,0x30,0x70,0x63,0x07,0x06,0x30,0x60,0x66,0x06,0x0C,0x60,0x60,0xC6,0x0E,0x0C,0x60,0xE0,0xC6,0x0E,0x18,0x61,0xE1,0x86,0x1E,0x18,0x61,0x61,0x06,0x36,0x30,0x62,0x62,0x06,0x67,0x40,0x3C,0x3C,0x01,0x83,0x80, // 'W'
0x06,0x00,0xC1,0x60,0x78,0x66,0x0C,0x08,0xC3,0x01,0x98,0xE0,0x3F,0x18,0x03,0xA6,0x00,0x05,0xC0,0x00,0xF0,0x00,0x1C,0x00,0x03,0x80,0x00,0x60,0x00,0x1C,0x00,0x07,0x80,0x00,0xF0,0x00,0x36,0x00,0x06,0x40,0x01,0x8C,0x00,0x71,0x80,0x0C,0x30,0x83,0x83,0x20,0xE0,0x78,0x00,0x00,0x00, // 'X'
0x00,0x0C,0x70,0x71,0xC1,0x86,0x06,0x18,0x18,0xE0,0xE3,0x03,0x0C,0x0C,0x30,0x31,0xC1,0xC6,0x06,0x18,0x38,0x60,0xE1,0x87,0x87,0x34,0x0F,0x30,0x00,0xC0,0x03,0x00,0x18,0x10,0x60,0x63,0x03,0xF8,0x07,0xC0,0x00, // 'Y'
0x07,0xFC,0x3F,0xF0,0xC0,0xC0,0x07,0x00,0x18,0x00,0xE0,0x03,0x00,0x18,0x00,0xC0,0x07,0x00,0x38,0x00,0xC0,0x06,0x00,0x30,0x01,0xC0,0x0E,0x00,0x30,0x01,0x80,0x06,0x00,0x37,0xF8,0xFF,0xE1,0x01,0x00, // 'Z'
0x03,0x80,0x80,0x60,0x18,0x04,0x01,0x00,0xC0,0x30,0x08,0x02,0x01,0x80,0x60,0x10,0x04,0x03,0x00,0xC0,0x30,0x08,0x02,0x01,0x80,0x60,0x18,0x07,0x00, // '['
0x01,0x86,0x18,0x60,0x82,0x08,0x30,0xC3,0x0C,0x10,0x41,0x86,0x18,0x61,0xC0, // '\'
0x03,0x80,0xC0,0x60,0x30,0x10,0x18,0x0C,0x06,0x02,0x01,0x01,0x80,0xC0,0x60,0x20,0x30,0x18,0x0C,0x04,0x06,0x03,0x01,0x01,0x81,0xC0, // ']'
0x06,0x07,0x83,0xC3,0x61,0x31,0x99,0x8C,0xC6,0xC3,0x00,0x00, // '^'
0x7F,0xF7,0xFF,0x80,0x00, // '_'
0x47,0x0C,0x00, // '`'
0x00,0x00,0x3C,0x01,0xB0,0x0C,0x40,0x31,0x01,0x8C,0x26,0x31,0x38,0xCC,0xEE,0x61,0xEF,0x07,0x18,0x00, // 'a'
0x00,0x00,0xC0,0x06,0x00,0x70,0x03,0x80,0x1C,0x01,0xE0,0x0E,0x00,0x70,0x03,0x30,0x39,0x8D,0xCF,0x8C,0x20,0x63,0x03,0x18,0x19,0x80,0xC8,0x03,0x80,0x00, // 'b'
0x1C,0x03,0x20,0x66,0x06,0x60,0xC0,0x0C,0x02,0xC0,0x4C,0x0C,0xC1,0x86,0x30,0x3C,0x00, // 'c'
0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0xE0,0x03,0x80,0x0E,0x03,0x30,0x33,0xC1,0x8F,0x06,0x38,0x38,0x60,0xC3,0x07,0x0C,0x2C,0x31,0xB1,0xCC,0xCB,0x61,0xCE,0x00, // 'd'
0x07,0x01,0xB0,0x13,0x03,0x20,0x66,0x06,0xC1,0x70,0x26,0x06,0x60,0xC3,0x10,0x1E,0x00, // 'e'
0x07,0x00,0x38,0x01,0xC0,0x0E,0x00,0x60,0x03,0x00,0x18,0x00,0x80,0x0C,0x00,0x60,0x03,0x3C,0x1E,0x01,0x80,0x1C,0x00,0x60,0x03,0x80,0x36,0x01,0xB0,0x08,0xC0,0x46,0x06,0x30,0x31,0x81,0x9C,0x08,0xC0,0xCE,0x06,0xE0,0x3E,0x01,0xE0,0x06,0x00,0x00, // 'f'
0x1C,0x00,0xCE,0x06,0x38,0x18,0xE0,0xC3,0x03,0x04,0x0C,0x30,0xB0,0xC4,0xC7,0x23,0x1F,0x07,0xB8,0x01,0x80,0x0E,0x00,0x58,0x03,0x40,0x1B,0x00,0xCC,0x03,0x30,0x0C,0xC0,0x32,0x00,0xD8,0x01,0xE0,0x03,0x00,0x00, // 'g'
0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x60,0x01,0x80,0x06,0xE0,0x17,0x80,0xF7,0x03,0x98,0x0C,0x60,0x31,0x8C,0x8C,0x66,0x33,0x18,0xD8,0x63,0xC1,0x86,0x00, // 'h'
0x00,0x18,0x10,0x00,0x00,0x00,0x00,0x10,0x60,0x60,0xE0,0xC1,0xC3,0xC6,0xCC,0xD8,0x70, // 'i'
0x00,0x40,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x80,0x0E,0x00,0x30,0x40,0xC2,0x03,0x18,0x1C,0xC0,0x66,0x01,0xA0,0x07,0x00,0x38,0x01,0xE0,0x0D,0x00,0x7C,0x01,0xB0,0x0C,0xC0,0x32,0x00,0xD8,0x03,0x40,0x07,0x00,0x00, // 'j'
0x00,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x20,0x01,0x80,0x06,0x00,0x19,0x80,0x5E,0x03,0xD8,0x0E,0x60,0x31,0x00,0xB8,0x02,0xF0,0x98,0xC4,0x63,0x31,0x0D,0x84,0x38,0x00, // 'k'
0x0C,0x18,0x30,0x61,0xC3,0x06,0x0C,0x18,0x60,0xC1,0x83,0x0C,0x18,0x30,0x60,0xC0, // 'l'
0x03,0x9C,0x03,0x7B,0xC0,0x39,0xEC,0x07,0x1C,0xC0,0x71,0x8C,0x26,0x11,0xC2,0x63,0x18,0x46,0x31,0x88,0xC3,0x19,0x0C,0x61,0xE0,0x00,0x00,0x00, // 'm'
0x33,0x00,0xDE,0x03,0x98,0x0C,0x60,0x61,0x89,0x8C,0x26,0x31,0x18,0xCC,0xC3,0x63,0x0E,0x00, // 'n'
0x1C,0x01,0xF0,0x18,0x80,0xC4,0x2E,0x36,0x79,0xE3,0x7C,0x18,0xC0,0xC6,0x06,0x60,0x1E,0x00, // 'o'
0x00,0x00,0x06,0x60,0x07,0xF0,0x07,0x30,0x0E,0x30,0x0C,0x31,0x0C,0x72,0x08,0x66,0x1E,0xC4,0x1F,0xD8,0x1F,0xF0,0x18,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00, // 'p'
0x1C,0xC1,0x9C,0x18,0xE0,0xC7,0x0C,0x18,0x61,0x83,0x0C,0x18,0x62,0xC7,0x26,0x33,0x1E,0xB0,0x0F,0x00,0x70,0x03,0x00,0x30,0x01,0x80,0x1C,0x00,0xE0,0x07,0x00,0x38,0x00,0xC0,0x00, // 'q'
0x06,0x00,0x1C,0x00,0x38,0x00,0x7C,0x00,0xCC,0x03,0x18,0x04,0x71,0x18,0xC2,0x23,0x08,0xC6,0x21,0x0C,0x80,0x0E,0x00, // 'r'
0x00,0x38,0xE1,0xC3,0x8F,0x13,0x46,0x06,0xC9,0x91,0xC0, // 's'
0x00,0x00,0x18,0x00,0xC0,0x0E,0x07,0xFF,0x03,0x00,0x38,0x01,0xC0,0x0C,0x00,0x60,0x03,0x00,0x30,0x01,0x82,0x0C,0x10,0x41,0x02,0x10,0x19,0x00,0x70,0x00, // 't'
0x00,0x80,0x63,0x01,0xC6,0x03,0x1C,0x06,0x38,0x4C,0x60,0x90,0xC2,0x21,0x88,0x67,0x20,0x73,0x80, // 'u'
0x01,0x83,0x1C,0x30,0xC1,0x86,0x2C,0x33,0x63,0xE3,0x10,0x19,0x80,0xD8,0x03,0x80,0x18,0x00, // 'v'
0x03,0x08,0x00,0xC6,0x06,0x31,0x81,0x88,0xE0,0xE2,0x11,0xB9,0x8F,0x8C,0x43,0x03,0x18,0x80,0xC6,0x60,0x32,0x90,0x07,0x18,0x00, // 'w'
0x18,0x40,0xC6,0x02,0x70,0x1F,0x00,0xF0,0x07,0x00,0x30,0x03,0xC2,0x36,0x23,0x1E,0x18,0xE0,0x00,0x00, // 'x'
0x00,0x1C,0x66,0x19,0x86,0x63,0x30,0xCC,0x73,0x18,0xCE,0x3F,0x82,0x60,0x18,0x04,0x03,0x00,0xC0,0x30,0x0C,0x06,0x01,0x80,0x60,0x00,0x00, // 'y'
0x0F,0xC0,0xFE,0x00,0x20,0x03,0x00,0x18,0x01,0x84,0x18,0x61,0xF6,0x0C,0xE0,0x4C,0x01,0xE0,0x1B,0x01,0x90,0x19,0x81,0x8C,0x08,0xC0,0xC6,0x06,0x60,0x33,0x01,0xF0,0x07,0x00,0x00, // 'z'
0x00,0x00,0xE0,0x78,0x38,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x01,0x80,0xC0,0x30,0x06,0x01,0x80,0x60,0x30,0x1C,0x06,0x01,0x00,0xE0,0x1C,0x07,0x00,0xC0, // '{'
0x00,0x06,0x06,0x04,0x0C,0x0C,0x08,0x08,0x18,0x18,0x18,0x10,0x30,0x30,0x30,0x30,0x60,0x60,0x60, // '|'
0x03,0x00,0xC0,0x38,0x06,0x01,0x80,0x60,0x30,0x0C,0x06,0x01,0x80,0x60,0x0C,0x03,0x01,0x80,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x1C,0x1E,0x07,0x00,0x00 // '}'
};
const GFXglyph Satisfy_24Glyphs[] PROGMEM = {
// bitmapOffset, width, height, xAdvance, xOffset, yOffset
{ 0, 1, 1, 8, 0, 0 }, // ' '
{ 1, 8, 19, 7, -1, -18 }, // '!'
{ 20, 8, 9, 7, 0, -19 }, // '"'
{ 29, 12, 13, 11, -1, -16 }, // '#'
{ 49, 9, 18, 8, -1, -17 }, // '$'
{ 70, 16, 19, 15, -1, -18 }, // '%'
{ 108, 13, 20, 12, -2, -18 }, // '&'
{ 141, 5, 9, 4, 0, -19 }, // '''
{ 147, 8, 24, 7, 0, -21 }, // '('
{ 171, 8, 24, 6, -3, -21 }, // ')'
{ 195, 8, 9, 9, 1, -18 }, // '*'
{ 204, 10, 9, 9, -1, -14 }, // '+'
{ 216, 4, 5, 6, -1, -2 }, // ','
{ 219, 10, 2, 9, -1, -8 }, // '-'
{ 222, 4, 3, 6, -1, -2 }, // '.'
{ 224, 13, 19, 7, -3, -18 }, // '/'
{ 255, 11, 19, 13, 1, -18 }, // '0'
{ 282, 7, 19, 8, 0, -17 }, // '1'
{ 299, 11, 19, 12, -1, -18 }, // '2'
{ 326, 11, 19, 13, 0, -18 }, // '3'
{ 353, 11, 19, 12, 0, -18 }, // '4'
{ 380, 12, 19, 12, -1, -18 }, // '5'
{ 409, 10, 19, 13, 1, -18 }, // '6'
{ 433, 10, 19, 11, 1, -17 }, // '7'
{ 457, 11, 19, 13, 0, -18 }, // '8'
{ 484, 10, 19, 13, 1, -18 }, // '9'
{ 508, 5, 8, 6, -1, -7 }, // ':'
{ 513, 5, 11, 6, -1, -7 }, // ';'
{ 520, 9, 10, 8, -1, -13 }, // '<'
{ 532, 10, 5, 10, -1, -11 }, // '='
{ 539, 8, 10, 7, -2, -13 }, // '>'
{ 549, 13, 19, 11, -1, -18 }, // '?'
{ 580, 17, 17, 18, -1, -16 }, // '@'
{ 617, 15, 24, 14, -3, -18 }, // 'A'
{ 662, 16, 23, 16, -1, -19 }, // 'B'
{ 708, 14, 22, 15, 0, -18 }, // 'C'
{ 747, 15, 22, 16, 0, -18 }, // 'D'
{ 789, 14, 22, 14, -1, -18 }, // 'E'
{ 828, 14, 23, 15, 0, -18 }, // 'F'
{ 869, 14, 22, 16, 1, -18 }, // 'G'
{ 908, 17, 23, 17, 0, -19 }, // 'H'
{ 957, 15, 22, 14, -2, -18 }, // 'I'
{ 999, 17, 22, 13, -2, -18 }, // 'J'
{ 1046, 15, 25, 13, -2, -19 }, // 'K'
{ 1093, 16, 22, 13, -3, -18 }, // 'L'
{ 1137, 21, 22, 18, -3, -18 }, // 'M'
{ 1195, 16, 23, 14, -1, -19 }, // 'N'
{ 1241, 13, 22, 15, 0, -18 }, // 'O'
{ 1277, 16, 22, 14, -2, -18 }, // 'P'
{ 1321, 13, 22, 15, 0, -18 }, // 'Q'
{ 1357, 16, 24, 14, -2, -18 }, // 'R'
{ 1405, 14, 24, 12, -2, -19 }, // 'S'
{ 1447, 13, 23, 11, 0, -19 }, // 'T'
{ 1485, 15, 22, 15, 1, -18 }, // 'U'
{ 1527, 13, 23, 13, 1, -19 }, // 'V'
{ 1565, 20, 22, 21, 0, -18 }, // 'W'
{ 1620, 19, 23, 15, -2, -18 }, // 'X'
{ 1675, 14, 23, 14, 0, -19 }, // 'Y'
{ 1716, 14, 22, 12, -2, -17 }, // 'Z'
{ 1755, 10, 23, 6, -2, -21 }, // '['
{ 1784, 6, 19, 8, 0, -18 }, // '\'
{ 1799, 9, 23, 6, -3, -21 }, // ']'
{ 1825, 9, 10, 8, -1, -18 }, // '^'
{ 1837, 13, 3, 12, -3, -2 }, // '_'
{ 1842, 5, 4, 15, 6, -17 }, // '`'
{ 1845, 14, 11, 11, -1, -10 }, // 'a'
{ 1865, 13, 18, 12, 1, -17 }, // 'b'
{ 1895, 12, 11, 10, 0, -10 }, // 'c'
{ 1912, 14, 18, 13, 0, -17 }, // 'd'
{ 1944, 12, 11, 10, -1, -10 }, // 'e'
{ 1961, 13, 29, 9, -2, -17 }, // 'f'
{ 2009, 14, 23, 12, 0, -10 }, // 'g'
{ 2050, 14, 18, 12, -1, -17 }, // 'h'
{ 2082, 8, 17, 8, 1, -16 }, // 'i'
{ 2099, 14, 27, 7, -5, -16 }, // 'j'
{ 2147, 14, 19, 12, -1, -18 }, // 'k'
{ 2181, 7, 18, 6, -1, -17 }, // 'l'
{ 2197, 20, 11, 18, 0, -9 }, // 'm'
{ 2225, 14, 10, 12, -1, -9 }, // 'n'
{ 2243, 13, 11, 11, 0, -10 }, // 'o'
{ 2261, 16, 21, 12, -3, -10 }, // 'p'
{ 2303, 13, 21, 12, 0, -10 }, // 'q'
{ 2338, 15, 12, 11, -3, -11 }, // 'r'
{ 2361, 7, 12, 9, 0, -11 }, // 's'
{ 2372, 13, 18, 8, -2, -17 }, // 't'
{ 2402, 15, 10, 13, 0, -9 }, // 'u'
{ 2421, 13, 11, 12, 1, -10 }, // 'v'
{ 2439, 18, 11, 17, 1, -10 }, // 'w'
{ 2464, 13, 12, 11, -2, -10 }, // 'x'
{ 2484, 10, 21, 11, 0, -10 }, // 'y'
{ 2511, 13, 21, 11, -1, -10 }, // 'z'
{ 2546, 10, 24, 7, -1, -21 }, // '{'
{ 2576, 8, 19, 7, -1, -18 }, // '|'
{ 2595, 10, 24, 7, -3, -21 } // '}'
};
const GFXfont Satisfy_24 PROGMEM = {
(uint8_t *)Satisfy_24Bitmaps,(GFXglyph *)Satisfy_24Glyphs,0x20, 0x7D, 36};

+ 199
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Custom/Yellowtail_32.h 查看文件

@@ -0,0 +1,199 @@
// Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const uint8_t Yellowtail_32Bitmaps[] PROGMEM = {

// Bitmap Data:
0x00, // ' '
0x00,0x01,0x80,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0E,0x00,0x07,0x00,0x03,0xC0,0x00,0xE0,0x00,0x70,0x00,0x1C,0x00,0x0E,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x0F,0x00,0x03,0x80,0x00, // '!'
0x19,0x8E,0x63,0x39,0xCC,0x67,0x19,0x8C,0xE2,0x30, // '"'
0x00,0x20,0x00,0x08,0xC0,0x06,0x30,0x01,0x9C,0x00,0xCE,0x03,0xFF,0xE1,0xFF,0xF8,0x0C,0xE0,0x07,0x30,0x01,0x9C,0x00,0xE7,0xC1,0xFF,0xF8,0xFF,0xC0,0x0E,0x70,0x03,0x18,0x01,0xC6,0x00,0x60,0x80,0x08,0x00,0x00, // '#'
0x00,0x18,0x00,0xE0,0x03,0x00,0x1C,0x00,0x60,0x03,0xE0,0x3F,0xC3,0xFE,0x1F,0xB0,0xEE,0x06,0x70,0x1D,0x80,0x7F,0x80,0xFF,0x01,0xFE,0x06,0x38,0x79,0xE3,0xFF,0x0F,0xF8,0x1F,0x00,0x70,0x01,0x80,0x0E,0x00,0x30,0x00, // '$'
0x03,0x80,0x41,0xF0,0x20,0xEC,0x18,0x73,0x0C,0x39,0x86,0x1C,0x63,0x86,0x39,0xC3,0x8C,0xE0,0xC6,0x73,0xB3,0xB9,0xFF,0xDC,0xED,0xCE,0x73,0x07,0x39,0xC3,0x9C,0x60,0xE6,0x38,0x73,0x8C,0x38,0xC7,0x1C,0x33,0x86,0x0F,0xC1,0x81,0xC0, // '%'
0x00,0x0C,0x00,0x38,0x00,0x60,0x01,0xC0,0x03,0x00,0x7F,0x83,0xFF,0x0F,0xFC,0x3D,0xF0,0x63,0x80,0xFF,0x00,0xFE,0x03,0xF0,0x0E,0xC3,0x3B,0x9E,0x76,0xF8,0xFF,0xE1,0xFF,0x01,0xF8,0x01,0xC0,0x03,0x00,0x0E,0x00,0x18,0x00,0x00, // '&'
0x0C,0x73,0x8E,0x71,0xCE,0x30, // '''
0x00,0x00,0xE0,0x00,0x7C,0x00,0x1F,0x00,0x0F,0x80,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x1C,0x00,0x07,0x00,0x01,0xE0,0x00,0x38,0x00,0x0F,0x00,0x01,0xC0,0x00,0x38,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x00,0xC0,0x00,0x0C,0x00,0x01,0x80,0x00, // '('
0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x01,0x80,0x00,0xE0,0x00,0x38,0x00,0x0C,0x00,0x07,0x00,0x01,0x80,0x00,0xE0,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x1F,0x80,0x0F,0xC0,0x01,0xC0,0x00, // ')'
0x03,0x0C,0xC3,0xE4,0x7F,0x3F,0xBF,0x8D,0xF0,0xCC,0x33,0x00, // '*'
0x01,0x80,0x18,0x03,0x80,0x30,0x06,0x07,0xFF,0xFF,0xE0,0xC0,0x0C,0x01,0x80,0x08,0x00,0x00, // '+'
0x00,0xF3,0xCF,0x79,0x80, // ','
0x7F,0x7F,0xBF,0x00,0x00, // '-'
0x7F,0xE0, // '.'
0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x00,0x00,0x0F,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x00,0x07,0x80,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,0xF0,0x00,0x01,0xE0,0x00,0x03,0xC0,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xC0,0x00,0x00,0x80,0x00,0x00, // '/'
0x00,0x0E,0x00,0x3F,0x00,0x73,0x00,0xE3,0x01,0xC7,0x03,0x86,0x07,0x0E,0x0E,0x1E,0x0E,0x7C,0x1C,0x7C,0x38,0x18,0x38,0x38,0x70,0x30,0x70,0x60,0xE0,0xE0,0xE1,0xC0,0xE7,0x80,0xFF,0x00,0xFC,0x00,0x78,0x00, // '0'
0x00,0x10,0x03,0xC0,0x3C,0x03,0xE0,0x3E,0x00,0xF0,0x07,0x00,0x30,0x03,0x80,0x38,0x01,0x80,0x1C,0x01,0xC0,0x0E,0x00,0xE0,0x07,0x00,0x70,0x03,0x00,0x38,0x00,0x80,0x00, // '1'
0x00,0x1E,0x00,0x7F,0x00,0xF3,0x01,0xE7,0x03,0x86,0x07,0x0E,0x07,0x1C,0x0E,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0xC0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x79,0xC0,0xFF,0xE0,0xFF,0xE0,0xFE,0x00, // '2'
0x00,0x3C,0x01,0xFC,0x07,0x98,0x3C,0x70,0xF1,0xC1,0x87,0x07,0x1C,0x04,0xF0,0x03,0x80,0x0F,0xC0,0x1F,0xC0,0x03,0x80,0x03,0x00,0x0E,0x00,0x38,0x63,0xE0,0xFF,0x81,0xFE,0x01,0xE0,0x00, // '3'
0x00,0x06,0x00,0x1F,0x00,0x3E,0x00,0xFC,0x01,0xDC,0x03,0xB8,0x07,0x30,0x0E,0x70,0x3C,0xE0,0x78,0xE0,0x71,0xFC,0xFF,0xF8,0xFF,0xF0,0x7F,0x00,0x07,0x00,0x0E,0x00,0x0E,0x00,0x1C,0x00,0x1C,0x00,0x38,0x00,0x30,0x00, // '4'
0x00,0x00,0x00,0x3F,0xC0,0x3F,0xE0,0x1F,0xC0,0x18,0x00,0x1C,0x00,0x0C,0x00,0x0E,0x00,0x07,0xE0,0x07,0xF8,0x03,0xFC,0x00,0x06,0x00,0x03,0x00,0x01,0x00,0x01,0x80,0x81,0x80,0xC3,0xC0,0x7F,0x80,0x3F,0x80,0x0F,0x00,0x00, // '5'
0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0F,0xC0,0x0F,0x80,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x07,0x70,0x07,0xFC,0x07,0xC6,0x03,0x83,0x03,0x83,0x01,0x81,0x80,0xC1,0x80,0xC1,0xC0,0x61,0xC0,0x33,0xC0,0x1F,0xC0,0x07,0x80,0x00, // '6'
0x03,0xFE,0x0F,0xFC,0x3F,0xF8,0x00,0xE0,0x03,0x80,0x07,0x00,0x1C,0x00,0x70,0x01,0xC0,0x07,0x00,0x0E,0x00,0x38,0x00,0xE0,0x01,0xC0,0x07,0x00,0x1C,0x00,0x38,0x00,0xE0,0x01,0x80,0x03,0x00,0x00, // '7'
0x00,0x3C,0x00,0x07,0xE7,0x00,0xFE,0xE0,0x1C,0x7C,0x03,0x87,0x80,0x30,0xE0,0x03,0x1C,0x00,0x37,0x80,0x03,0xF0,0x00,0x3C,0x00,0x07,0xE0,0x00,0xEF,0x00,0x1C,0x70,0x03,0x03,0x00,0x70,0x30,0x06,0x06,0x00,0x61,0xE0,0x07,0xFC,0x00,0x7F,0x80,0x03,0xE0,0x00, // '8'
0x00,0x0F,0x00,0x1F,0xC0,0x1C,0x60,0x1C,0x30,0x18,0x18,0x18,0x18,0x18,0x1C,0x0C,0x0C,0x0C,0x1E,0x06,0x3E,0x03,0xFE,0x01,0xFF,0x00,0x77,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x0F,0x00,0x1F,0x00,0x1F,0x00,0x06,0x00,0x00, // '9'
0x07,0x0F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF0,0xE0, // ':'
0x00,0xE0,0x3C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x07,0x80,0xF0,0x1C,0x07,0x00,0x00,0x00, // ';'
0x00,0x00,0xC0,0xE1,0xE1,0xE3,0xC3,0x81,0x80,0x40,0x30,0x18,0x0C,0x06,0x01,0x00,0x80, // '<'
0x0F,0xFC,0x3F,0xF8,0x70,0x00,0x00,0x01,0xFE,0x0F,0xFE,0x1F,0xE0,0x00, // '='
0x00,0x01,0x01,0x80,0xC0,0x70,0x18,0x0C,0x07,0x03,0x87,0xC7,0x8F,0x0F,0x06,0x02,0x00, // '>'
0x00,0xFE,0x00,0xFF,0xC0,0xFF,0xF8,0x7E,0x0F,0x1E,0x01,0xCF,0x00,0x73,0x80,0x1C,0xF0,0x0E,0x00,0x07,0x80,0x07,0xC0,0x03,0xE0,0x03,0xE0,0x01,0xF0,0x01,0xF0,0x00,0xF0,0x00,0x38,0x00,0x1C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x07,0x00,0x01,0x80,0x00, // '?'
0x00,0x00,0xF8,0x00,0x07,0xFC,0x00,0x1F,0xFE,0x00,0x7E,0x0F,0x00,0xF8,0x07,0x03,0xE0,0x07,0x07,0xC0,0x07,0x0F,0x8E,0xC7,0x1F,0x3F,0xCE,0x1E,0x7B,0x8E,0x3C,0xF3,0x8E,0x39,0xE7,0x1C,0x79,0xCF,0x3C,0x73,0x9E,0x38,0xF3,0x1E,0x70,0xE3,0x3E,0xF0,0xE3,0xF7,0xE0,0xE1,0xC3,0x80,0xE0,0x00,0x00,0xE0,0x02,0x00,0x70,0x06,0x00,0x78,0x3E,0x00,0x3F,0xF8,0x00,0x0F,0xE0,0x00, // '@'
0x00,0x00,0x1E,0x00,0x00,0x3F,0x00,0x00,0x7E,0x00,0x01,0xEE,0x00,0x03,0xDC,0x00,0x07,0x9C,0x00,0x0F,0x38,0x00,0x1E,0x38,0x00,0x1C,0x78,0x00,0x38,0x70,0x00,0x70,0x70,0x00,0xE0,0xE0,0x01,0xE0,0xE0,0x03,0xC1,0xC0,0x7F,0xFF,0xC0,0x7F,0xFF,0x80,0x0E,0x03,0x80,0x1C,0x07,0x00,0x38,0x07,0x00,0x78,0x0F,0x00,0x70,0x0E,0x00,0xE0,0x1E,0x00,0xE0,0x1C,0x00,0xC0,0x38,0x00, // 'A'
0x00,0x1F,0xE0,0x01,0xFF,0xF0,0x0F,0xFF,0xF0,0x3F,0x80,0xF0,0xF9,0xC0,0xE3,0xC7,0x01,0xC7,0x1E,0x07,0x8E,0x38,0x1E,0x00,0xE0,0xF8,0x03,0xC3,0xE0,0x07,0x3F,0x00,0x1F,0xF8,0x00,0x3F,0xF8,0x00,0xFF,0xFC,0x03,0xC0,0x7C,0x07,0x00,0x38,0x1C,0x00,0x70,0x78,0x01,0xE0,0xFC,0x07,0x83,0xF8,0x3E,0x07,0xFF,0xF8,0x0E,0xFF,0xC0,0x18,0xFE,0x00,0x00, // 'B'
0x00,0x01,0xF0,0x00,0x7F,0xC0,0x0F,0x8E,0x00,0xF0,0x70,0x0F,0x07,0x00,0xE0,0x78,0x0E,0x07,0x80,0xE0,0x78,0x0E,0x0F,0x80,0xE0,0x70,0x0E,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x30,0x00,0x01,0x80,0x04,0x1C,0x00,0x60,0xC0,0x06,0x06,0x00,0xF0,0x30,0x0F,0x01,0x81,0xF0,0x06,0x3F,0x00,0x3F,0xE0,0x00,0x7C,0x00,0x00, // 'C'
0x00,0x7F,0xC0,0x03,0xFF,0xF0,0x0F,0xC0,0x7C,0x1E,0x1C,0x1E,0x3C,0x38,0x0E,0x3C,0x78,0x07,0x30,0x70,0x07,0x00,0xE0,0x07,0x01,0xE0,0x07,0x01,0xC0,0x07,0x03,0x80,0x0E,0x07,0x80,0x1E,0x07,0x00,0x1E,0x0E,0x00,0x3C,0x1E,0x00,0x78,0x1C,0x00,0xF0,0x3C,0x03,0xE0,0x38,0x07,0xC0,0x70,0x1F,0x80,0x70,0xFF,0x00,0x7F,0xFC,0x00,0x7F,0xF0,0x00,0x7F,0x00,0x00, // 'D'
0x00,0x0F,0xE0,0x07,0xFE,0x01,0xFF,0xE0,0x7E,0x3C,0x0F,0x80,0x00,0xE0,0x00,0x1C,0x00,0x01,0xC0,0x00,0x1F,0xFE,0x00,0xFF,0xE0,0x07,0xFE,0x00,0x7C,0x00,0x0F,0x80,0x01,0xE0,0x0C,0x3C,0x00,0xC7,0x80,0x1C,0x70,0x03,0x8F,0x00,0x70,0xE0,0x1E,0x0E,0x03,0xC0,0xE1,0xF8,0x07,0xFE,0x00,0x1F,0x00,0x00, // 'E'
0x30,0x00,0x1E,0xC0,0x00,0xFD,0xFF,0xFF,0xF0,0xFF,0xFE,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x03,0x80,0x00,0x0E,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x01,0xC0,0x01,0xFF,0xF0,0x07,0xFF,0xE0,0x0F,0xFF,0x80,0x00,0xE0,0x00,0x03,0xC0,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x78,0x00,0x00,0xE0,0x00,0x03,0x80,0x00,0x0F,0x00,0x00,0x1C,0x00,0x00,0x00, // 'F'
0x00,0x00,0x3F,0x00,0x00,0xFF,0xC0,0x01,0xF8,0x60,0x03,0xE0,0x30,0x03,0xC0,0x30,0x07,0xC0,0x70,0x07,0x84,0xF0,0x07,0x87,0xF0,0x07,0x81,0xF0,0x07,0x80,0x1C,0x07,0x80,0x3C,0x03,0x80,0x3C,0x03,0x80,0x3C,0x03,0x80,0x3C,0x01,0x80,0x7E,0x00,0xC0,0x7E,0x00,0xC0,0x7E,0x00,0x60,0xF6,0xC0,0x31,0xF6,0xC0,0x1F,0xE7,0xC0,0x07,0xE7,0xC0,0x01,0x87,0xC0,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x03,0x80,0x00,0x00, // 'G'
0x00,0x03,0x00,0x70,0x00,0x78,0x03,0x81,0x0F,0xC0,0x38,0x1F,0xFC,0x03,0xC0,0xFF,0xC0,0x1C,0x03,0xCE,0x01,0xE0,0x00,0xE0,0x0E,0x00,0x0E,0x00,0xE0,0x00,0xF0,0x0F,0x00,0x07,0x00,0x70,0x00,0x70,0x07,0x80,0x7F,0xFF,0xF8,0x03,0xFF,0xFF,0x80,0x1F,0xFF,0xFC,0x00,0x1C,0x01,0xC0,0x01,0xC0,0x1E,0x00,0x1E,0x00,0xE0,0x00,0xE0,0x0E,0x00,0x0E,0x00,0xF0,0x00,0xF0,0x07,0x00,0x07,0x00,0x78,0x00,0x78,0x03,0x80,0x03,0x80,0x38,0x00,0x00,0x00,0x00,0x00, // 'H'
0x00,0x03,0x80,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1E,0x00,0x0F,0x00,0x03,0x80,0x01,0xE0,0x00,0xF0,0x00,0x38,0x00,0x1E,0x00,0x0F,0x00,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x03,0xC0,0x01,0xE0,0x00,0x78,0x00,0x3C,0x00,0x0E,0x00,0x00, // 'I'
0x00,0x00,0x03,0xF0,0x00,0x03,0xFF,0x00,0x01,0xFF,0xF0,0x00,0x7F,0x8E,0x00,0x0F,0xC1,0xC0,0x03,0xE0,0x38,0x00,0x7C,0x03,0x80,0x1F,0x00,0x70,0x03,0xE0,0x0E,0x00,0x78,0x01,0xC0,0x07,0x00,0x1C,0x00,0xE0,0x03,0x80,0x1E,0x00,0x70,0x01,0xC0,0x06,0x00,0x1C,0x00,0xE0,0x01,0xE2,0x1C,0x00,0x0F,0xE1,0x80,0x00,0x7C,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0x7C,0x00,0x00,0x1F,0x80,0x00,0x07,0xE0,0x00,0x01,0xF8,0x00,0x00,0x3B,0x80,0x00,0x0F,0x70,0x00,0x01,0xCE,0x00,0x00,0x39,0xE0,0x00,0x07,0x3C,0x00,0x00,0xE7,0x80,0x00,0x0C,0xF0,0x00,0x00,0xFE,0x00,0x00,0x0F,0xC0,0x00,0x00,0x78,0x00,0x00,0x00, // 'J'
0x00,0x03,0x00,0x30,0x00,0x7C,0x07,0xC0,0x27,0xC0,0x7C,0x03,0xFE,0x0F,0xC0,0x1F,0xE0,0xF8,0x00,0xEE,0x1F,0x80,0x00,0x71,0xF0,0x00,0x07,0x3F,0x00,0x00,0x77,0xE0,0x00,0x07,0xFC,0x00,0x00,0x3F,0x80,0x00,0x0F,0xF0,0x00,0x00,0xFE,0x00,0x00,0x01,0xFC,0x00,0x00,0x1D,0xF0,0x00,0x01,0xE3,0xE0,0x00,0x0E,0x0F,0x80,0x00,0xF0,0x3F,0x00,0x0F,0x00,0x7C,0x00,0x70,0x01,0xF8,0x07,0x80,0x07,0xF0,0x78,0x00,0x0F,0x83,0x80,0x00,0x38,0x00, // 'K'
0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x01,0xE7,0x00,0x00,0x0F,0x38,0x00,0x00,0x79,0xE0,0x00,0x03,0xCF,0x00,0x00,0x1E,0xF8,0x00,0x00,0x73,0x80,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x70,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x70,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x70,0x00,0x03,0xFF,0x80,0x00,0x1F,0xFF,0x80,0x00,0xE1,0xFF,0xF0,0x03,0xFF,0xFF,0xFF,0x8F,0xFC,0x3F,0xFC,0x1F,0x80,0x0F,0xE0, // 'L'
0x00,0x00,0x1E,0x03,0xE0,0x00,0x0F,0xC0,0xF8,0x00,0x03,0xF0,0x3F,0x00,0x00,0x7E,0x0F,0xC0,0x00,0x1F,0x83,0xF0,0x00,0x07,0xF0,0xFC,0x00,0x01,0xFC,0x3B,0x80,0x00,0x7F,0x0F,0xE0,0x00,0x1E,0xE3,0xF8,0x00,0x03,0xB8,0xF7,0x00,0x00,0xE7,0x3D,0xC0,0x00,0x3D,0xCF,0x70,0x00,0x0F,0x3B,0xCE,0x00,0x01,0xCE,0xF3,0x80,0x00,0x71,0xDC,0xE0,0x00,0x1E,0x77,0x1C,0x00,0x03,0x8F,0xC7,0x10,0x00,0xE3,0xF1,0xC6,0x00,0x3C,0x7C,0x39,0xC0,0x0F,0x1F,0x0E,0x70,0x01,0xC3,0xC1,0xFC,0x00,0x78,0x70,0x3F,0x00,0x0E,0x0C,0x07,0xC0,0x03,0xC0,0x00,0xE0,0x00,0xF0,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00, // 'M'
0x00,0x00,0x00,0x00,0x00,0x1E,0x03,0xC0,0x01,0xF0,0x1E,0x00,0x0F,0x81,0xE0,0x00,0xF8,0x0F,0x00,0x0F,0xC0,0xF0,0x00,0xFE,0x07,0x00,0x07,0x70,0x78,0x00,0x73,0x87,0x80,0x07,0xB8,0x38,0x00,0x39,0xC3,0xC0,0x03,0x8E,0x3C,0x00,0x3C,0x73,0xC0,0x01,0xC3,0x9E,0x00,0x1E,0x39,0xE0,0x00,0xE1,0xDE,0x00,0x0E,0x0F,0xE0,0x00,0xF0,0x7F,0x00,0x07,0x03,0xF0,0x00,0x78,0x3F,0x00,0x03,0x81,0xF0,0x00,0x38,0x0F,0x80,0x01,0xC0,0x78,0x00,0x1E,0x03,0x80,0x00,0xE0,0x00,0x00,0x00, // 'N'
0x00,0x01,0xF0,0x00,0x1F,0xE0,0x00,0x7F,0xA0,0x03,0xF3,0xF0,0x0F,0x9F,0xE0,0x3E,0x7F,0xC0,0xF1,0xE7,0x83,0xC3,0x8E,0x0F,0x06,0x3C,0x3C,0x04,0x70,0x70,0x01,0xE1,0xE0,0x07,0x87,0x80,0x0F,0x0E,0x00,0x3C,0x1C,0x00,0xF0,0x70,0x03,0xC0,0xE0,0x0F,0x01,0xC0,0x7C,0x03,0x81,0xF0,0x07,0x8F,0xC0,0x07,0xFF,0x00,0x0F,0xF8,0x00,0x07,0xC0,0x00,0x00, // 'O'
0x00,0x1F,0xE0,0x01,0xFF,0xFC,0x07,0xF6,0x3E,0x1F,0x8C,0x1F,0x3E,0x1C,0x0F,0x7C,0x38,0x0F,0x78,0x78,0x0F,0x7C,0x70,0x1E,0x38,0xE0,0x3E,0x01,0xE0,0x7C,0x01,0xC0,0xF8,0x03,0xC3,0xF0,0x03,0xFF,0xE0,0x07,0xFF,0x80,0x0F,0xBE,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x7C,0x00,0x00,0x78,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, // 'P'
0x00,0x00,0x7E,0x00,0x01,0xFF,0x80,0x03,0xE0,0xE0,0x03,0xC0,0x70,0x07,0x80,0x38,0x07,0x80,0x3C,0x07,0x80,0x1E,0x07,0x80,0x0E,0x07,0x80,0x0F,0x07,0x80,0x0F,0x83,0x80,0x07,0x83,0x80,0x07,0xC3,0x80,0x07,0xC1,0xC0,0x03,0xC1,0xC0,0x03,0xE0,0xE0,0x03,0xE0,0xE0,0x63,0xE0,0x70,0x73,0xE0,0x38,0x7B,0xE0,0x1C,0xFB,0xE0,0x0F,0xFF,0xC0,0x03,0xFF,0xC0,0x00,0xFF,0x80,0x00,0x03,0xE0,0x00,0x00,0xF8,0x00,0x00,0x3F,0x00,0x00,0x0F,0xE0,0x00,0x01,0xC0,0x00, // 'Q'
0x00,0x3F,0xE0,0x03,0xFF,0xF0,0x3F,0xB0,0xF1,0xF8,0xE0,0x77,0xC1,0xC0,0xEE,0x07,0x03,0xFE,0x1E,0x0F,0xB8,0x38,0x3E,0x00,0xE0,0xF8,0x03,0x87,0xE0,0x0F,0x7F,0x00,0x1F,0xF8,0x00,0x7F,0x80,0x01,0xFC,0x00,0x03,0xBC,0x00,0x0F,0x3C,0x00,0x3C,0x3C,0x00,0x70,0x3C,0x01,0xE0,0x78,0x03,0x80,0x78,0x0F,0x00,0x78,0x1C,0x00,0x7E,0x00,0x00,0x78,0x00,0x00,0x00, // 'R'
0x00,0x00,0xFE,0x00,0x03,0xFF,0x80,0x0F,0xFF,0xC0,0x0F,0xE7,0xE0,0x1F,0x80,0x00,0x1F,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x03,0xE0,0x00,0x00,0xFF,0x00,0x00,0x3F,0xE0,0x00,0x07,0xFC,0x00,0x00,0x3F,0x00,0x00,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0xF8,0x08,0x00,0xF8,0x06,0x03,0xF8,0x03,0xFF,0xF0,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00, // 'S'
0x00,0x00,0x3C,0x00,0x00,0xF8,0xC0,0x0F,0xF1,0xFF,0xFF,0x83,0xFF,0xF8,0x03,0xFC,0xE0,0x00,0x03,0x80,0x00,0x0F,0x00,0x00,0x1C,0x00,0x00,0x70,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x0E,0x00,0x00,0x3C,0x00,0x00,0x70,0x00,0x01,0xC0,0x00,0x07,0x80,0x00,0x0E,0x00,0x00,0xB8,0x00,0x03,0xF0,0x00,0x07,0xC0,0x00,0x1F,0x00,0x00,0x3C,0x00,0x00,0x70,0x00,0x00, // 'T'
0x00,0x0C,0x00,0x00,0x07,0xC0,0x78,0x01,0xF0,0x1F,0x02,0xFC,0x07,0xC0,0xFF,0x00,0xF0,0x1F,0xC0,0x3E,0x01,0xF8,0x0F,0x80,0x0E,0x03,0xE0,0x03,0x80,0xFC,0x00,0xF0,0x3F,0x00,0x1C,0x0F,0xC0,0x07,0x03,0xF0,0x01,0xC0,0xEE,0x00,0x38,0x3F,0x80,0x0E,0x0F,0xE1,0x01,0xC3,0xDC,0x60,0x70,0xF7,0x1C,0x0E,0x3D,0xE7,0x83,0x8F,0x39,0xE0,0x77,0xCF,0xF8,0x0F,0xF1,0xFC,0x01,0xF8,0x3F,0x00,0x1C,0x07,0x80,0x00, // 'U'
0x00,0x0E,0x07,0xC0,0x07,0x80,0xF0,0x07,0xE0,0x3C,0x03,0xF0,0x1E,0x09,0xF8,0x0F,0x83,0xFC,0x03,0xC0,0xFF,0x01,0xE0,0x3B,0x80,0xF8,0x01,0xC0,0x7C,0x00,0xF0,0x1E,0x00,0x78,0x0F,0x00,0x3C,0x07,0x80,0x0F,0x03,0xE0,0x07,0x81,0xF0,0x03,0xC0,0xF8,0x00,0xF0,0x7C,0x00,0x78,0x3C,0x00,0x1E,0x1E,0x00,0x0F,0x1F,0x00,0x03,0xCF,0x80,0x00,0xFF,0x80,0x00,0x3F,0xC0,0x00,0x07,0x80,0x00,0x00, // 'V'
0x00,0x0E,0x00,0x07,0x80,0x0F,0x80,0x00,0xF0,0x0F,0xE0,0xF0,0x3C,0x0F,0xF0,0x78,0x1E,0x03,0xB8,0x1E,0x07,0x80,0xDE,0x0F,0x03,0xC0,0x0F,0x07,0x81,0xF0,0x07,0x83,0xC0,0x78,0x03,0xC1,0xF0,0x3C,0x01,0xF0,0xF8,0x1F,0x00,0x78,0x7E,0x0F,0x80,0x3C,0x3F,0x07,0xC0,0x1F,0x1F,0xC3,0xE0,0x07,0x8F,0xE0,0xF0,0x03,0xC7,0xF8,0x78,0x00,0xF3,0xDC,0x3C,0x00,0x79,0xEF,0x1E,0x00,0x1E,0xF3,0x8F,0x00,0x0F,0x79,0xEF,0x80,0x03,0xFC,0x7F,0xC0,0x00,0xFE,0x1F,0xC0,0x00,0x3F,0x07,0xE0,0x00,0x07,0x00,0xE0,0x00,0x00, // 'W'
0x00,0x01,0x80,0x00,0x00,0x1F,0x00,0xF0,0x01,0xFC,0x0F,0x80,0x0F,0xF0,0x78,0x00,0x79,0xC7,0xC0,0x01,0xC6,0x3E,0x00,0x06,0x39,0xE0,0x00,0x10,0xFF,0x00,0x00,0x03,0xF8,0x00,0x00,0x1F,0x80,0x00,0x00,0x7C,0x00,0x00,0x03,0xE0,0x00,0x00,0x1F,0x00,0x00,0x00,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x7B,0x82,0x00,0x03,0xDC,0x38,0x00,0x3E,0x71,0xE0,0x01,0xF1,0xCF,0x00,0x0F,0x87,0x7C,0x00,0x7C,0x1F,0xC0,0x01,0xC0,0x7E,0x00,0x06,0x00,0xE0,0x00,0x00, // 'X'
0x00,0x00,0x00,0x00,0x07,0x00,0x40,0x07,0xC0,0x78,0x03,0xE0,0x3C,0x0B,0xF8,0x1F,0x03,0xFC,0x07,0x80,0xEE,0x03,0xE0,0x07,0x81,0xF0,0x03,0xC0,0xF8,0x00,0xF0,0x7E,0x00,0x78,0x3F,0x00,0x3C,0x1F,0xC0,0x0F,0x0E,0xE0,0x07,0x87,0x70,0x03,0xC3,0xBC,0x00,0xF1,0xCE,0x00,0x78,0xE7,0x80,0x1E,0x73,0xC0,0x0F,0x38,0xE0,0x03,0xFC,0x78,0x00,0xFE,0x1C,0x00,0x3E,0x0F,0x00,0x07,0x07,0x80,0x00,0x01,0xC0,0x00,0x00,0xF0,0x00,0x00,0x38,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0xA0,0x00,0x01,0xF0,0x00,0x00,0x78,0x00,0x00,0x1E,0x00,0x00,0x03,0x00,0x00,0x00, // 'Y'
0x00,0xC0,0x01,0xC0,0x70,0x00,0xF0,0x1F,0xFF,0xF8,0x07,0xFF,0xFC,0x00,0xFF,0x3E,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x00,0xF8,0x00,0x00,0x7C,0x00,0x00,0x3E,0x00,0x00,0x1F,0x00,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x00,0xF8,0x00,0x00,0x3C,0x7F,0xE0,0x1F,0xFF,0xFC,0x07,0xFF,0xFF,0x00,0xFE,0x00,0x40, // 'Z'
0x00,0x07,0xF0,0x00,0x3F,0x80,0x03,0xFC,0x00,0x1C,0x00,0x00,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x3C,0x00,0x01,0xC0,0x00,0x1E,0x00,0x00,0xE0,0x00,0x0F,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x38,0x00,0x03,0xC0,0x00,0x1C,0x00,0x01,0xE0,0x00,0x0E,0x00,0x00,0x7F,0x80,0x03,0xF8,0x00,0x0F,0x00,0x00, // '['
0x03,0x18,0xE7,0x18,0xC7,0x39,0xCE,0x71,0x8C,0x63,0x18,0xC6,0x31,0x8C,0x63,0x18,0xC6,0x31,0x08, // '\'
0x00,0x07,0xF0,0x00,0x7F,0x80,0x01,0xFC,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x3C,0x00,0x01,0xC0,0x00,0x1E,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x38,0x00,0x3F,0xC0,0x03,0xFC,0x00,0x1F,0xE0,0x00, // ']'
0x00,0x40,0x1C,0x0F,0x83,0xF0,0xF6,0x3C,0xDF,0x3F,0x87,0xE0,0xE8,0x1C, // '^'
0x3F,0xFC,0xFF,0xF9,0x80,0x00, // '_'
0x07,0x38,0xE3,0x18,0x60, // '`'
0x01,0xFC,0x07,0xFC,0x0F,0x38,0x1C,0x78,0x38,0xF0,0x70,0xF0,0x61,0xE0,0xE3,0xE0,0xC7,0xC2,0xDF,0xC6,0xFE,0xCE,0xFC,0xFC,0x70,0x70, // 'a'
0x00,0x1C,0x00,0xE0,0x03,0x00,0x1C,0x00,0xE0,0x03,0x00,0x1C,0x00,0xE0,0x03,0x00,0x1C,0x00,0x7F,0x03,0xFE,0x1F,0x38,0x60,0xE3,0x83,0x8C,0x1C,0x70,0x71,0x83,0x86,0x1C,0x30,0xF0,0xC7,0x83,0x3C,0x0F,0xC0,0x1C,0x00, // 'b'
0x01,0xE0,0x3F,0x83,0xCC,0x38,0xE3,0x86,0x38,0x01,0x80,0x1C,0x00,0xC0,0x06,0x00,0xF0,0x0D,0xC3,0xE7,0xFC,0x1F,0x00, // 'c'
0x00,0x00,0x18,0x00,0x01,0xC0,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x0F,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x78,0x00,0x3B,0x80,0x07,0xFC,0x00,0x7F,0xC0,0x07,0x1E,0x00,0x71,0xE0,0x07,0x1E,0x00,0x71,0xF0,0x03,0x1F,0x00,0x39,0xF8,0x81,0x9F,0xCC,0x0D,0xEC,0x60,0x7E,0x6E,0x01,0xC3,0xE0,0x00,0x0E,0x00, // 'd'
0x01,0xE0,0x7E,0x0E,0xC1,0xC0,0x30,0x03,0xF0,0x3E,0x03,0xC0,0x70,0x2E,0x06,0xC0,0xEC,0x3C,0xFF,0x83,0xE0, // 'e'
0x00,0x00,0x30,0x00,0x03,0x80,0x00,0x18,0x00,0x01,0xC0,0x00,0x1C,0x00,0x00,0xC0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x06,0x00,0x00,0x70,0x00,0x03,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x18,0x00,0x01,0xC0,0x00,0x0C,0xE0,0x03,0xFF,0x80,0x3F,0xC0,0x01,0xE7,0x00,0x07,0x18,0x00,0x70,0xC0,0x03,0x86,0x00,0x38,0x60,0x01,0x86,0x00,0x1C,0x30,0x00,0xC3,0x00,0x0E,0x30,0x00,0x63,0x00,0x07,0x38,0x00,0x33,0x80,0x01,0xF0,0x00,0x0F,0x00,0x00,0x70,0x00,0x00, // 'f'
0x00,0x76,0x01,0xFE,0x07,0xDC,0x0F,0x3C,0x1C,0x78,0x38,0xF0,0x70,0xF0,0x61,0xE0,0xE7,0xC2,0xCF,0xCF,0xDF,0x9E,0xF9,0xFC,0x73,0xF0,0x07,0xE0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x7C,0x00,0xF8,0x00,0xF0,0x00,0xE0,0x00,0xE0,0x00, // 'g'
0x00,0x06,0x00,0x07,0x00,0x07,0x00,0x03,0x80,0x03,0x80,0x01,0x80,0x01,0xC0,0x01,0xC0,0x00,0xC0,0x00,0xE0,0x00,0x63,0x80,0x77,0xC0,0x37,0xE0,0x37,0x60,0x3F,0x70,0x1B,0x70,0x1F,0x38,0x0F,0x38,0x0F,0x9C,0x07,0x9E,0x27,0x8E,0x33,0x87,0x39,0x83,0xF8,0xC0,0xF0, // 'h'
0x00,0x60,0x1C,0x03,0x00,0x00,0x00,0x0C,0x03,0x80,0xF0,0x1E,0x03,0x80,0x70,0x1C,0x03,0x80,0xE0,0x1C,0x47,0x18,0xE7,0x1F,0xC1,0xE0,0x00, // 'i'
0x00,0x00,0x00,0x00,0x07,0x00,0x00,0xE0,0x00,0x0C,0x00,0x00,0x00,0x00,0x30,0x00,0x0F,0x00,0x01,0xF0,0x00,0x1E,0x00,0x00,0xC0,0x00,0x1C,0x00,0x03,0x80,0x00,0x38,0x00,0x07,0x18,0x00,0x63,0x80,0x0E,0xF0,0x00,0xDC,0x00,0x1F,0x80,0x01,0xE0,0x00,0x3C,0x00,0x07,0x80,0x00,0xF0,0x00,0x1E,0x00,0x03,0xC0,0x00,0x7C,0x00,0x0F,0x80,0x00,0xF0,0x00,0x0E,0x00,0x00, // 'j'
0x00,0x0C,0x00,0x38,0x00,0x60,0x01,0xC0,0x07,0x00,0x0E,0x00,0x38,0x00,0x70,0x01,0xC0,0x03,0x80,0x0E,0x30,0x1C,0x60,0x71,0xC0,0xE7,0x03,0x9C,0x06,0x78,0x1F,0xC0,0x3F,0x00,0xFC,0x01,0xF8,0x17,0x38,0x6E,0x71,0xB8,0x7E,0x30,0x78, // 'k'
0x00,0x18,0x01,0xF0,0x0E,0xC0,0x73,0x01,0x98,0x0E,0xE0,0x73,0x01,0x98,0x0C,0xE0,0x77,0x01,0x98,0x0C,0xC0,0x37,0x00,0xF8,0x06,0xC0,0x1E,0x00,0x70,0x03,0xC0,0x0E,0x00,0x30,0x20,0xC1,0x83,0x1E,0x0F,0xF0,0x1F,0x00, // 'l'
0x01,0x8C,0x1C,0x07,0x7C,0xF8,0x0D,0xFB,0xF0,0x3F,0x6E,0xC0,0xF9,0xFB,0x81,0xE3,0xE6,0x07,0x8F,0x98,0x0F,0x1E,0x60,0x3C,0x78,0xC2,0x70,0xE3,0x0D,0xC3,0x86,0x7B,0x8E,0x0F,0xE6,0x1C,0x1F,0x80,0x00,0x1E,0x00, // 'm'
0x00,0xC7,0x00,0xEF,0x80,0xEF,0xC0,0x7F,0xC0,0x7E,0xE0,0x3C,0xE0,0x3C,0x60,0x3E,0x70,0x1E,0x30,0x1E,0x38,0xCE,0x18,0xEE,0x0C,0xE6,0x07,0xE0,0x01,0xC0, // 'n'
0x01,0xC0,0x3F,0x83,0xDE,0x3C,0x63,0x83,0x38,0x39,0xC3,0x8C,0x18,0xC1,0x86,0x1C,0x33,0xC1,0xF8,0x07,0x80,0x00, // 'o'
0x00,0x01,0x80,0x00,0x38,0x00,0x07,0x00,0x00,0x60,0x00,0x0E,0x00,0x00,0xDF,0x00,0x1B,0xF0,0x03,0xF7,0x00,0x3E,0x60,0x07,0xC6,0x00,0xF8,0xC0,0x0F,0x1C,0x01,0xE3,0x80,0x3C,0x70,0x03,0x8E,0x00,0x7F,0xC0,0x06,0xF0,0x00,0xE0,0x00,0x1C,0x00,0x01,0x80,0x00,0x38,0x00,0x07,0x00,0x00,0x70,0x00,0x0E,0x00,0x00,0xC0,0x00,0x0C,0x00,0x00, // 'p'
0x00,0x76,0x01,0xFE,0x03,0xCE,0x0F,0x1C,0x1E,0x3C,0x3C,0x38,0x38,0x78,0x70,0xF0,0x71,0xE0,0xE3,0xE0,0xEF,0xC0,0xFF,0xC0,0xFD,0x80,0x73,0x80,0x03,0x00,0x07,0x00,0x06,0x80,0x0F,0xC0,0x0F,0x80,0x1F,0x00,0x1E,0x00,0x1C,0x00,0x18,0x00, // 'q'
0x00,0xCE,0x01,0xDE,0x03,0xFE,0x03,0xEE,0x07,0xCC,0x0F,0x88,0x0F,0x00,0x1E,0x00,0x1C,0x00,0x38,0x00,0x38,0x00,0x70,0x00,0x60,0x00, // 'r'
0x00,0xF0,0x3F,0xC3,0xFC,0x7C,0xE3,0x80,0x30,0x01,0xC0,0x0F,0xE0,0x3F,0xC0,0x1E,0x00,0x71,0x8F,0x0F,0xF0,0x3E,0x00, // 's'
0x00,0x30,0x01,0xC0,0x0E,0x00,0x3C,0x3F,0xFD,0xFF,0xE0,0x70,0x01,0xC0,0x0E,0x00,0x30,0x01,0xC0,0x0E,0x00,0x38,0x01,0xC0,0x06,0x00,0x18,0x00,0xC1,0x03,0x0C,0x0C,0xF0,0x3F,0x00,0x78,0x00, // 't'
0x02,0x0E,0x07,0x0C,0x0E,0x1C,0x0E,0x18,0x1C,0x38,0x1C,0x70,0x38,0xF0,0x39,0xE0,0x73,0xE0,0x77,0xC2,0x6E,0xC6,0x7C,0xCE,0x78,0xFC,0x70,0x70, // 'u'
0x00,0x00,0x61,0xC7,0x0E,0x78,0x77,0x87,0x3C,0x38,0xE3,0x86,0x1C,0x71,0xC3,0x1C,0x39,0xC1,0x9C,0x0D,0xC0,0x7C,0x01,0x80,0x00, // 'v'
0x00,0x00,0x00,0xE0,0x0C,0x3C,0x61,0x8F,0x1C,0x73,0xE7,0x0C,0x38,0xE3,0x87,0x3C,0x61,0xCF,0x1C,0x3B,0xE7,0x06,0xF9,0xC1,0xFB,0x70,0x3E,0x7C,0x07,0xCF,0x00,0xF1,0xC0,0x18,0x00,0x00, // 'w'
0x00,0x06,0x03,0x1E,0x07,0x3C,0x0F,0x78,0x0F,0xF0,0x03,0xE0,0x03,0xC0,0x03,0x80,0x0F,0x00,0x1F,0x00,0x3F,0x08,0x7B,0x18,0x73,0x38,0xE3,0xF0,0xC1,0xC0, // 'x'
0x06,0x0C,0x0C,0x38,0x38,0x60,0x61,0xC1,0xC7,0x07,0x1E,0x0E,0x78,0x39,0xF1,0x77,0xC7,0xDF,0x1F,0xF6,0x77,0xD9,0x87,0x76,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x01,0xE0,0x07,0xC0,0x0F,0x00,0x0C,0x00,0x00, // 'y'
0x1F,0xF8,0xFF,0xE0,0x0F,0x00,0x78,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x38,0x19,0xC7,0xEF,0xFF,0xBF,0xF0,0xF8,0x00, // 'z'
0x00,0x03,0xE0,0x00,0x7F,0x80,0x07,0xFC,0x00,0x38,0x20,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x18,0x00,0x01,0xC0,0x00,0x1E,0x00,0x01,0xE0,0x00,0x1E,0x00,0x1F,0xE0,0x00,0xFC,0x00,0x01,0xF0,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xE0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x7F,0x80,0x03,0xF8,0x00,0x0F,0x00,0x00, // '{'
0x00,0x00,0xC0,0x00,0x70,0x00,0x18,0x00,0x0E,0x00,0x07,0x00,0x01,0x80,0x00,0xE0,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x03,0x80,0x00,0xC0,0x00,0x70,0x00,0x38,0x00,0x0E,0x00,0x07,0x00,0x01,0xC0,0x00,0xE0,0x00,0x38,0x00,0x1C,0x00,0x07,0x00,0x03,0x80,0x00,0xC0,0x00,0x70,0x00,0x18,0x00,0x0E,0x00,0x03,0x00,0x01,0xC0,0x00,0x60,0x00,0x38,0x00,0x0C,0x00,0x00, // '|'
0x00,0x01,0xF0,0x00,0x3F,0xC0,0x01,0xFE,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x38,0x00,0x01,0xC0,0x00,0x1C,0x00,0x01,0xC0,0x00,0x1C,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0xC0,0x00,0x0F,0x80,0x00,0xFE,0x00,0x0F,0xE0,0x00,0xF0,0x00,0x0F,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x30,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x31,0xC0,0x01,0xFE,0x00,0x0F,0xC0,0x00 // '}'
};
const GFXglyph Yellowtail_32Glyphs[] PROGMEM = {
// bitmapOffset, width, height, xAdvance, xOffset, yOffset
{ 0, 1, 1, 8, 0, 0 }, // ' '
{ 1, 18, 24, 12, 2, -23 }, // '!'
{ 55, 10, 8, 12, 7, -22 }, // '"'
{ 65, 18, 18, 18, 2, -19 }, // '#'
{ 106, 14, 24, 14, 2, -22 }, // '$'
{ 148, 18, 20, 23, 4, -20 }, // '%'
{ 193, 15, 23, 15, 3, -23 }, // '&'
{ 237, 6, 8, 7, 7, -22 }, // '''
{ 243, 19, 32, 13, 3, -26 }, // '('
{ 319, 18, 32, 12, -3, -26 }, // ')'
{ 391, 10, 9, 13, 7, -22 }, // '*'
{ 403, 12, 12, 14, 3, -16 }, // '+'
{ 421, 6, 6, 9, 0, -3 }, // ','
{ 426, 9, 4, 11, 2, -9 }, // '-'
{ 431, 4, 3, 9, 2, -2 }, // '.'
{ 433, 24, 30, 14, -2, -26 }, // '/'
{ 523, 16, 20, 14, 1, -20 }, // '0'
{ 563, 13, 20, 9, 0, -20 }, // '1'
{ 596, 16, 20, 14, 1, -20 }, // '2'
{ 636, 15, 19, 14, 1, -19 }, // '3'
{ 672, 16, 21, 15, 2, -20 }, // '4'
{ 714, 17, 20, 14, 1, -19 }, // '5'
{ 757, 17, 21, 14, 1, -20 }, // '6'
{ 802, 15, 20, 12, 2, -19 }, // '7'
{ 840, 20, 20, 14, 0, -19 }, // '8'
{ 890, 17, 21, 15, 1, -20 }, // '9'
{ 935, 8, 12, 12, 3, -11 }, // ':'
{ 947, 11, 14, 13, 1, -11 }, // ';'
{ 967, 9, 15, 12, 5, -17 }, // '<'
{ 984, 15, 7, 15, 2, -13 }, // '='
{ 998, 9, 15, 13, 2, -18 }, // '>'
{ 1015, 18, 24, 18, 4, -23 }, // '?'
{ 1069, 24, 24, 24, 3, -23 }, // '@'
{ 1141, 24, 24, 20, 1, -23 }, // 'A'
{ 1213, 23, 23, 23, 3, -23 }, // 'B'
{ 1280, 21, 23, 20, 3, -23 }, // 'C'
{ 1341, 24, 23, 26, 4, -23 }, // 'D'
{ 1410, 20, 23, 20, 3, -23 }, // 'E'
{ 1468, 23, 23, 20, 5, -23 }, // 'F'
{ 1535, 25, 31, 22, 2, -23 }, // 'G'
{ 1632, 29, 24, 25, 3, -23 }, // 'H'
{ 1719, 18, 23, 10, 0, -23 }, // 'I'
{ 1771, 28, 33, 22, 0, -23 }, // 'J'
{ 1887, 29, 23, 25, 1, -23 }, // 'K'
{ 1971, 30, 24, 24, -2, -23 }, // 'L'
{ 2061, 35, 27, 26, -3, -23 }, // 'M'
{ 2180, 29, 25, 23, 0, -24 }, // 'N'
{ 2271, 23, 23, 22, 3, -23 }, // 'O'
{ 2338, 24, 24, 24, 5, -23 }, // 'P'
{ 2410, 25, 28, 24, 2, -23 }, // 'Q'
{ 2498, 23, 24, 25, 5, -23 }, // 'R'
{ 2567, 25, 24, 23, 2, -23 }, // 'S'
{ 2642, 23, 24, 19, 5, -23 }, // 'T'
{ 2711, 27, 23, 25, 3, -23 }, // 'U'
{ 2789, 26, 23, 22, 3, -23 }, // 'V'
{ 2864, 34, 23, 30, 2, -23 }, // 'W'
{ 2962, 30, 23, 21, -1, -23 }, // 'X'
{ 3049, 26, 33, 23, 3, -23 }, // 'Y'
{ 3157, 26, 24, 20, 0, -23 }, // 'Z'
{ 3235, 21, 32, 13, 0, -27 }, // '['
{ 3319, 5, 30, 13, 6, -26 }, // '\'
{ 3338, 21, 32, 14, -2, -27 }, // ']'
{ 3422, 11, 10, 17, 7, -23 }, // '^'
{ 3436, 15, 3, 13, -3, 2 }, // '_'
{ 3442, 5, 7, 14, 8, -21 }, // '`'
{ 3447, 16, 13, 15, 1, -12 }, // 'a'
{ 3473, 14, 24, 14, 1, -23 }, // 'b'
{ 3515, 13, 14, 13, 1, -13 }, // 'c'
{ 3538, 21, 24, 15, 1, -23 }, // 'd'
{ 3601, 12, 14, 12, 1, -13 }, // 'e'
{ 3622, 21, 33, 12, -5, -23 }, // 'f'
{ 3709, 16, 23, 14, 0, -13 }, // 'g'
{ 3755, 17, 24, 14, -1, -23 }, // 'h'
{ 3806, 11, 19, 8, 1, -18 }, // 'i'
{ 3833, 20, 28, 8, -8, -18 }, // 'j'
{ 3903, 15, 24, 13, -1, -23 }, // 'k'
{ 3948, 14, 24, 10, 2, -23 }, // 'l'
{ 3990, 23, 14, 21, -1, -13 }, // 'm'
{ 4031, 17, 14, 14, -2, -13 }, // 'n'
{ 4061, 13, 13, 13, 1, -13 }, // 'o'
{ 4083, 20, 26, 14, -6, -16 }, // 'p'
{ 4148, 16, 23, 14, 0, -13 }, // 'q'
{ 4194, 16, 13, 12, -2, -13 }, // 'r'
{ 4220, 13, 14, 13, 1, -13 }, // 's'
{ 4243, 14, 21, 8, 1, -20 }, // 't'
{ 4280, 16, 14, 15, 0, -13 }, // 'u'
{ 4308, 13, 15, 13, 1, -14 }, // 'v'
{ 4333, 19, 15, 18, 0, -14 }, // 'w'
{ 4369, 16, 15, 13, -1, -14 }, // 'x'
{ 4399, 15, 22, 14, 0, -12 }, // 'y'
{ 4441, 14, 13, 13, 0, -13 }, // 'z'
{ 4464, 21, 32, 15, 3, -27 }, // '{'
{ 4548, 18, 31, 13, 1, -27 }, // '|'
{ 4618, 21, 32, 16, -3, -27 } // '}'
};
const GFXfont Yellowtail_32 PROGMEM = {
(uint8_t *)Yellowtail_32Bitmaps,(GFXglyph *)Yellowtail_32Glyphs,0x20, 0x7D, 45};

+ 632
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font16.c 查看文件

@@ -0,0 +1,632 @@
// Font 2

// Comment out for £ sign for character 24
#define TFT_ESPI_FONT2_DOLLAR

// The grave ( ` ) diacritical mark will show as a degree ( ° ) symbol
// Comment out next line to return character 0x60 to the grave accent:
#define TFT_ESPI_GRAVE_IS_DEGREE

// Width has been increased by 1 pixel so pixel lengths are calculated correctly
// for the displayed string

PROGMEM const unsigned char widtbl_f16[96] = // character width table
{
6, 3, 4, 9, 8, 9, 9, 3, // char 32 - 39
7, 7, 8, 6, 3, 6, 5, 7, // char 40 - 47
8, 8, 8, 8, 8, 8, 8, 8, // char 48 - 55
8, 8, 3, 3, 6, 6, 6, 8, // char 56 - 63
9, 8, 8, 8, 8, 8, 8, 8, // char 64 - 71
8, 4, 8, 8, 7, 10, 8, 8, // char 72 - 79
8, 8, 8, 8, 8, 8, 8, 10, // char 80 - 87
8, 8, 8, 4, 7, 4, 7, 9, // char 88 - 95
#ifdef TFT_ESPI_GRAVE_IS_DEGREE
5, 7, 7, 7, 7, 7, 6, 7, // char 96 - 103 0x60 is degree symbol
#else
4, 7, 7, 7, 7, 7, 6, 7, // char 96 - 103 0x60 is grave
#endif
7, 4, 5, 6, 4, 8, 7, 8, // char 104 - 111
7, 8, 6, 6, 5, 7, 8, 8, // char 112 - 119
6, 7, 7, 5, 3, 5, 8, 6 // char 120 - 127
};

// Row format, MSB left

PROGMEM const unsigned char chr_f16_20[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_21[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
0x00, 0x40, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_22[16] = // 1 unsigned char per row
{
0x00, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_23[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0xFF, 0x24, 0x24, 0xFF, 0x24, // row 1 - 11
0x24, 0x24, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_24[16] = // 1 unsigned char per row
{
#ifdef TFT_ESPI_FONT2_DOLLAR
0x00, 0x00, 0x28, 0x38, 0x6C, 0xAA, 0xA8, 0x68, 0x3C, 0x2A, 0xAA, // row 1 - 11
0x6C, 0x38, 0x28, 0x00, 0x00 // row 12 - 16
#else // GBP sign
0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x70, 0x40, 0x70, 0x40, // row 1 - 11
0x40, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16
#endif
};

PROGMEM const unsigned char chr_f16_25[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x61, 0x91, 0x92, 0x64, 0x08, 0x10, 0x26, 0x49, // row 1 - 11
0x89, 0x86, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_26[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x20, 0x50, 0x88, 0x88, 0x50, 0x20, 0x52, 0x8C, // row 1 - 11
0x8C, 0x73, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_27[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_28[16] = // 1 unsigned char per row
{
0x00, 0x0C, 0x10, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11
0x40, 0x40, 0x20, 0x10, 0x0C // row 12 - 16
};

PROGMEM const unsigned char chr_f16_29[16] = // 1 unsigned char per row
{
0x00, 0xC0, 0x20, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, // row 1 - 11
0x08, 0x08, 0x10, 0x20, 0xC0 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_2A[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0x54, 0x92, 0x10, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_2B[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_2C[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0xC0, 0xC0, 0x40, 0x80, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_2D[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_2E[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0xC0, 0xC0, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_2F[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, // row 1 - 11
0x40, 0x80, 0x80, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_30[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x82, 0x82, 0x82, 0x82, 0x44, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_31[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x10, 0x10, // row 1 - 11
0x10, 0x7C, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_32[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x02, 0x04, 0x18, 0x20, 0x40, // row 1 - 11
0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_33[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x78, 0x84, 0x02, 0x04, 0x38, 0x04, 0x02, 0x02, // row 1 - 11
0x84, 0x78, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_34[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x44, 0x84, 0xFE, 0x04, // row 1 - 11
0x04, 0x04, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_35[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xFC, 0x80, 0x80, 0x80, 0xF8, 0x04, 0x02, 0x02, // row 1 - 11
0x84, 0x78, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_36[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x3C, 0x40, 0x80, 0x80, 0xB8, 0xC4, 0x82, 0x82, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_37[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, // row 1 - 11
0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_38[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x44, 0x38, 0x44, 0x82, 0x82, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_39[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x46, 0x3A, 0x02, 0x02, // row 1 - 11
0x04, 0x78, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_3A[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_3B[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, // row 1 - 11
0x40, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_3C[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, // row 1 - 11
0x10, 0x08, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_3D[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_3E[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x10, 0x20, // row 1 - 11
0x40, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_3F[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x02, 0x04, 0x08, 0x10, 0x10, // row 1 - 11
0x00, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_40[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x3C, 0x42, 0x99, 0xA5, 0xA5, 0xA5, 0xA5, 0x9E, // row 1 - 11
0x40, 0x3E, 0x00, 0x00, 0x00 // row 12 - 16
};
PROGMEM const unsigned char chr_f16_41[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x7C, 0x82, // row 1 - 11
0x82, 0x82, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_42[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x84, 0xF8, 0x84, 0x82, 0x82, // row 1 - 11
0x84, 0xF8, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_43[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11
0x42, 0x3C, 0x00, 0x00, 0x00 // row 12 - 16
};
PROGMEM const unsigned char chr_f16_44[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11
0x84, 0xF8, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_45[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, // row 1 - 11
0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_46[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0xF8, 0x80, 0x80, 0x80, // row 1 - 11
0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
};
PROGMEM const unsigned char chr_f16_47[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x9C, 0x82, 0x82, // row 1 - 11
0x42, 0x3C, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_48[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x84, 0x84, 0x84, // row 1 - 11
0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_49[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
0x40, 0xE0, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_4A[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_4B[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x84, 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, // row 1 - 11
0x84, 0x82, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_4C[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11
0x80, 0xFC, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_4D[32] = // 2 unsigned chars per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x80, 0xC1, 0x80, 0xA2, 0x80, // row 1 - 6
0xA2, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x88, 0x80, 0x80, 0x80, // row 7 - 12
0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16
};

PROGMEM const unsigned char chr_f16_4E[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xC2, 0xC2, 0xA2, 0xA2, 0x92, 0x92, 0x8A, 0x8A, // row 1 - 11
0x86, 0x86, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_4F[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_50[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x84, 0xF8, 0x80, // row 1 - 11
0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
};
PROGMEM const unsigned char chr_f16_51[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11
0x44, 0x38, 0x08, 0x06, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_52[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x84, 0xF8, 0x90, 0x88, // row 1 - 11
0x84, 0x82, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_53[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x80, 0x60, 0x1C, 0x02, 0x82, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_54[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // row 1 - 11
0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_55[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_56[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, // row 1 - 11
0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_57[32] = // 2 unsigned chars per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 6
0x88, 0x80, 0x88, 0x80, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22, 0x00, // row 7 - 12
0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16
};

PROGMEM const unsigned char chr_f16_58[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, // row 1 - 11
0x82, 0x82, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_59[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, // row 1 - 11
0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_5A[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xFE, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, // row 1 - 11
0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_5B[16] = // 1 unsigned char per row
{
0x00, 0x00, 0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11
0x80, 0x80, 0xE0, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_5C[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, // row 1 - 11
0x08, 0x04, 0x04, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_5D[16] = // 1 unsigned char per row
{
0x00, 0x00, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // row 1 - 11
0x20, 0x20, 0xE0, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_5E[32] = // 1 unsigned chars per row
{
0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_5F[32] = // 1 unsigned chars per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0xFF, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_60[16] = // 1 unsigned char per row
{
#ifdef TFT_ESPI_GRAVE_IS_DEGREE
0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 Degree symbol
0x00, 0x00, 0x00, 0x00, 0x00
#else
0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 Grave accent
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
#endif
};

PROGMEM const unsigned char chr_f16_61[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x04, 0x74, 0x8C, // row 1 - 11
0x8C, 0x74, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_62[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11
0xC8, 0xB0, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_63[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x80, 0x80, 0x80, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_64[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x34, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11
0x4C, 0x34, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_65[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x84, 0xF8, 0x80, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_66[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x30, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x40, 0x40, // row 1 - 11
0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16
};
PROGMEM const unsigned char chr_f16_67[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11
0x4C, 0x34, 0x04, 0x08, 0x70 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_68[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11
0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_69[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_6A[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, // row 1 - 11
0x10, 0x10, 0x10, 0x90, 0x60 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_6B[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x88, 0x90, 0xA0, 0xC0, 0xA0, // row 1 - 11
0x90, 0x88, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_6C[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_6D[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD2, 0x92, 0x92, 0x92, // row 1 - 11
0x92, 0x92, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_6E[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11
0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_6F[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, // row 1 - 11
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_70[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11
0xC8, 0xB0, 0x80, 0x80, 0x80 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_71[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11
0x4C, 0x34, 0x04, 0x04, 0x06 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_72[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x80, 0x80, 0x80, // row 1 - 11
0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_73[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x88, 0x80, 0x70, 0x08, // row 1 - 11
0x88, 0x70, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_74[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
0x40, 0x30, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_75[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, // row 1 - 11
0x4C, 0x34, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_76[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, // row 1 - 11
0x28, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_77[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x92, 0x92, // row 1 - 11
0xAA, 0x44, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_78[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x50, 0x20, 0x50, // row 1 - 11
0x88, 0x88, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_79[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, // row 1 - 11
0x4C, 0x34, 0x04, 0x08, 0x70 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_7A[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x04, 0x08, 0x30, 0x40, // row 1 - 11
0x80, 0xFC, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_7B[16] = // 1 unsigned char per row
{
0x00, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x20, // row 1 - 11
0x20, 0x20, 0x20, 0x20, 0x10 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_7C[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
0x40, 0x40, 0x40, 0x40, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_7D[16] = // 1 unsigned char per row
{
0x00, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x20, 0x20, // row 1 - 11
0x20, 0x20, 0x20, 0x20, 0x40 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_7E[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char chr_f16_7F[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x30, 0x48, 0x48, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
};

PROGMEM const unsigned char* const chrtbl_f16[96] = // character pointer table
{
chr_f16_20, chr_f16_21, chr_f16_22, chr_f16_23, chr_f16_24, chr_f16_25, chr_f16_26, chr_f16_27,
chr_f16_28, chr_f16_29, chr_f16_2A, chr_f16_2B, chr_f16_2C, chr_f16_2D, chr_f16_2E, chr_f16_2F,
chr_f16_30, chr_f16_31, chr_f16_32, chr_f16_33, chr_f16_34, chr_f16_35, chr_f16_36, chr_f16_37,
chr_f16_38, chr_f16_39, chr_f16_3A, chr_f16_3B, chr_f16_3C, chr_f16_3D, chr_f16_3E, chr_f16_3F,
chr_f16_40, chr_f16_41, chr_f16_42, chr_f16_43, chr_f16_44, chr_f16_45, chr_f16_46, chr_f16_47,
chr_f16_48, chr_f16_49, chr_f16_4A, chr_f16_4B, chr_f16_4C, chr_f16_4D, chr_f16_4E, chr_f16_4F,
chr_f16_50, chr_f16_51, chr_f16_52, chr_f16_53, chr_f16_54, chr_f16_55, chr_f16_56, chr_f16_57,
chr_f16_58, chr_f16_59, chr_f16_5A, chr_f16_5B, chr_f16_5C, chr_f16_5D, chr_f16_5E, chr_f16_5F,
chr_f16_60, chr_f16_61, chr_f16_62, chr_f16_63, chr_f16_64, chr_f16_65, chr_f16_66, chr_f16_67,
chr_f16_68, chr_f16_69, chr_f16_6A, chr_f16_6B, chr_f16_6C, chr_f16_6D, chr_f16_6E, chr_f16_6F,
chr_f16_70, chr_f16_71, chr_f16_72, chr_f16_73, chr_f16_74, chr_f16_75, chr_f16_76, chr_f16_77,
chr_f16_78, chr_f16_79, chr_f16_7A, chr_f16_7B, chr_f16_7C, chr_f16_7D, chr_f16_7E, chr_f16_7F
};

+ 10
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font16.h 查看文件

@@ -0,0 +1,10 @@
#include <Fonts/Font16.c>

#define nr_chrs_f16 96
#define chr_hgt_f16 16
#define baseline_f16 13
#define data_size_f16 8
#define firstchr_f16 32

extern const unsigned char widtbl_f16[96];
extern const unsigned char* const chrtbl_f16[96];

+ 1046
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font32rle.c
文件差異過大導致無法顯示
查看文件


+ 10
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font32rle.h 查看文件

@@ -0,0 +1,10 @@
#include <Fonts/Font32rle.c>

#define nr_chrs_f32 96
#define chr_hgt_f32 26
#define baseline_f32 19
#define data_size_f32 8
#define firstchr_f32 32

extern const unsigned char widtbl_f32[96];
extern const unsigned char* const chrtbl_f32[96];

+ 299
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font64rle.c 查看文件

@@ -0,0 +1,299 @@
// Font 6 is intended to display numbers and time
//
// This font has been 8 bit Run Length Encoded to save FLASH space
//
// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : - . a p m
// The Pipe character | is a narrow space to aid formatting
// All other characters print as a space


PROGMEM const unsigned char widtbl_f64[96] = // character width table
{
12, 12, 12, 12, 12, 12, 12, 12, // char 32 - 39
12, 12, 12, 12, 12, 17, 15, 12, // char 40 - 47
27, 27, 27, 27, 27, 27, 27, 27, // char 48 - 55
27, 27, 15, 12, 12, 12, 12, 12, // char 56 - 63
12, 12, 12, 12, 12, 12, 12, 12, // char 64 - 71
12, 12, 12, 12, 12, 12, 12, 12, // char 72 - 79
12, 12, 12, 12, 12, 12, 12, 12, // char 80 - 87
12, 12, 12, 12, 12, 12, 12, 12, // char 88 - 95
12, 27, 12, 12, 12, 12, 12, 12, // char 96 - 103
12, 12, 12, 12, 12, 42, 12, 12, // char 104 - 111
29, 12, 12, 12, 12, 12, 12, 12, // char 112 - 119
12, 12, 12, 12, 7, 12, 12, 12 // char 120 - 127
};

PROGMEM const unsigned char chr_f64_20[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x3F
};

PROGMEM const unsigned char chr_f64_2D[] =
{
0x7F, 0x7F, 0x45, 0x8A, 0x05, 0x8A, 0x05, 0x8A,
0x05, 0x8A, 0x7F, 0x7F, 0x7F, 0x2B
};

PROGMEM const unsigned char chr_f64_2E[] =
{
0x7F, 0x7F, 0x7F, 0x55, 0x84, 0x09, 0x84, 0x09,
0x84, 0x09, 0x84, 0x09, 0x84, 0x7F, 0x38
};

PROGMEM const unsigned char chr_f64_30[] =
{
0x23, 0x87, 0x0F, 0x8D, 0x0B, 0x8F, 0x09, 0x91,
0x07, 0x86, 0x05, 0x86, 0x06, 0x84, 0x09, 0x84,
0x06, 0x83, 0x0B, 0x83, 0x05, 0x84, 0x0B, 0x84,
0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83,
0x04, 0x83, 0x0D, 0x83, 0x03, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x03, 0x83, 0x0D, 0x83,
0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83,
0x04, 0x84, 0x0B, 0x84, 0x05, 0x83, 0x0B, 0x83,
0x06, 0x84, 0x09, 0x84, 0x06, 0x86, 0x05, 0x86,
0x07, 0x91, 0x09, 0x8F, 0x0B, 0x8D, 0x0F, 0x87,
0x7F, 0x7F, 0x32
};

PROGMEM const unsigned char chr_f64_31[] =
{
0x29, 0x82, 0x17, 0x82, 0x16, 0x83, 0x16, 0x83,
0x15, 0x84, 0x14, 0x85, 0x12, 0x87, 0x0D, 0x8C,
0x0D, 0x8C, 0x0D, 0x87, 0x00, 0x83, 0x0D, 0x84,
0x03, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x7F, 0x7F, 0x4C
};

PROGMEM const unsigned char chr_f64_32[] =
{
0x24, 0x87, 0x10, 0x8C, 0x0B, 0x8F, 0x09, 0x91,
0x08, 0x85, 0x05, 0x86, 0x06, 0x84, 0x09, 0x84,
0x06, 0x84, 0x0A, 0x83, 0x06, 0x83, 0x0B, 0x84,
0x04, 0x84, 0x0C, 0x83, 0x04, 0x83, 0x0D, 0x83,
0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83,
0x16, 0x83, 0x15, 0x84, 0x15, 0x84, 0x14, 0x84,
0x14, 0x85, 0x13, 0x85, 0x12, 0x86, 0x11, 0x87,
0x10, 0x88, 0x10, 0x88, 0x0F, 0x88, 0x10, 0x87,
0x11, 0x86, 0x12, 0x85, 0x13, 0x85, 0x14, 0x84,
0x14, 0x84, 0x15, 0x83, 0x16, 0x83, 0x15, 0x96,
0x03, 0x96, 0x03, 0x96, 0x03, 0x96, 0x7F, 0x7F,
0x45
};

PROGMEM const unsigned char chr_f64_33[] =
{
0x23, 0x87, 0x0F, 0x8D, 0x0B, 0x90, 0x08, 0x91,
0x07, 0x86, 0x05, 0x86, 0x06, 0x84, 0x09, 0x84,
0x05, 0x84, 0x0B, 0x84, 0x04, 0x84, 0x0B, 0x84,
0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83,
0x04, 0x83, 0x0D, 0x83, 0x15, 0x84, 0x15, 0x84,
0x14, 0x84, 0x14, 0x85, 0x0D, 0x8B, 0x0E, 0x89,
0x10, 0x8B, 0x0E, 0x8C, 0x14, 0x86, 0x15, 0x84,
0x16, 0x84, 0x15, 0x84, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x84, 0x0D, 0x84, 0x02, 0x84, 0x0C, 0x85,
0x03, 0x84, 0x0B, 0x84, 0x04, 0x85, 0x09, 0x85,
0x05, 0x86, 0x05, 0x86, 0x07, 0x91, 0x09, 0x8F,
0x0B, 0x8D, 0x0F, 0x87, 0x7F, 0x7F, 0x4D
};

PROGMEM const unsigned char chr_f64_34[] =
{
0x45, 0x83, 0x15, 0x84, 0x14, 0x85, 0x13, 0x86,
0x13, 0x86, 0x12, 0x87, 0x11, 0x83, 0x00, 0x83,
0x11, 0x83, 0x00, 0x83, 0x10, 0x83, 0x01, 0x83,
0x0F, 0x83, 0x02, 0x83, 0x0E, 0x84, 0x02, 0x83,
0x0E, 0x83, 0x03, 0x83, 0x0D, 0x83, 0x04, 0x83,
0x0C, 0x83, 0x05, 0x83, 0x0B, 0x84, 0x05, 0x83,
0x0B, 0x83, 0x06, 0x83, 0x0A, 0x83, 0x07, 0x83,
0x09, 0x84, 0x07, 0x83, 0x09, 0x83, 0x08, 0x83,
0x08, 0x83, 0x09, 0x83, 0x07, 0x83, 0x0A, 0x83,
0x07, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97,
0x11, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x7F, 0x7F, 0x4A
};

PROGMEM const unsigned char chr_f64_35[] =
{
0x3A, 0x91, 0x08, 0x91, 0x08, 0x91, 0x08, 0x91,
0x08, 0x82, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x82, 0x17, 0x82, 0x17, 0x82, 0x16, 0x83,
0x02, 0x87, 0x0B, 0x83, 0x00, 0x8B, 0x09, 0x91,
0x08, 0x92, 0x07, 0x86, 0x05, 0x86, 0x06, 0x84,
0x09, 0x85, 0x05, 0x83, 0x0B, 0x84, 0x16, 0x83,
0x16, 0x84, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83,
0x16, 0x83, 0x16, 0x83, 0x03, 0x83, 0x0E, 0x83,
0x03, 0x83, 0x0D, 0x84, 0x03, 0x83, 0x0D, 0x83,
0x04, 0x84, 0x0B, 0x84, 0x05, 0x84, 0x09, 0x85,
0x05, 0x86, 0x05, 0x86, 0x07, 0x91, 0x09, 0x8F,
0x0B, 0x8D, 0x0F, 0x87, 0x7F, 0x7F, 0x32
};

PROGMEM const unsigned char chr_f64_36[] =
{
0x24, 0x86, 0x11, 0x8B, 0x0C, 0x8E, 0x0A, 0x90,
0x08, 0x86, 0x05, 0x85, 0x06, 0x85, 0x09, 0x84,
0x05, 0x84, 0x0B, 0x83, 0x05, 0x83, 0x0C, 0x84,
0x03, 0x84, 0x0D, 0x83, 0x03, 0x83, 0x0E, 0x83,
0x03, 0x83, 0x16, 0x83, 0x15, 0x83, 0x16, 0x83,
0x04, 0x86, 0x0A, 0x83, 0x02, 0x8B, 0x07, 0x83,
0x00, 0x8E, 0x06, 0x94, 0x05, 0x88, 0x05, 0x86,
0x04, 0x86, 0x09, 0x84, 0x04, 0x85, 0x0B, 0x84,
0x03, 0x84, 0x0D, 0x83, 0x03, 0x84, 0x0D, 0x84,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x03, 0x83, 0x0D, 0x84,
0x03, 0x83, 0x0D, 0x83, 0x04, 0x84, 0x0B, 0x84,
0x05, 0x84, 0x09, 0x85, 0x05, 0x86, 0x05, 0x86,
0x07, 0x91, 0x09, 0x8F, 0x0C, 0x8C, 0x0F, 0x88,
0x7F, 0x7F, 0x31
};

PROGMEM const unsigned char chr_f64_37[] =
{
0x37, 0x96, 0x03, 0x96, 0x03, 0x96, 0x03, 0x96,
0x16, 0x83, 0x15, 0x83, 0x15, 0x83, 0x15, 0x83,
0x15, 0x84, 0x14, 0x84, 0x14, 0x84, 0x15, 0x83,
0x15, 0x84, 0x14, 0x84, 0x15, 0x84, 0x14, 0x84,
0x15, 0x83, 0x15, 0x84, 0x15, 0x83, 0x15, 0x84,
0x15, 0x84, 0x15, 0x83, 0x15, 0x84, 0x15, 0x83,
0x16, 0x83, 0x15, 0x84, 0x15, 0x83, 0x16, 0x83,
0x16, 0x83, 0x16, 0x83, 0x15, 0x84, 0x15, 0x83,
0x16, 0x83, 0x16, 0x83, 0x7F, 0x7F, 0x53
};

PROGMEM const unsigned char chr_f64_38[] =
{
0x24, 0x85, 0x11, 0x8B, 0x0C, 0x8F, 0x09, 0x91,
0x07, 0x86, 0x05, 0x86, 0x06, 0x84, 0x09, 0x84,
0x05, 0x84, 0x0B, 0x84, 0x04, 0x84, 0x0B, 0x84,
0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83,
0x04, 0x83, 0x0D, 0x83, 0x04, 0x84, 0x0B, 0x84,
0x05, 0x83, 0x0B, 0x83, 0x06, 0x84, 0x09, 0x84,
0x07, 0x85, 0x05, 0x85, 0x09, 0x8F, 0x0B, 0x8D,
0x0B, 0x8F, 0x09, 0x91, 0x07, 0x85, 0x07, 0x85,
0x05, 0x84, 0x0B, 0x84, 0x04, 0x83, 0x0D, 0x83,
0x03, 0x84, 0x0D, 0x84, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x84, 0x0D, 0x84, 0x02, 0x84, 0x0D, 0x84,
0x03, 0x84, 0x0B, 0x84, 0x04, 0x86, 0x07, 0x86,
0x05, 0x93, 0x07, 0x91, 0x09, 0x8F, 0x0D, 0x89,
0x7F, 0x7F, 0x31
};

PROGMEM const unsigned char chr_f64_39[] =
{
0x22, 0x88, 0x0F, 0x8C, 0x0C, 0x8F, 0x09, 0x91,
0x07, 0x86, 0x05, 0x86, 0x05, 0x85, 0x09, 0x84,
0x05, 0x84, 0x0B, 0x84, 0x04, 0x83, 0x0D, 0x83,
0x03, 0x84, 0x0D, 0x83, 0x03, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83,
0x02, 0x84, 0x0D, 0x84, 0x03, 0x83, 0x0D, 0x84,
0x03, 0x84, 0x0B, 0x85, 0x04, 0x84, 0x09, 0x86,
0x04, 0x86, 0x05, 0x88, 0x05, 0x94, 0x06, 0x8E,
0x00, 0x83, 0x07, 0x8B, 0x02, 0x83, 0x0A, 0x86,
0x04, 0x83, 0x16, 0x83, 0x15, 0x83, 0x16, 0x83,
0x03, 0x83, 0x0E, 0x83, 0x03, 0x83, 0x0D, 0x84,
0x03, 0x84, 0x0C, 0x83, 0x05, 0x83, 0x0B, 0x84,
0x05, 0x84, 0x09, 0x85, 0x06, 0x85, 0x05, 0x86,
0x08, 0x90, 0x0A, 0x8E, 0x0C, 0x8B, 0x11, 0x86,
0x7F, 0x7F, 0x33
};

PROGMEM const unsigned char chr_f64_3A[] =
{
0x7F, 0x1A, 0x84, 0x09, 0x84, 0x09, 0x84, 0x09,
0x84, 0x09, 0x84, 0x7F, 0x3D, 0x84, 0x09, 0x84,
0x09, 0x84, 0x09, 0x84, 0x09, 0x84, 0x7F, 0x74
};

PROGMEM const unsigned char chr_f64_61[] =
{
0x7F, 0x7B, 0x88, 0x0F, 0x8D, 0x0A, 0x90, 0x09,
0x91, 0x07, 0x85, 0x06, 0x85, 0x06, 0x84, 0x0A,
0x84, 0x05, 0x83, 0x0C, 0x83, 0x05, 0x83, 0x0C,
0x83, 0x05, 0x83, 0x0C, 0x83, 0x16, 0x83, 0x15,
0x84, 0x0E, 0x8B, 0x09, 0x90, 0x07, 0x92, 0x06,
0x8D, 0x01, 0x83, 0x05, 0x88, 0x07, 0x83, 0x05,
0x84, 0x0B, 0x83, 0x04, 0x84, 0x0C, 0x83, 0x04,
0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83, 0x04,
0x83, 0x0C, 0x84, 0x04, 0x83, 0x0B, 0x85, 0x04,
0x84, 0x09, 0x86, 0x05, 0x84, 0x06, 0x8A, 0x03,
0x8F, 0x01, 0x84, 0x04, 0x8D, 0x02, 0x84, 0x05,
0x8A, 0x05, 0x83, 0x07, 0x86, 0x7F, 0x7F, 0x35
};

PROGMEM const unsigned char chr_f64_6D[] =
{
0x7F, 0x7F, 0x7F, 0x05, 0x86, 0x07, 0x86, 0x0A,
0x83, 0x02, 0x89, 0x04, 0x8A, 0x08, 0x83, 0x00,
0x8C, 0x02, 0x8C, 0x07, 0x83, 0x00, 0x8D, 0x00,
0x8E, 0x06, 0x87, 0x05, 0x89, 0x05, 0x84, 0x06,
0x85, 0x08, 0x86, 0x08, 0x84, 0x05, 0x84, 0x0A,
0x84, 0x0A, 0x83, 0x05, 0x84, 0x0A, 0x84, 0x0A,
0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05,
0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B,
0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B,
0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05,
0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B,
0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B,
0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05,
0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B,
0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B,
0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05,
0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B,
0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B,
0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05,
0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B,
0x83, 0x0B, 0x83, 0x7F, 0x7F, 0x7F, 0x7A
};

PROGMEM const unsigned char chr_f64_70[] =
{
0x7F, 0x7F, 0x10, 0x86, 0x0C, 0x83, 0x02, 0x8B,
0x09, 0x83, 0x01, 0x8D, 0x08, 0x83, 0x00, 0x8F,
0x07, 0x88, 0x05, 0x86, 0x06, 0x86, 0x09, 0x84,
0x06, 0x85, 0x0B, 0x84, 0x05, 0x84, 0x0D, 0x83,
0x05, 0x84, 0x0D, 0x83, 0x05, 0x84, 0x0D, 0x84,
0x04, 0x83, 0x0F, 0x83, 0x04, 0x83, 0x0F, 0x83,
0x04, 0x83, 0x0F, 0x83, 0x04, 0x83, 0x0F, 0x83,
0x04, 0x83, 0x0F, 0x83, 0x04, 0x83, 0x0F, 0x83,
0x04, 0x83, 0x0F, 0x83, 0x04, 0x83, 0x0F, 0x83,
0x04, 0x83, 0x0E, 0x84, 0x04, 0x84, 0x0D, 0x83,
0x05, 0x84, 0x0C, 0x84, 0x05, 0x85, 0x0B, 0x84,
0x05, 0x86, 0x09, 0x84, 0x06, 0x88, 0x05, 0x86,
0x06, 0x83, 0x00, 0x8F, 0x07, 0x83, 0x01, 0x8D,
0x08, 0x83, 0x02, 0x8B, 0x09, 0x83, 0x04, 0x86,
0x0C, 0x83, 0x18, 0x83, 0x18, 0x83, 0x18, 0x83,
0x18, 0x83, 0x18, 0x83, 0x18, 0x83, 0x18, 0x83,
0x18, 0x83, 0x18, 0x83, 0x32
};
PROGMEM const unsigned char* const chrtbl_f64[96] = // character pointer table
{
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_2D, chr_f64_2E, chr_f64_20,
chr_f64_30, chr_f64_31, chr_f64_32, chr_f64_33, chr_f64_34, chr_f64_35, chr_f64_36, chr_f64_37,
chr_f64_38, chr_f64_39, chr_f64_3A, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
chr_f64_20, chr_f64_61, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_6D, chr_f64_20, chr_f64_20,
chr_f64_70, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20
};

+ 10
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font64rle.h 查看文件

@@ -0,0 +1,10 @@
#include <Fonts/Font64rle.c>

#define nr_chrs_f64 96
#define chr_hgt_f64 48
#define baseline_f64 36
#define data_size_f64 8
#define firstchr_f64 32

extern const unsigned char widtbl_f64[96];
extern const unsigned char* const chrtbl_f64[96];

+ 369
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font72rle.c 查看文件

@@ -0,0 +1,369 @@
// Font 8
//
// This font has been 8 bit Run Length Encoded to save FLASH space
//
// It is a Arial 75 pixel height font intended to display large numbers
// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : - .
// All other characters print as a space


PROGMEM const unsigned char widtbl_f72[96] = // character width table
{
29, 29, 29, 29, 29, 29, 29, 29, // char 32 - 39
29, 29, 29, 29, 29, 29, 29, 29, // char 40 - 47
55, 55, 55, 55, 55, 55, 55, 55, // char 48 - 55
55, 55, 29, 29, 29, 29, 29, 29, // char 56 - 63
29, 29, 29, 29, 29, 29, 29, 29, // char 64 - 71
29, 29, 29, 29, 29, 29, 29, 29, // char 72 - 79
29, 29, 29, 29, 29, 29, 29, 29, // char 80 - 87
29, 29, 29, 29, 29, 29, 29, 29, // char 88 - 95
29, 29, 29, 29, 29, 29, 29, 29, // char 96 - 103
29, 29, 29, 29, 29, 29, 29, 29, // char 104 - 111
29, 29, 29, 29, 29, 29, 29, 29, // char 112 - 119
29, 29, 29, 29, 29, 29, 29, 29 // char 120 - 127
};

// Row format, MSB left

PROGMEM const unsigned char chr_f72_20[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7E
};

PROGMEM const unsigned char chr_f72_2D[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x36, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91,
0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x07
};

PROGMEM const unsigned char chr_f72_2E[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x48, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x44
};

PROGMEM const unsigned char chr_f72_30[] =
{
0x7F, 0x70, 0x8A, 0x28, 0x90, 0x23, 0x94, 0x1F,
0x98, 0x1C, 0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16,
0xA0, 0x15, 0x8C, 0x06, 0x8C, 0x14, 0x8B, 0x0A,
0x8B, 0x12, 0x8A, 0x0E, 0x89, 0x12, 0x89, 0x10,
0x89, 0x11, 0x88, 0x12, 0x88, 0x10, 0x89, 0x12,
0x89, 0x0F, 0x88, 0x14, 0x88, 0x0E, 0x89, 0x14,
0x88, 0x0E, 0x88, 0x16, 0x88, 0x0D, 0x88, 0x16,
0x88, 0x0D, 0x88, 0x16, 0x88, 0x0C, 0x88, 0x18,
0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18,
0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18,
0x88, 0x0B, 0x88, 0x18, 0x88, 0x0A, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x0A, 0x88, 0x18,
0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18,
0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18,
0x88, 0x0B, 0x88, 0x18, 0x88, 0x0C, 0x88, 0x16,
0x88, 0x0D, 0x88, 0x16, 0x88, 0x0D, 0x88, 0x16,
0x88, 0x0D, 0x89, 0x14, 0x89, 0x0E, 0x88, 0x14,
0x88, 0x0F, 0x89, 0x12, 0x89, 0x10, 0x88, 0x12,
0x88, 0x11, 0x89, 0x10, 0x89, 0x11, 0x8A, 0x0E,
0x8A, 0x12, 0x8B, 0x0A, 0x8B, 0x14, 0x8C, 0x06,
0x8C, 0x15, 0xA0, 0x16, 0x9E, 0x18, 0x9C, 0x1A,
0x9A, 0x1C, 0x98, 0x1F, 0x94, 0x23, 0x90, 0x28,
0x8A, 0x4D
};

PROGMEM const unsigned char chr_f72_31[] =
{
0x7F, 0x78, 0x85, 0x2F, 0x86, 0x2F, 0x86, 0x2E,
0x87, 0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x89, 0x2B,
0x8A, 0x2A, 0x8B, 0x29, 0x8C, 0x27, 0x8E, 0x26,
0x8F, 0x25, 0x90, 0x24, 0x91, 0x22, 0x93, 0x20,
0x95, 0x1E, 0x8D, 0x00, 0x88, 0x1D, 0x8C, 0x02,
0x88, 0x1D, 0x8B, 0x03, 0x88, 0x1D, 0x8A, 0x04,
0x88, 0x1D, 0x88, 0x06, 0x88, 0x1D, 0x87, 0x07,
0x88, 0x1D, 0x85, 0x09, 0x88, 0x1D, 0x83, 0x0B,
0x88, 0x1D, 0x81, 0x0D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x7F, 0x1
};

PROGMEM const unsigned char chr_f72_32[] =
{
0x7F, 0x6F, 0x8A, 0x27, 0x92, 0x21, 0x96, 0x1D,
0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16, 0xA0, 0x14,
0xA2, 0x12, 0x8E, 0x07, 0x8D, 0x11, 0x8B, 0x0C,
0x8C, 0x0F, 0x8A, 0x10, 0x8A, 0x0F, 0x89, 0x12,
0x8A, 0x0D, 0x89, 0x14, 0x89, 0x0D, 0x89, 0x14,
0x89, 0x0D, 0x88, 0x16, 0x89, 0x0C, 0x88, 0x16,
0x89, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18,
0x88, 0x0B, 0x88, 0x18, 0x88, 0x0F, 0x84, 0x18,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2C,
0x89, 0x2C, 0x88, 0x2C, 0x89, 0x2C, 0x89, 0x2B,
0x89, 0x2C, 0x89, 0x2B, 0x89, 0x2B, 0x8A, 0x2A,
0x8A, 0x2A, 0x8B, 0x29, 0x8B, 0x29, 0x8B, 0x29,
0x8B, 0x29, 0x8B, 0x29, 0x8C, 0x28, 0x8C, 0x28,
0x8C, 0x28, 0x8C, 0x28, 0x8C, 0x27, 0x8C, 0x28,
0x8C, 0x28, 0x8C, 0x28, 0x8C, 0x28, 0x8C, 0x27,
0x8D, 0x27, 0x8D, 0x27, 0x8C, 0x28, 0x8C, 0x28,
0x8C, 0x29, 0x8B, 0x29, 0x8B, 0x29, 0x8A, 0x2A,
0x8A, 0x2B, 0x89, 0x2B, 0x8A, 0x2B, 0x89, 0x2B,
0x89, 0x2C, 0xAA, 0x0A, 0xAB, 0x0A, 0xAB, 0x0A,
0xAB, 0x09, 0xAC, 0x09, 0xAC, 0x09, 0xAC, 0x09,
0xAC, 0x09, 0xAC, 0x74
};

PROGMEM const unsigned char chr_f72_33[] =
{
0x7F, 0x6F, 0x89, 0x29, 0x90, 0x23, 0x94, 0x1F,
0x97, 0x1D, 0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16,
0xA0, 0x15, 0x8C, 0x06, 0x8C, 0x14, 0x8B, 0x0A,
0x8B, 0x12, 0x8A, 0x0E, 0x89, 0x12, 0x89, 0x10,
0x89, 0x11, 0x88, 0x12, 0x88, 0x10, 0x89, 0x12,
0x89, 0x0F, 0x88, 0x14, 0x88, 0x0F, 0x88, 0x14,
0x88, 0x0E, 0x89, 0x14, 0x88, 0x0E, 0x88, 0x15,
0x88, 0x12, 0x84, 0x15, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2C, 0x89, 0x2B,
0x89, 0x2B, 0x89, 0x2A, 0x8B, 0x28, 0x8C, 0x23,
0x91, 0x24, 0x8F, 0x26, 0x8D, 0x28, 0x8F, 0x25,
0x92, 0x23, 0x94, 0x21, 0x95, 0x20, 0x81, 0x07,
0x8C, 0x2B, 0x8B, 0x2C, 0x8A, 0x2C, 0x89, 0x2D,
0x89, 0x2D, 0x89, 0x2C, 0x89, 0x2D, 0x88, 0x2D,
0x89, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x0D, 0x84, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x89, 0x18,
0x89, 0x09, 0x89, 0x18, 0x88, 0x0B, 0x88, 0x18,
0x88, 0x0B, 0x89, 0x16, 0x89, 0x0B, 0x89, 0x15,
0x89, 0x0D, 0x89, 0x14, 0x89, 0x0D, 0x8A, 0x12,
0x89, 0x0F, 0x8A, 0x10, 0x8A, 0x0F, 0x8B, 0x0D,
0x8B, 0x11, 0x8D, 0x07, 0x8D, 0x13, 0xA2, 0x14,
0xA0, 0x16, 0x9D, 0x19, 0x9B, 0x1B, 0x99, 0x1E,
0x95, 0x22, 0x91, 0x28, 0x89, 0x4E
};

PROGMEM const unsigned char chr_f72_34[] =
{
0x7F, 0x7F, 0x34, 0x86, 0x2E, 0x87, 0x2D, 0x88,
0x2C, 0x89, 0x2C, 0x89, 0x2B, 0x8A, 0x2A, 0x8B,
0x29, 0x8C, 0x28, 0x8D, 0x28, 0x8D, 0x27, 0x8E,
0x26, 0x8F, 0x25, 0x90, 0x25, 0x90, 0x24, 0x91,
0x23, 0x92, 0x22, 0x93, 0x22, 0x93, 0x21, 0x8A,
0x00, 0x88, 0x20, 0x8A, 0x01, 0x88, 0x1F, 0x8A,
0x02, 0x88, 0x1E, 0x8B, 0x02, 0x88, 0x1E, 0x8A,
0x03, 0x88, 0x1D, 0x8A, 0x04, 0x88, 0x1C, 0x8A,
0x05, 0x88, 0x1B, 0x8A, 0x06, 0x88, 0x1B, 0x8A,
0x06, 0x88, 0x1A, 0x8A, 0x07, 0x88, 0x19, 0x8A,
0x08, 0x88, 0x18, 0x8A, 0x09, 0x88, 0x18, 0x8A,
0x09, 0x88, 0x17, 0x8A, 0x0A, 0x88, 0x16, 0x8A,
0x0B, 0x88, 0x15, 0x8A, 0x0C, 0x88, 0x15, 0x8A,
0x0C, 0x88, 0x14, 0x8A, 0x0D, 0x88, 0x13, 0x8A,
0x0E, 0x88, 0x12, 0x8A, 0x0F, 0x88, 0x11, 0x8B,
0x0F, 0x88, 0x11, 0x8A, 0x10, 0x88, 0x10, 0x8A,
0x11, 0x88, 0x0F, 0x8A, 0x12, 0x88, 0x0E, 0x8A,
0x13, 0x88, 0x0E, 0xAF, 0x06, 0xAF, 0x06, 0xAF,
0x06, 0xAF, 0x06, 0xAF, 0x06, 0xAF, 0x06, 0xAF,
0x06, 0xAF, 0x06, 0xAF, 0x25, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x7B
};

PROGMEM const unsigned char chr_f72_35[] =
{
0x7F, 0x7F, 0x1E, 0xA0, 0x15, 0xA0, 0x14, 0xA1,
0x14, 0xA1, 0x14, 0xA1, 0x14, 0xA1, 0x14, 0xA1,
0x13, 0xA2, 0x13, 0xA2, 0x13, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2C, 0x89, 0x2C, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x89, 0x2C, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x89,
0x06, 0x88, 0x1C, 0x89, 0x03, 0x8E, 0x19, 0x88,
0x02, 0x92, 0x17, 0x88, 0x00, 0x96, 0x15, 0xA1,
0x13, 0xA3, 0x12, 0xA4, 0x11, 0xA5, 0x10, 0x8F,
0x07, 0x8E, 0x0F, 0x8C, 0x0D, 0x8C, 0x0D, 0x8B,
0x11, 0x8A, 0x0D, 0x8A, 0x13, 0x8A, 0x0C, 0x89,
0x15, 0x89, 0x10, 0x84, 0x17, 0x89, 0x2C, 0x89,
0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x89, 0x2D, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x0D, 0x84, 0x1A, 0x88, 0x09, 0x88, 0x19, 0x88,
0x0A, 0x89, 0x18, 0x88, 0x0A, 0x89, 0x18, 0x88,
0x0B, 0x88, 0x17, 0x89, 0x0B, 0x89, 0x16, 0x88,
0x0C, 0x89, 0x15, 0x89, 0x0D, 0x89, 0x13, 0x89,
0x0E, 0x8A, 0x11, 0x8A, 0x0E, 0x8B, 0x0F, 0x8A,
0x10, 0x8B, 0x0D, 0x8A, 0x12, 0x8D, 0x07, 0x8D,
0x12, 0xA2, 0x14, 0xA0, 0x16, 0x9E, 0x19, 0x9B,
0x1B, 0x98, 0x1F, 0x95, 0x22, 0x90, 0x28, 0x8A,
0x4E
};

PROGMEM const unsigned char chr_f72_36[] =
{
0x7F, 0x72, 0x89, 0x28, 0x90, 0x23, 0x95, 0x1E,
0x98, 0x1C, 0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16,
0xA0, 0x14, 0x8D, 0x06, 0x8D, 0x12, 0x8B, 0x0B,
0x8B, 0x12, 0x8A, 0x0E, 0x8A, 0x10, 0x89, 0x11,
0x89, 0x0F, 0x8A, 0x12, 0x89, 0x0E, 0x89, 0x13,
0x89, 0x0E, 0x88, 0x15, 0x88, 0x0D, 0x89, 0x15,
0x89, 0x0C, 0x88, 0x16, 0x89, 0x0B, 0x89, 0x17,
0x88, 0x0B, 0x88, 0x18, 0x84, 0x0F, 0x88, 0x2D,
0x87, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x88, 0x0A, 0x88, 0x19, 0x87, 0x08, 0x8E, 0x16,
0x87, 0x06, 0x92, 0x13, 0x88, 0x04, 0x96, 0x11,
0x88, 0x03, 0x98, 0x10, 0x88, 0x02, 0x9A, 0x0F,
0x88, 0x01, 0x9C, 0x0E, 0x88, 0x00, 0x9E, 0x0D,
0x92, 0x07, 0x8E, 0x0C, 0x90, 0x0C, 0x8C, 0x0B,
0x8E, 0x10, 0x8A, 0x0B, 0x8D, 0x12, 0x8A, 0x0A,
0x8C, 0x14, 0x89, 0x0A, 0x8B, 0x16, 0x89, 0x09,
0x8A, 0x17, 0x89, 0x09, 0x89, 0x19, 0x88, 0x09,
0x89, 0x19, 0x88, 0x09, 0x89, 0x19, 0x89, 0x08,
0x88, 0x1B, 0x88, 0x08, 0x88, 0x1B, 0x88, 0x08,
0x88, 0x1B, 0x88, 0x08, 0x88, 0x1B, 0x88, 0x09,
0x87, 0x1B, 0x88, 0x09, 0x87, 0x1B, 0x88, 0x09,
0x87, 0x1B, 0x88, 0x09, 0x87, 0x1B, 0x88, 0x09,
0x88, 0x1A, 0x88, 0x0A, 0x87, 0x19, 0x89, 0x0A,
0x87, 0x19, 0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B,
0x88, 0x17, 0x89, 0x0C, 0x88, 0x16, 0x88, 0x0D,
0x88, 0x15, 0x89, 0x0E, 0x88, 0x14, 0x89, 0x0E,
0x89, 0x12, 0x89, 0x10, 0x89, 0x10, 0x8A, 0x10,
0x8B, 0x0C, 0x8B, 0x12, 0x8C, 0x07, 0x8D, 0x14,
0xA1, 0x15, 0x9F, 0x17, 0x9D, 0x19, 0x9B, 0x1C,
0x97, 0x1F, 0x95, 0x23, 0x8F, 0x29, 0x89, 0x4D
};

PROGMEM const unsigned char chr_f72_37[] =
{
0x7F, 0x7F, 0x17, 0xAB, 0x0A, 0xAB, 0x0A, 0xAB,
0x0A, 0xAB, 0x0A, 0xAB, 0x0A, 0xAB, 0x0A, 0xAB,
0x0A, 0xAB, 0x0A, 0xAA, 0x2E, 0x86, 0x2E, 0x86,
0x2E, 0x87, 0x2D, 0x87, 0x2D, 0x87, 0x2D, 0x87,
0x2E, 0x87, 0x2D, 0x87, 0x2D, 0x87, 0x2E, 0x87,
0x2D, 0x87, 0x2D, 0x88, 0x2D, 0x87, 0x2D, 0x87,
0x2D, 0x88, 0x2D, 0x87, 0x2D, 0x88, 0x2D, 0x87,
0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2C, 0x88,
0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2C, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88,
0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x89,
0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88,
0x2D, 0x88, 0x7F, 0xC
};

PROGMEM const unsigned char chr_f72_38[] =
{
0x7F, 0x70, 0x89, 0x28, 0x91, 0x22, 0x95, 0x1E,
0x99, 0x1B, 0x9B, 0x19, 0x9D, 0x17, 0x9F, 0x15,
0xA1, 0x13, 0x8D, 0x07, 0x8C, 0x13, 0x8B, 0x0B,
0x8B, 0x11, 0x8A, 0x0F, 0x8A, 0x10, 0x89, 0x11,
0x89, 0x10, 0x88, 0x13, 0x88, 0x0F, 0x89, 0x13,
0x89, 0x0E, 0x88, 0x15, 0x88, 0x0E, 0x88, 0x15,
0x88, 0x0E, 0x88, 0x15, 0x88, 0x0E, 0x88, 0x15,
0x88, 0x0E, 0x88, 0x15, 0x88, 0x0E, 0x88, 0x15,
0x88, 0x0E, 0x88, 0x15, 0x88, 0x0F, 0x88, 0x13,
0x88, 0x10, 0x88, 0x13, 0x88, 0x10, 0x89, 0x11,
0x89, 0x11, 0x89, 0x0F, 0x89, 0x13, 0x89, 0x0D,
0x89, 0x15, 0x8B, 0x07, 0x8C, 0x16, 0x9D, 0x19,
0x9B, 0x1C, 0x97, 0x20, 0x93, 0x20, 0x96, 0x1D,
0x9A, 0x1A, 0x9D, 0x17, 0x9F, 0x15, 0x8C, 0x07,
0x8C, 0x13, 0x8A, 0x0C, 0x8B, 0x11, 0x8A, 0x0F,
0x8A, 0x0F, 0x8A, 0x11, 0x89, 0x0F, 0x89, 0x13,
0x89, 0x0D, 0x89, 0x15, 0x88, 0x0D, 0x89, 0x15,
0x89, 0x0C, 0x88, 0x17, 0x88, 0x0C, 0x88, 0x17,
0x88, 0x0B, 0x88, 0x19, 0x88, 0x0A, 0x88, 0x19,
0x88, 0x0A, 0x88, 0x19, 0x88, 0x0A, 0x88, 0x19,
0x88, 0x0A, 0x88, 0x19, 0x88, 0x0A, 0x88, 0x19,
0x88, 0x0A, 0x88, 0x19, 0x88, 0x0A, 0x88, 0x19,
0x88, 0x0A, 0x88, 0x19, 0x88, 0x0A, 0x89, 0x17,
0x89, 0x0B, 0x88, 0x17, 0x88, 0x0C, 0x89, 0x15,
0x89, 0x0C, 0x89, 0x15, 0x89, 0x0D, 0x89, 0x13,
0x89, 0x0E, 0x8A, 0x11, 0x8A, 0x0F, 0x8A, 0x0F,
0x8A, 0x10, 0x8C, 0x0C, 0x8B, 0x11, 0x8D, 0x07,
0x8D, 0x13, 0xA1, 0x15, 0x9F, 0x17, 0x9D, 0x19,
0x9B, 0x1B, 0x99, 0x1E, 0x95, 0x22, 0x91, 0x28,
0x89, 0x4E
};

PROGMEM const unsigned char chr_f72_39[] =
{
0x7F, 0x70, 0x88, 0x29, 0x90, 0x23, 0x94, 0x20,
0x97, 0x1C, 0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16,
0xA0, 0x14, 0x8E, 0x07, 0x8B, 0x13, 0x8C, 0x0B,
0x8A, 0x11, 0x8B, 0x0F, 0x88, 0x11, 0x8A, 0x11,
0x88, 0x0F, 0x8A, 0x13, 0x88, 0x0E, 0x89, 0x14,
0x88, 0x0D, 0x89, 0x16, 0x87, 0x0D, 0x89, 0x17,
0x87, 0x0C, 0x88, 0x18, 0x87, 0x0C, 0x88, 0x18,
0x87, 0x0B, 0x89, 0x19, 0x87, 0x0A, 0x88, 0x1A,
0x87, 0x0A, 0x88, 0x1A, 0x87, 0x0A, 0x88, 0x1A,
0x87, 0x0A, 0x88, 0x1A, 0x87, 0x0A, 0x88, 0x1A,
0x87, 0x0A, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A,
0x88, 0x09, 0x89, 0x18, 0x89, 0x0A, 0x88, 0x18,
0x89, 0x0A, 0x88, 0x18, 0x89, 0x0A, 0x89, 0x16,
0x8A, 0x0A, 0x89, 0x16, 0x8A, 0x0B, 0x89, 0x14,
0x8B, 0x0B, 0x8A, 0x12, 0x8C, 0x0C, 0x8A, 0x10,
0x8D, 0x0C, 0x8C, 0x0C, 0x8F, 0x0D, 0x8E, 0x07,
0x91, 0x0E, 0x9D, 0x00, 0x88, 0x0F, 0x9B, 0x01,
0x88, 0x10, 0x99, 0x02, 0x88, 0x11, 0x97, 0x03,
0x88, 0x12, 0x95, 0x04, 0x88, 0x13, 0x92, 0x06,
0x87, 0x16, 0x8E, 0x08, 0x87, 0x19, 0x88, 0x0A,
0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D,
0x87, 0x2D, 0x88, 0x10, 0x84, 0x17, 0x88, 0x0C,
0x88, 0x17, 0x88, 0x0C, 0x89, 0x15, 0x88, 0x0D,
0x89, 0x15, 0x88, 0x0E, 0x88, 0x14, 0x89, 0x0E,
0x89, 0x13, 0x88, 0x0F, 0x89, 0x12, 0x89, 0x10,
0x89, 0x10, 0x89, 0x11, 0x8A, 0x0E, 0x8A, 0x11,
0x8B, 0x0B, 0x8B, 0x13, 0x8C, 0x07, 0x8C, 0x15,
0x9F, 0x16, 0x9E, 0x18, 0x9C, 0x1A, 0x9A, 0x1D,
0x97, 0x1F, 0x94, 0x23, 0x90, 0x28, 0x89, 0x50
};

PROGMEM const unsigned char chr_f72_3A[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x23, 0x88, 0x13,
0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13,
0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x33, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x44
};
PROGMEM const unsigned char * const chrtbl_f72[96] = // character pointer table
{
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_2D, chr_f72_2E, chr_f72_20,
chr_f72_30, chr_f72_31, chr_f72_32, chr_f72_33, chr_f72_34, chr_f72_35, chr_f72_36, chr_f72_37,
chr_f72_38, chr_f72_39, chr_f72_3A, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20
};

+ 10
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font72rle.h 查看文件

@@ -0,0 +1,10 @@
#include <Fonts/Font72rle.c>

#define nr_chrs_f72 96
#define chr_hgt_f72 75
#define baseline_f72 73
#define data_size_f72 8
#define firstchr_f72 32

extern const unsigned char widtbl_f72[96];
extern const unsigned char* const chrtbl_f72[96];

+ 245
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font72x53rle.c 查看文件

@@ -0,0 +1,245 @@
// Font 8
//
// This font has been 8 bit Run Length Encoded to save FLASH space
//
// It is a Arial 75 pixel height font intended to display large numbers
// Width for numerals reduced from 55 to 53 (to fit in 160 pixel screens)
// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : - .
// All other characters print as a space


PROGMEM const unsigned char widtbl_f72[96] = // character width table
{
29, 29, 29, 29, 29, 29, 29, 29, // char 32 - 39
29, 29, 29, 29, 29, 29, 29, 29, // char 40 - 47
53, 53, 53, 53, 53, 53, 53, 53, // char 48 - 55
53, 53, 29, 29, 29, 29, 29, 29, // char 56 - 63
29, 29, 29, 29, 29, 29, 29, 29, // char 64 - 71
29, 29, 29, 29, 29, 29, 29, 29, // char 72 - 79
29, 29, 29, 29, 29, 29, 29, 29, // char 80 - 87
29, 29, 29, 29, 29, 29, 29, 29, // char 88 - 95
29, 29, 29, 29, 29, 29, 29, 29, // char 96 - 103
29, 29, 29, 29, 29, 29, 29, 29, // char 104 - 111
29, 29, 29, 29, 29, 29, 29, 29, // char 112 - 119
29, 29, 29, 29, 29, 29, 29, 29 // char 120 - 127
};

// Row format, MSB left

PROGMEM const unsigned char chr_f72_20[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7E
};

PROGMEM const unsigned char chr_f72_2D[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x36, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91,
0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x07
};

PROGMEM const unsigned char chr_f72_2E[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x48, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x44
};

PROGMEM const unsigned char chr_f72_30[] =
{
0x7F, 0x68, 0x8A, 0x26, 0x90, 0x21, 0x94, 0x1D, 0x98, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14,
0xA0, 0x13, 0x8C, 0x06, 0x8C, 0x12, 0x8B, 0x0A, 0x8B, 0x10, 0x8A, 0x0E, 0x89, 0x10, 0x89, 0x10,
0x89, 0x0F, 0x88, 0x12, 0x88, 0x0E, 0x89, 0x12, 0x89, 0x0D, 0x88, 0x14, 0x88, 0x0C, 0x89, 0x14,
0x88, 0x0C, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0A, 0x88, 0x18,
0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18,
0x88, 0x09, 0x88, 0x18, 0x88, 0x08, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x08, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18,
0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x0A, 0x88, 0x16,
0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x89, 0x14, 0x89, 0x0C, 0x88, 0x14,
0x88, 0x0D, 0x89, 0x12, 0x89, 0x0E, 0x88, 0x12, 0x88, 0x0F, 0x89, 0x10, 0x89, 0x0F, 0x8A, 0x0E,
0x8A, 0x10, 0x8B, 0x0A, 0x8B, 0x12, 0x8C, 0x06, 0x8C, 0x13, 0xA0, 0x14, 0x9E, 0x16, 0x9C, 0x18,
0x9A, 0x1A, 0x98, 0x1D, 0x94, 0x21, 0x90, 0x26, 0x8A, 0x49
};

PROGMEM const unsigned char chr_f72_31[] =
{
0x7F, 0x70, 0x85, 0x2D, 0x86, 0x2D, 0x86, 0x2C, 0x87, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x29,
0x8A, 0x28, 0x8B, 0x27, 0x8C, 0x25, 0x8E, 0x24, 0x8F, 0x23, 0x90, 0x22, 0x91, 0x20, 0x93, 0x1E,
0x95, 0x1C, 0x8D, 0x00, 0x88, 0x1B, 0x8C, 0x02, 0x88, 0x1B, 0x8B, 0x03, 0x88, 0x1B, 0x8A, 0x04,
0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x87, 0x07, 0x88, 0x1B, 0x85, 0x09, 0x88, 0x1B, 0x83, 0x0B,
0x88, 0x1B, 0x81, 0x0D, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x7B
};

PROGMEM const unsigned char chr_f72_32[] =
{
0x7F, 0x67, 0x8A, 0x25, 0x92, 0x1F, 0x96, 0x1B, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14, 0xA0, 0x12,
0xA2, 0x10, 0x8E, 0x07, 0x8D, 0x0F, 0x8B, 0x0C, 0x8C, 0x0D, 0x8A, 0x10, 0x8A, 0x0D, 0x89, 0x12,
0x8A, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x88, 0x16, 0x89, 0x0A, 0x88, 0x16,
0x89, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x0D, 0x84, 0x18,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2A, 0x89, 0x2A, 0x89, 0x29,
0x89, 0x2A, 0x89, 0x29, 0x89, 0x29, 0x8A, 0x28, 0x8A, 0x28, 0x8B, 0x27, 0x8B, 0x27, 0x8B, 0x27,
0x8B, 0x27, 0x8B, 0x27, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x25, 0x8C, 0x26,
0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x25, 0x8D, 0x25, 0x8D, 0x25, 0x8C, 0x26, 0x8C, 0x26,
0x8C, 0x27, 0x8B, 0x27, 0x8B, 0x27, 0x8A, 0x28, 0x8A, 0x29, 0x89, 0x29, 0x8A, 0x29, 0x89, 0x29,
0x89, 0x2A, 0xAA, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x07, 0xAC, 0x07, 0xAC, 0x07, 0xAC, 0x07,
0xAC, 0x07, 0xAC, 0x6E
};

PROGMEM const unsigned char chr_f72_33[] =
{
0x7F, 0x67, 0x89, 0x27, 0x90, 0x21, 0x94, 0x1D, 0x97, 0x1B, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14,
0xA0, 0x13, 0x8C, 0x06, 0x8C, 0x12, 0x8B, 0x0A, 0x8B, 0x10, 0x8A, 0x0E, 0x89, 0x10, 0x89, 0x10,
0x89, 0x0F, 0x88, 0x12, 0x88, 0x0E, 0x89, 0x12, 0x89, 0x0D, 0x88, 0x14, 0x88, 0x0D, 0x88, 0x14,
0x88, 0x0C, 0x89, 0x14, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x10, 0x84, 0x15, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x29, 0x89, 0x29, 0x89, 0x28, 0x8B, 0x26, 0x8C, 0x21,
0x91, 0x22, 0x8F, 0x24, 0x8D, 0x26, 0x8F, 0x23, 0x92, 0x21, 0x94, 0x1F, 0x95, 0x1E, 0x81, 0x07,
0x8C, 0x29, 0x8B, 0x2A, 0x8A, 0x2A, 0x89, 0x2B, 0x89, 0x2B, 0x89, 0x2A, 0x89, 0x2B, 0x88, 0x2B,
0x89, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0B, 0x84, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x89, 0x18, 0x89, 0x07, 0x89, 0x18, 0x88, 0x09, 0x88, 0x18,
0x88, 0x09, 0x89, 0x16, 0x89, 0x09, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x8A, 0x12,
0x89, 0x0D, 0x8A, 0x10, 0x8A, 0x0D, 0x8B, 0x0D, 0x8B, 0x0F, 0x8D, 0x07, 0x8D, 0x11, 0xA2, 0x12,
0xA0, 0x14, 0x9D, 0x17, 0x9B, 0x19, 0x99, 0x1C, 0x95, 0x20, 0x91, 0x26, 0x89, 0x4A
};

PROGMEM const unsigned char chr_f72_34[] =
{
0x7F, 0x7F, 0x2A, 0x86, 0x2C, 0x87, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x89, 0x29, 0x8A, 0x28, 0x8B,
0x27, 0x8C, 0x26, 0x8D, 0x26, 0x8D, 0x25, 0x8E, 0x24, 0x8F, 0x23, 0x90, 0x23, 0x90, 0x22, 0x91,
0x21, 0x92, 0x20, 0x93, 0x20, 0x93, 0x1F, 0x8A, 0x00, 0x88, 0x1E, 0x8A, 0x01, 0x88, 0x1D, 0x8A,
0x02, 0x88, 0x1C, 0x8B, 0x02, 0x88, 0x1C, 0x8A, 0x03, 0x88, 0x1B, 0x8A, 0x04, 0x88, 0x1A, 0x8A,
0x05, 0x88, 0x19, 0x8A, 0x06, 0x88, 0x19, 0x8A, 0x06, 0x88, 0x18, 0x8A, 0x07, 0x88, 0x17, 0x8A,
0x08, 0x88, 0x16, 0x8A, 0x09, 0x88, 0x16, 0x8A, 0x09, 0x88, 0x15, 0x8A, 0x0A, 0x88, 0x14, 0x8A,
0x0B, 0x88, 0x13, 0x8A, 0x0C, 0x88, 0x13, 0x8A, 0x0C, 0x88, 0x12, 0x8A, 0x0D, 0x88, 0x11, 0x8A,
0x0E, 0x88, 0x10, 0x8A, 0x0F, 0x88, 0x0F, 0x8B, 0x0F, 0x88, 0x0F, 0x8A, 0x10, 0x88, 0x0E, 0x8A,
0x11, 0x88, 0x0D, 0x8A, 0x12, 0x88, 0x0C, 0x8A, 0x13, 0x88, 0x0C, 0xAF, 0x04, 0xAF, 0x04, 0xAF,
0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x23, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x75
};

PROGMEM const unsigned char chr_f72_35[] =
{
0x7F, 0x7F, 0x14, 0xA0, 0x13, 0xA0, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1,
0x11, 0xA2, 0x11, 0xA2, 0x11, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89,
0x06, 0x88, 0x1A, 0x89, 0x03, 0x8E, 0x17, 0x88, 0x02, 0x92, 0x15, 0x88, 0x00, 0x96, 0x13, 0xA1,
0x11, 0xA3, 0x10, 0xA4, 0x0F, 0xA5, 0x0E, 0x8F, 0x07, 0x8E, 0x0D, 0x8C, 0x0D, 0x8C, 0x0B, 0x8B,
0x11, 0x8A, 0x0B, 0x8A, 0x13, 0x8A, 0x0A, 0x89, 0x15, 0x89, 0x0E, 0x84, 0x17, 0x89, 0x2A, 0x89,
0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x89, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0B, 0x84, 0x1A, 0x88, 0x07, 0x88, 0x19, 0x88,
0x08, 0x89, 0x18, 0x88, 0x08, 0x89, 0x18, 0x88, 0x09, 0x88, 0x17, 0x89, 0x09, 0x89, 0x16, 0x88,
0x0A, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x13, 0x89, 0x0C, 0x8A, 0x11, 0x8A, 0x0C, 0x8B, 0x0F, 0x8A,
0x0E, 0x8B, 0x0D, 0x8A, 0x10, 0x8D, 0x07, 0x8D, 0x10, 0xA2, 0x12, 0xA0, 0x14, 0x9E, 0x17, 0x9B,
0x19, 0x98, 0x1D, 0x95, 0x20, 0x90, 0x26, 0x8A, 0x4A
};

PROGMEM const unsigned char chr_f72_36[] =
{
0x7F, 0x6A, 0x89, 0x26, 0x90, 0x21, 0x95, 0x1C, 0x98, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14,
0xA0, 0x12, 0x8D, 0x06, 0x8D, 0x10, 0x8B, 0x0B, 0x8B, 0x10, 0x8A, 0x0E, 0x8A, 0x0E, 0x89, 0x11,
0x89, 0x0D, 0x8A, 0x12, 0x89, 0x0C, 0x89, 0x13, 0x89, 0x0C, 0x88, 0x15, 0x88, 0x0B, 0x89, 0x15,
0x89, 0x0A, 0x88, 0x16, 0x89, 0x09, 0x89, 0x17, 0x88, 0x09, 0x88, 0x18, 0x84, 0x0D, 0x88, 0x2B,
0x87, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0A, 0x88, 0x17, 0x87, 0x08, 0x8E, 0x14,
0x87, 0x06, 0x92, 0x11, 0x88, 0x04, 0x96, 0x0F, 0x88, 0x03, 0x98, 0x0E, 0x88, 0x02, 0x9A, 0x0D,
0x88, 0x01, 0x9C, 0x0C, 0x88, 0x00, 0x9E, 0x0B, 0x92, 0x07, 0x8E, 0x0A, 0x90, 0x0C, 0x8C, 0x09,
0x8E, 0x10, 0x8A, 0x09, 0x8D, 0x12, 0x8A, 0x08, 0x8C, 0x14, 0x89, 0x08, 0x8B, 0x16, 0x89, 0x07,
0x8A, 0x17, 0x89, 0x07, 0x89, 0x19, 0x88, 0x07, 0x89, 0x19, 0x88, 0x07, 0x89, 0x19, 0x89, 0x06,
0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x07,
0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07,
0x88, 0x1A, 0x88, 0x08, 0x87, 0x19, 0x89, 0x08, 0x87, 0x19, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09,
0x88, 0x17, 0x89, 0x0A, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x15, 0x89, 0x0C, 0x88, 0x14, 0x89, 0x0C,
0x89, 0x12, 0x89, 0x0E, 0x89, 0x10, 0x8A, 0x0E, 0x8B, 0x0C, 0x8B, 0x10, 0x8C, 0x07, 0x8D, 0x12,
0xA1, 0x13, 0x9F, 0x15, 0x9D, 0x17, 0x9B, 0x1A, 0x97, 0x1D, 0x95, 0x21, 0x8F, 0x27, 0x89, 0x49

};

PROGMEM const unsigned char chr_f72_37[] =
{
0x7F, 0x7F, 0x0D, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB,
0x08, 0xAB, 0x08, 0xAA, 0x2C, 0x86, 0x2C, 0x86, 0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x87, 0x2B, 0x87,
0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x87, 0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x87,
0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x88,
0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88,
0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89,
0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x7F, 0x06
};

PROGMEM const unsigned char chr_f72_38[] =
{
0x7F, 0x68, 0x89, 0x26, 0x91, 0x20, 0x95, 0x1C, 0x99, 0x19, 0x9B, 0x17, 0x9D, 0x15, 0x9F, 0x13,
0xA1, 0x11, 0x8D, 0x07, 0x8C, 0x11, 0x8B, 0x0B, 0x8B, 0x0F, 0x8A, 0x0F, 0x8A, 0x0E, 0x89, 0x11,
0x89, 0x0E, 0x88, 0x13, 0x88, 0x0D, 0x89, 0x13, 0x89, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15,
0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15,
0x88, 0x0C, 0x88, 0x15, 0x88, 0x0D, 0x88, 0x13, 0x88, 0x0E, 0x88, 0x13, 0x88, 0x0E, 0x89, 0x11,
0x89, 0x0F, 0x89, 0x0F, 0x89, 0x11, 0x89, 0x0D, 0x89, 0x13, 0x8B, 0x07, 0x8C, 0x14, 0x9D, 0x17,
0x9B, 0x1A, 0x97, 0x1E, 0x93, 0x1E, 0x96, 0x1B, 0x9A, 0x18, 0x9D, 0x15, 0x9F, 0x13, 0x8C, 0x07,
0x8C, 0x11, 0x8A, 0x0C, 0x8B, 0x0F, 0x8A, 0x0F, 0x8A, 0x0D, 0x8A, 0x11, 0x89, 0x0D, 0x89, 0x13,
0x89, 0x0B, 0x89, 0x15, 0x88, 0x0B, 0x89, 0x15, 0x89, 0x0A, 0x88, 0x17, 0x88, 0x0A, 0x88, 0x17,
0x88, 0x09, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19,
0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19,
0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x89, 0x17, 0x89, 0x09, 0x88, 0x17, 0x88, 0x0A, 0x89, 0x15,
0x89, 0x0A, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x13, 0x89, 0x0C, 0x8A, 0x11, 0x8A, 0x0D, 0x8A, 0x0F,
0x8A, 0x0E, 0x8C, 0x0C, 0x8B, 0x0F, 0x8D, 0x07, 0x8D, 0x11, 0xA1, 0x13, 0x9F, 0x15, 0x9D, 0x17,
0x9B, 0x19, 0x99, 0x1C, 0x95, 0x20, 0x91, 0x26, 0x89, 0x4A
};

PROGMEM const unsigned char chr_f72_39[] =
{
0x7F, 0x68, 0x88, 0x27, 0x90, 0x21, 0x94, 0x1E, 0x97, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14,
0xA0, 0x12, 0x8E, 0x07, 0x8B, 0x11, 0x8C, 0x0B, 0x8A, 0x0F, 0x8B, 0x0F, 0x88, 0x0F, 0x8A, 0x11,
0x88, 0x0D, 0x8A, 0x13, 0x88, 0x0C, 0x89, 0x14, 0x88, 0x0B, 0x89, 0x16, 0x87, 0x0B, 0x89, 0x17,
0x87, 0x0A, 0x88, 0x18, 0x87, 0x0A, 0x88, 0x18, 0x87, 0x09, 0x89, 0x19, 0x87, 0x08, 0x88, 0x1A,
0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A,
0x87, 0x08, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x89, 0x18, 0x89, 0x08, 0x88, 0x18, 0x89, 0x08, 0x88, 0x18, 0x89, 0x08, 0x89, 0x16,
0x8A, 0x08, 0x89, 0x16, 0x8A, 0x09, 0x89, 0x14, 0x8B, 0x09, 0x8A, 0x12, 0x8C, 0x0A, 0x8A, 0x10,
0x8D, 0x0A, 0x8C, 0x0C, 0x8F, 0x0B, 0x8E, 0x07, 0x91, 0x0C, 0x9D, 0x00, 0x88, 0x0D, 0x9B, 0x01,
0x88, 0x0E, 0x99, 0x02, 0x88, 0x0F, 0x97, 0x03, 0x88, 0x10, 0x95, 0x04, 0x88, 0x11, 0x92, 0x06,
0x87, 0x14, 0x8E, 0x08, 0x87, 0x17, 0x88, 0x0A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x87, 0x2B, 0x88, 0x0E, 0x84, 0x17, 0x88, 0x0A, 0x88, 0x17, 0x88, 0x0A, 0x89, 0x15, 0x88, 0x0B,
0x89, 0x15, 0x88, 0x0C, 0x88, 0x14, 0x89, 0x0C, 0x89, 0x13, 0x88, 0x0D, 0x89, 0x12, 0x89, 0x0E,
0x89, 0x10, 0x89, 0x0F, 0x8A, 0x0E, 0x8A, 0x0F, 0x8B, 0x0B, 0x8B, 0x11, 0x8C, 0x07, 0x8C, 0x13,
0x9F, 0x14, 0x9E, 0x16, 0x9C, 0x18, 0x9A, 0x1B, 0x97, 0x1D, 0x94, 0x21, 0x90, 0x26, 0x89, 0x4C
};

PROGMEM const unsigned char chr_f72_3A[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x23, 0x88, 0x13,
0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13,
0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x33, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x44
};
PROGMEM const unsigned char * const chrtbl_f72[96] = // character pointer table
{
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_2D, chr_f72_2E, chr_f72_20,
chr_f72_30, chr_f72_31, chr_f72_32, chr_f72_33, chr_f72_34, chr_f72_35, chr_f72_36, chr_f72_37,
chr_f72_38, chr_f72_39, chr_f72_3A, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20
};

+ 10
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font72x53rle.h 查看文件

@@ -0,0 +1,10 @@
#include <Fonts/Font72x53rle.c>

#define nr_chrs_f72 96
#define chr_hgt_f72 75
#define baseline_f72 73
#define data_size_f72 8
#define firstchr_f72 32

extern const unsigned char widtbl_f72[96];
extern const unsigned char* const chrtbl_f72[96];

+ 266
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font7srle.c 查看文件

@@ -0,0 +1,266 @@
// Font 7
//
// This font has been 8 bit Run Length Encoded to save FLASH space
//
// This is a 7 segment font intended to display numbers and time
// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : . -
// All other characters print as a space


PROGMEM const unsigned char widtbl_f7s[96] = // character width table
{
12, 12, 12, 12, 12, 12, 12, 12, // char 32 - 39
12, 12, 12, 12, 12, 32, 12, 12, // char 40 - 47
32, 32, 32, 32, 32, 32, 32, 32, // char 48 - 55
32, 32, 12, 12, 12, 12, 12, 12, // char 56 - 63
12, 12, 12, 12, 12, 12, 12, 12, // char 64 - 71
12, 12, 12, 12, 12, 12, 12, 12, // char 72 - 79
12, 12, 12, 12, 12, 12, 12, 12, // char 80 - 87
12, 12, 12, 12, 12, 12, 12, 12, // char 88 - 95
12, 12, 12, 12, 12, 12, 12, 12, // char 96 - 103
12, 12, 12, 12, 12, 12, 12, 12, // char 104 - 111
12, 12, 12, 12, 12, 12, 12, 12, // char 112 - 119
12, 12, 12, 12, 12, 12, 12, 12 // char 120 - 127
};

// Row format, MSB left

PROGMEM const unsigned char chr_f7s_20[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x3F
};

// Make - sign look like a segment
PROGMEM const unsigned char chr_f7s_2D[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x27, 0x8E, 0x0E,
0x92, 0x0A, 0x96, 0x09, 0x94, 0x0C, 0x90, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x47
};

PROGMEM const unsigned char chr_f7s_2E[] =
{
0x7F, 0x7F, 0x7F, 0x7B, 0x82, 0x07, 0x84, 0x06,
0x84, 0x06, 0x84, 0x07, 0x82, 0x10
};

PROGMEM const unsigned char chr_f7s_30[] =
{
0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x01, 0x80, 0x08, 0x81, 0x01, 0x8E, 0x01, 0x82,
0x06, 0x83, 0x10, 0x84, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x84, 0x10, 0x84, 0x04, 0x82, 0x14, 0x82,
0x04, 0x80, 0x18, 0x80, 0x24, 0x80, 0x1E, 0x82,
0x15, 0x81, 0x04, 0x84, 0x11, 0x83, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x05, 0x83,
0x10, 0x83, 0x07, 0x81, 0x01, 0x8E, 0x01, 0x81,
0x0B, 0x90, 0x0D, 0x92, 0x0D, 0x90, 0x0F, 0x8E,
0x28
};

PROGMEM const unsigned char chr_f7s_31[] =
{
0x7F, 0x19, 0x80, 0x1D, 0x82, 0x1B, 0x84, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x1B, 0x83, 0x1D, 0x81, 0x1E, 0x80, 0x5D,
0x81, 0x1B, 0x83, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x1A,
0x83, 0x1C, 0x81, 0x7F, 0x24
};

PROGMEM const unsigned char chr_f7s_32[] =
{
0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x01, 0x80, 0x0C, 0x8E, 0x01, 0x82, 0x1B, 0x84,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x1A, 0x84, 0x0A, 0x8E, 0x02, 0x82,
0x08, 0x92, 0x02, 0x80, 0x06, 0x96, 0x06, 0x80,
0x01, 0x94, 0x07, 0x82, 0x01, 0x90, 0x09, 0x84,
0x1A, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x1A, 0x83, 0x1C, 0x81,
0x01, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x0F, 0x8E, 0x28
};

PROGMEM const unsigned char chr_f7s_33[] =
{
0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x01, 0x80, 0x0C, 0x8E, 0x01, 0x82, 0x1B, 0x84,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x1A, 0x84, 0x0A, 0x8E, 0x02, 0x82,
0x08, 0x92, 0x02, 0x80, 0x06, 0x96, 0x09, 0x94,
0x0C, 0x90, 0x02, 0x81, 0x1B, 0x83, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x1A, 0x83, 0x0B, 0x8E, 0x01, 0x81,
0x0B, 0x90, 0x0D, 0x92, 0x0D, 0x90, 0x0F, 0x8E,
0x28
};

PROGMEM const unsigned char chr_f7s_34[] =
{
0x7F, 0x19, 0x80, 0x08, 0x81, 0x12, 0x82, 0x06,
0x83, 0x10, 0x84, 0x04, 0x85, 0x0E, 0x85, 0x04,
0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04,
0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04,
0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04,
0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04,
0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04,
0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04,
0x84, 0x10, 0x84, 0x04, 0x82, 0x02, 0x8E, 0x02,
0x82, 0x04, 0x80, 0x02, 0x92, 0x02, 0x80, 0x06,
0x96, 0x09, 0x94, 0x0C, 0x90, 0x02, 0x81, 0x1B,
0x83, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19,
0x85, 0x19, 0x85, 0x19, 0x85, 0x1A, 0x83, 0x1C,
0x81, 0x7F, 0x24
};

PROGMEM const unsigned char chr_f7s_35[] =
{
0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x0B, 0x81, 0x01, 0x8E, 0x0B, 0x83, 0x1A, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x84, 0x1A, 0x82, 0x02, 0x8E, 0x0A, 0x80,
0x02, 0x92, 0x0A, 0x96, 0x09, 0x94, 0x0C, 0x90,
0x02, 0x81, 0x1B, 0x83, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x1A, 0x83, 0x0B, 0x8E, 0x01, 0x81, 0x0B, 0x90,
0x0D, 0x92, 0x0D, 0x90, 0x0F, 0x8E, 0x28
};

PROGMEM const unsigned char chr_f7s_36[] =
{
0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x0B, 0x81, 0x01, 0x8E, 0x0B, 0x83, 0x1A, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x84, 0x1A, 0x82, 0x02, 0x8E, 0x0A, 0x80,
0x02, 0x92, 0x0A, 0x96, 0x06, 0x80, 0x01, 0x94,
0x07, 0x82, 0x01, 0x90, 0x02, 0x81, 0x04, 0x84,
0x11, 0x83, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85,
0x0E, 0x85, 0x05, 0x83, 0x10, 0x83, 0x07, 0x81,
0x01, 0x8E, 0x01, 0x81, 0x0B, 0x90, 0x0D, 0x92,
0x0D, 0x90, 0x0F, 0x8E, 0x28
};

PROGMEM const unsigned char chr_f7s_37[] =
{
0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x01, 0x80, 0x0C, 0x8E, 0x01, 0x82, 0x1B, 0x84,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x1A, 0x84, 0x1C, 0x82, 0x1E, 0x80,
0x5D, 0x81, 0x1B, 0x83, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x1A, 0x83, 0x1C, 0x81, 0x7F, 0x24
};

PROGMEM const unsigned char chr_f7s_38[] =
{
0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x01, 0x80, 0x08, 0x81, 0x01, 0x8E, 0x01, 0x82,
0x06, 0x83, 0x10, 0x84, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x84, 0x10, 0x84, 0x04, 0x82, 0x02, 0x8E,
0x02, 0x82, 0x04, 0x80, 0x02, 0x92, 0x02, 0x80,
0x06, 0x96, 0x06, 0x80, 0x01, 0x94, 0x07, 0x82,
0x01, 0x90, 0x02, 0x81, 0x04, 0x84, 0x11, 0x83,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x05, 0x83, 0x10, 0x83, 0x07, 0x81, 0x01, 0x8E,
0x01, 0x81, 0x0B, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x0F, 0x8E, 0x28
};

PROGMEM const unsigned char chr_f7s_39[] =
{
0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90,
0x01, 0x80, 0x08, 0x81, 0x01, 0x8E, 0x01, 0x82,
0x06, 0x83, 0x10, 0x84, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85,
0x04, 0x84, 0x10, 0x84, 0x04, 0x82, 0x02, 0x8E,
0x02, 0x82, 0x04, 0x80, 0x02, 0x92, 0x02, 0x80,
0x06, 0x96, 0x09, 0x94, 0x0C, 0x90, 0x02, 0x81,
0x1B, 0x83, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85,
0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x1A, 0x83,
0x0B, 0x8E, 0x01, 0x81, 0x0B, 0x90, 0x0D, 0x92,
0x0D, 0x90, 0x0F, 0x8E, 0x28
};

PROGMEM const unsigned char chr_f7s_3A[] =
{
0x7F, 0x1F, 0x82, 0x07, 0x84, 0x06, 0x84, 0x06,
0x84, 0x07, 0x82, 0x7F, 0x18, 0x82, 0x07, 0x84,
0x06, 0x84, 0x06, 0x84, 0x07, 0x82, 0x7F, 0x20
};
PROGMEM const unsigned char* const chrtbl_f7s[96] = // character pointer table
{
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_2D, chr_f7s_2E, chr_f7s_20,
chr_f7s_30, chr_f7s_31, chr_f7s_32, chr_f7s_33, chr_f7s_34, chr_f7s_35, chr_f7s_36, chr_f7s_37,
chr_f7s_38, chr_f7s_39, chr_f7s_3A, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20
};

+ 10
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/Font7srle.h 查看文件

@@ -0,0 +1,10 @@
#include <Fonts/Font7srle.c>

#define nr_chrs_f7s 96
#define chr_hgt_f7s 48
#define baseline_f7s 47
#define data_size_f7s 8
#define firstchr_f7s 32

extern const unsigned char widtbl_f7s[96];
extern const unsigned char* const chrtbl_f7s[96];

+ 227
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/GFXFF/FreeMono12pt7b.h 查看文件

@@ -0,0 +1,227 @@
const uint8_t FreeMono12pt7bBitmaps[] PROGMEM = {
0x49, 0x24, 0x92, 0x48, 0x01, 0xF8, 0xE7, 0xE7, 0x67, 0x42, 0x42, 0x42,
0x42, 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1F, 0xF1, 0x10, 0x4C, 0x12,
0x3F, 0xE1, 0x20, 0x48, 0x12, 0x04, 0x81, 0x20, 0x48, 0x04, 0x07, 0xA2,
0x19, 0x02, 0x40, 0x10, 0x03, 0x00, 0x3C, 0x00, 0x80, 0x10, 0x06, 0x01,
0xE0, 0xA7, 0xC0, 0x40, 0x10, 0x04, 0x00, 0x3C, 0x19, 0x84, 0x21, 0x08,
0x66, 0x0F, 0x00, 0x0C, 0x1C, 0x78, 0x01, 0xE0, 0xCC, 0x21, 0x08, 0x43,
0x30, 0x78, 0x3E, 0x30, 0x10, 0x08, 0x02, 0x03, 0x03, 0x47, 0x14, 0x8A,
0x43, 0x11, 0x8F, 0x60, 0xFD, 0xA4, 0x90, 0x05, 0x25, 0x24, 0x92, 0x48,
0x92, 0x24, 0x11, 0x24, 0x89, 0x24, 0x92, 0x92, 0x90, 0x00, 0x04, 0x02,
0x11, 0x07, 0xF0, 0xC0, 0x50, 0x48, 0x42, 0x00, 0x08, 0x04, 0x02, 0x01,
0x00, 0x87, 0xFC, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x3B, 0x9C, 0xCE,
0x62, 0x00, 0xFF, 0xE0, 0xFF, 0x80, 0x00, 0x80, 0xC0, 0x40, 0x20, 0x20,
0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x80,
0x80, 0x40, 0x00, 0x1C, 0x31, 0x90, 0x58, 0x38, 0x0C, 0x06, 0x03, 0x01,
0x80, 0xC0, 0x60, 0x30, 0x34, 0x13, 0x18, 0x70, 0x30, 0xE1, 0x44, 0x81,
0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F, 0xC0, 0x1E, 0x10, 0x90,
0x68, 0x10, 0x08, 0x0C, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x0E,
0x07, 0xFE, 0x3E, 0x10, 0x40, 0x08, 0x02, 0x00, 0x80, 0x40, 0xE0, 0x04,
0x00, 0x80, 0x10, 0x04, 0x01, 0x00, 0xD8, 0x63, 0xE0, 0x06, 0x0A, 0x0A,
0x12, 0x22, 0x22, 0x42, 0x42, 0x82, 0x82, 0xFF, 0x02, 0x02, 0x02, 0x0F,
0x7F, 0x20, 0x10, 0x08, 0x04, 0x02, 0xF1, 0x8C, 0x03, 0x00, 0x80, 0x40,
0x20, 0x18, 0x16, 0x18, 0xF0, 0x0F, 0x8C, 0x08, 0x08, 0x04, 0x04, 0x02,
0x79, 0x46, 0xC1, 0xE0, 0x60, 0x28, 0x14, 0x19, 0x08, 0x78, 0xFF, 0x81,
0x81, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08,
0x08, 0x3E, 0x31, 0xB0, 0x70, 0x18, 0x0C, 0x05, 0x8C, 0x38, 0x63, 0x40,
0x60, 0x30, 0x18, 0x1B, 0x18, 0xF8, 0x3C, 0x31, 0x30, 0x50, 0x28, 0x0C,
0x0F, 0x06, 0x85, 0x3C, 0x80, 0x40, 0x40, 0x20, 0x20, 0x63, 0xE0, 0xFF,
0x80, 0x07, 0xFC, 0x39, 0xCE, 0x00, 0x00, 0x06, 0x33, 0x98, 0xC4, 0x00,
0x00, 0xC0, 0x60, 0x18, 0x0C, 0x06, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03,
0x00, 0x30, 0x01, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x06,
0x00, 0x30, 0x01, 0x80, 0x18, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x0C, 0x02,
0x00, 0x00, 0x3E, 0x60, 0xA0, 0x20, 0x10, 0x08, 0x08, 0x18, 0x10, 0x08,
0x00, 0x00, 0x00, 0x01, 0xC0, 0xE0, 0x1C, 0x31, 0x10, 0x50, 0x28, 0x14,
0x3A, 0x25, 0x22, 0x91, 0x4C, 0xA3, 0xF0, 0x08, 0x02, 0x01, 0x80, 0x7C,
0x3F, 0x00, 0x0C, 0x00, 0x48, 0x01, 0x20, 0x04, 0x40, 0x21, 0x00, 0x84,
0x04, 0x08, 0x1F, 0xE0, 0x40, 0x82, 0x01, 0x08, 0x04, 0x20, 0x13, 0xE1,
0xF0, 0xFF, 0x08, 0x11, 0x01, 0x20, 0x24, 0x04, 0x81, 0x1F, 0xC2, 0x06,
0x40, 0x68, 0x05, 0x00, 0xA0, 0x14, 0x05, 0xFF, 0x00, 0x1E, 0x48, 0x74,
0x05, 0x01, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x04, 0x01, 0x01,
0x30, 0x87, 0xC0, 0xFE, 0x10, 0x44, 0x09, 0x02, 0x40, 0x50, 0x14, 0x05,
0x01, 0x40, 0x50, 0x14, 0x0D, 0x02, 0x41, 0x3F, 0x80, 0xFF, 0xC8, 0x09,
0x01, 0x20, 0x04, 0x00, 0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00,
0xA0, 0x14, 0x03, 0xFF, 0xC0, 0xFF, 0xE8, 0x05, 0x00, 0xA0, 0x04, 0x00,
0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x01, 0xF0,
0x00, 0x1F, 0x46, 0x19, 0x01, 0x60, 0x28, 0x01, 0x00, 0x20, 0x04, 0x00,
0x83, 0xF0, 0x0B, 0x01, 0x20, 0x23, 0x0C, 0x3E, 0x00, 0xE1, 0xD0, 0x24,
0x09, 0x02, 0x40, 0x90, 0x27, 0xF9, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02,
0x40, 0xB8, 0x70, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20,
0x40, 0x81, 0x1F, 0xC0, 0x0F, 0xE0, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01,
0x00, 0x20, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, 0xC6, 0x30, 0x7C, 0x00,
0xF1, 0xE4, 0x0C, 0x41, 0x04, 0x20, 0x44, 0x04, 0x80, 0x5C, 0x06, 0x60,
0x43, 0x04, 0x10, 0x40, 0x84, 0x08, 0x40, 0xCF, 0x07, 0xF8, 0x04, 0x00,
0x80, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x04, 0x80,
0x90, 0x12, 0x03, 0xFF, 0xC0, 0xE0, 0x3B, 0x01, 0x94, 0x14, 0xA0, 0xA4,
0x89, 0x24, 0x49, 0x14, 0x48, 0xA2, 0x45, 0x12, 0x10, 0x90, 0x04, 0x80,
0x24, 0x01, 0x78, 0x3C, 0xE0, 0xF6, 0x02, 0x50, 0x25, 0x02, 0x48, 0x24,
0xC2, 0x44, 0x24, 0x22, 0x43, 0x24, 0x12, 0x40, 0xA4, 0x0A, 0x40, 0x6F,
0x06, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18, 0x01, 0x80, 0x18,
0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC0, 0xF0, 0xFF, 0x10,
0x64, 0x05, 0x01, 0x40, 0x50, 0x34, 0x19, 0xFC, 0x40, 0x10, 0x04, 0x01,
0x00, 0x40, 0x3E, 0x00, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18,
0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC1,
0xF0, 0x0C, 0x01, 0xF1, 0x30, 0xE0, 0xFF, 0x04, 0x18, 0x40, 0xC4, 0x04,
0x40, 0x44, 0x0C, 0x41, 0x87, 0xE0, 0x43, 0x04, 0x10, 0x40, 0x84, 0x04,
0x40, 0x4F, 0x03, 0x1F, 0x48, 0x34, 0x05, 0x01, 0x40, 0x08, 0x01, 0xC0,
0x0E, 0x00, 0x40, 0x18, 0x06, 0x01, 0xE1, 0xA7, 0xC0, 0xFF, 0xF0, 0x86,
0x10, 0x82, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10,
0x02, 0x00, 0x40, 0x7F, 0x00, 0xF0, 0xF4, 0x02, 0x40, 0x24, 0x02, 0x40,
0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x22, 0x04, 0x30,
0xC0, 0xF0, 0xF8, 0x7C, 0x80, 0x22, 0x01, 0x04, 0x04, 0x10, 0x20, 0x40,
0x80, 0x82, 0x02, 0x10, 0x08, 0x40, 0x11, 0x00, 0x48, 0x01, 0xA0, 0x03,
0x00, 0x0C, 0x00, 0xF8, 0x7C, 0x80, 0x22, 0x00, 0x88, 0xC2, 0x23, 0x10,
0x8E, 0x42, 0x29, 0x09, 0x24, 0x24, 0x90, 0x91, 0x41, 0x85, 0x06, 0x14,
0x18, 0x70, 0x60, 0x80, 0xF0, 0xF2, 0x06, 0x30, 0x41, 0x08, 0x09, 0x80,
0x50, 0x06, 0x00, 0x60, 0x0D, 0x00, 0x88, 0x10, 0xC2, 0x04, 0x60, 0x2F,
0x0F, 0xF0, 0xF2, 0x02, 0x10, 0x41, 0x04, 0x08, 0x80, 0x50, 0x05, 0x00,
0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x01, 0xFC, 0xFF, 0x40,
0xA0, 0x90, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x50, 0x30, 0x18,
0x0F, 0xFC, 0xF2, 0x49, 0x24, 0x92, 0x49, 0x24, 0x9C, 0x80, 0x60, 0x10,
0x08, 0x02, 0x01, 0x00, 0x40, 0x20, 0x08, 0x04, 0x01, 0x00, 0x80, 0x20,
0x10, 0x04, 0x02, 0x00, 0x80, 0x40, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x49,
0x3C, 0x08, 0x0C, 0x09, 0x0C, 0x4C, 0x14, 0x04, 0xFF, 0xFC, 0x84, 0x21,
0x3E, 0x00, 0x60, 0x08, 0x02, 0x3F, 0x98, 0x28, 0x0A, 0x02, 0xC3, 0x9F,
0x30, 0xE0, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x13, 0xE0, 0xA0,
0x86, 0x02, 0x20, 0x09, 0x00, 0x48, 0x02, 0x40, 0x13, 0x01, 0x14, 0x1B,
0x9F, 0x00, 0x1F, 0x4C, 0x19, 0x01, 0x40, 0x28, 0x01, 0x00, 0x20, 0x02,
0x00, 0x60, 0x43, 0xF0, 0x00, 0xC0, 0x08, 0x01, 0x00, 0x20, 0x04, 0x3C,
0x98, 0x52, 0x06, 0x80, 0x50, 0x0A, 0x01, 0x40, 0x24, 0x0C, 0xC2, 0x87,
0x98, 0x3F, 0x18, 0x68, 0x06, 0x01, 0xFF, 0xE0, 0x08, 0x03, 0x00, 0x60,
0xC7, 0xC0, 0x0F, 0x98, 0x08, 0x04, 0x02, 0x07, 0xF8, 0x80, 0x40, 0x20,
0x10, 0x08, 0x04, 0x02, 0x01, 0x03, 0xF8, 0x1E, 0x6C, 0x39, 0x03, 0x40,
0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20,
0x08, 0x3E, 0x00, 0xC0, 0x10, 0x04, 0x01, 0x00, 0x40, 0x13, 0x87, 0x11,
0x82, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 0x2E, 0x1C, 0x08, 0x04,
0x02, 0x00, 0x00, 0x03, 0xC0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00,
0x80, 0x43, 0xFE, 0x04, 0x08, 0x10, 0x00, 0x1F, 0xC0, 0x81, 0x02, 0x04,
0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x0B, 0xE0, 0xE0, 0x02, 0x00, 0x20,
0x02, 0x00, 0x20, 0x02, 0x3C, 0x21, 0x02, 0x60, 0x2C, 0x03, 0x80, 0x24,
0x02, 0x20, 0x21, 0x02, 0x08, 0xE1, 0xF0, 0x78, 0x04, 0x02, 0x01, 0x00,
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, 0xFE,
0xDC, 0xE3, 0x19, 0x90, 0x84, 0x84, 0x24, 0x21, 0x21, 0x09, 0x08, 0x48,
0x42, 0x42, 0x17, 0x18, 0xC0, 0x67, 0x83, 0x84, 0x20, 0x22, 0x02, 0x20,
0x22, 0x02, 0x20, 0x22, 0x02, 0x20, 0x2F, 0x07, 0x1F, 0x04, 0x11, 0x01,
0x40, 0x18, 0x03, 0x00, 0x60, 0x0A, 0x02, 0x20, 0x83, 0xE0, 0xCF, 0x85,
0x06, 0x60, 0x24, 0x01, 0x40, 0x14, 0x01, 0x40, 0x16, 0x02, 0x50, 0x44,
0xF8, 0x40, 0x04, 0x00, 0x40, 0x0F, 0x00, 0x1E, 0x6C, 0x3B, 0x03, 0x40,
0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20,
0x04, 0x03, 0xC0, 0xE3, 0x8B, 0x13, 0x80, 0x80, 0x20, 0x08, 0x02, 0x00,
0x80, 0x20, 0x3F, 0x80, 0x1F, 0x58, 0x34, 0x05, 0x80, 0x1E, 0x00, 0x60,
0x06, 0x01, 0xC0, 0xAF, 0xC0, 0x20, 0x04, 0x00, 0x80, 0x10, 0x0F, 0xF0,
0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x03, 0x04, 0x3F,
0x00, 0xC1, 0xC8, 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, 0x90, 0x12, 0x02,
0x61, 0xC7, 0xCC, 0xF8, 0xF9, 0x01, 0x08, 0x10, 0x60, 0x81, 0x08, 0x08,
0x40, 0x22, 0x01, 0x20, 0x05, 0x00, 0x30, 0x00, 0xF0, 0x7A, 0x01, 0x10,
0x08, 0x8C, 0x42, 0x62, 0x12, 0x90, 0xA5, 0x05, 0x18, 0x28, 0xC0, 0x86,
0x00, 0x78, 0xF3, 0x04, 0x18, 0x80, 0xD0, 0x06, 0x00, 0x70, 0x09, 0x81,
0x0C, 0x20, 0x6F, 0x8F, 0xF0, 0xF2, 0x02, 0x20, 0x41, 0x04, 0x10, 0x80,
0x88, 0x09, 0x00, 0x50, 0x06, 0x00, 0x20, 0x04, 0x00, 0x40, 0x08, 0x0F,
0xE0, 0xFF, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0xBF,
0xC0, 0x19, 0x08, 0x42, 0x10, 0x84, 0x64, 0x18, 0x42, 0x10, 0x84, 0x20,
0xC0, 0xFF, 0xFF, 0xC0, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4C, 0x42,
0x10, 0x84, 0x26, 0x00, 0x38, 0x13, 0x38, 0x38 };

const GFXglyph FreeMono12pt7bGlyphs[] PROGMEM = {
{ 0, 0, 0, 14, 0, 1 }, // 0x20 ' '
{ 0, 3, 15, 14, 6, -14 }, // 0x21 '!'
{ 6, 8, 7, 14, 3, -14 }, // 0x22 '"'
{ 13, 10, 16, 14, 2, -14 }, // 0x23 '#'
{ 33, 10, 17, 14, 2, -14 }, // 0x24 '$'
{ 55, 10, 15, 14, 2, -14 }, // 0x25 '%'
{ 74, 9, 12, 14, 3, -11 }, // 0x26 '&'
{ 88, 3, 7, 14, 5, -14 }, // 0x27 '''
{ 91, 3, 18, 14, 7, -14 }, // 0x28 '('
{ 98, 3, 18, 14, 4, -14 }, // 0x29 ')'
{ 105, 9, 9, 14, 3, -14 }, // 0x2A '*'
{ 116, 9, 11, 14, 3, -11 }, // 0x2B '+'
{ 129, 5, 7, 14, 3, -3 }, // 0x2C ','
{ 134, 11, 1, 14, 2, -6 }, // 0x2D '-'
{ 136, 3, 3, 14, 5, -2 }, // 0x2E '.'
{ 138, 9, 18, 14, 3, -15 }, // 0x2F '/'
{ 159, 9, 15, 14, 3, -14 }, // 0x30 '0'
{ 176, 7, 14, 14, 4, -13 }, // 0x31 '1'
{ 189, 9, 15, 14, 2, -14 }, // 0x32 '2'
{ 206, 10, 15, 14, 2, -14 }, // 0x33 '3'
{ 225, 8, 15, 14, 3, -14 }, // 0x34 '4'
{ 240, 9, 15, 14, 3, -14 }, // 0x35 '5'
{ 257, 9, 15, 14, 3, -14 }, // 0x36 '6'
{ 274, 8, 15, 14, 3, -14 }, // 0x37 '7'
{ 289, 9, 15, 14, 3, -14 }, // 0x38 '8'
{ 306, 9, 15, 14, 3, -14 }, // 0x39 '9'
{ 323, 3, 10, 14, 5, -9 }, // 0x3A ':'
{ 327, 5, 13, 14, 3, -9 }, // 0x3B ';'
{ 336, 11, 11, 14, 2, -11 }, // 0x3C '<'
{ 352, 12, 4, 14, 1, -8 }, // 0x3D '='
{ 358, 11, 11, 14, 2, -11 }, // 0x3E '>'
{ 374, 9, 14, 14, 3, -13 }, // 0x3F '?'
{ 390, 9, 16, 14, 3, -14 }, // 0x40 '@'
{ 408, 14, 14, 14, 0, -13 }, // 0x41 'A'
{ 433, 11, 14, 14, 2, -13 }, // 0x42 'B'
{ 453, 10, 14, 14, 2, -13 }, // 0x43 'C'
{ 471, 10, 14, 14, 2, -13 }, // 0x44 'D'
{ 489, 11, 14, 14, 2, -13 }, // 0x45 'E'
{ 509, 11, 14, 14, 2, -13 }, // 0x46 'F'
{ 529, 11, 14, 14, 2, -13 }, // 0x47 'G'
{ 549, 10, 14, 14, 2, -13 }, // 0x48 'H'
{ 567, 7, 14, 14, 4, -13 }, // 0x49 'I'
{ 580, 11, 14, 14, 2, -13 }, // 0x4A 'J'
{ 600, 12, 14, 14, 2, -13 }, // 0x4B 'K'
{ 621, 11, 14, 14, 2, -13 }, // 0x4C 'L'
{ 641, 13, 14, 14, 1, -13 }, // 0x4D 'M'
{ 664, 12, 14, 14, 1, -13 }, // 0x4E 'N'
{ 685, 12, 14, 14, 1, -13 }, // 0x4F 'O'
{ 706, 10, 14, 14, 2, -13 }, // 0x50 'P'
{ 724, 12, 17, 14, 1, -13 }, // 0x51 'Q'
{ 750, 12, 14, 14, 2, -13 }, // 0x52 'R'
{ 771, 10, 14, 14, 2, -13 }, // 0x53 'S'
{ 789, 11, 14, 14, 2, -13 }, // 0x54 'T'
{ 809, 12, 14, 14, 1, -13 }, // 0x55 'U'
{ 830, 14, 14, 14, 0, -13 }, // 0x56 'V'
{ 855, 14, 14, 14, 0, -13 }, // 0x57 'W'
{ 880, 12, 14, 14, 1, -13 }, // 0x58 'X'
{ 901, 12, 14, 14, 1, -13 }, // 0x59 'Y'
{ 922, 9, 14, 14, 3, -13 }, // 0x5A 'Z'
{ 938, 3, 18, 14, 7, -14 }, // 0x5B '['
{ 945, 9, 18, 14, 3, -15 }, // 0x5C '\'
{ 966, 3, 18, 14, 5, -14 }, // 0x5D ']'
{ 973, 9, 6, 14, 3, -14 }, // 0x5E '^'
{ 980, 14, 1, 14, 0, 3 }, // 0x5F '_'
{ 982, 4, 4, 14, 4, -15 }, // 0x60 '`'
{ 984, 10, 10, 14, 2, -9 }, // 0x61 'a'
{ 997, 13, 15, 14, 0, -14 }, // 0x62 'b'
{ 1022, 11, 10, 14, 2, -9 }, // 0x63 'c'
{ 1036, 11, 15, 14, 2, -14 }, // 0x64 'd'
{ 1057, 10, 10, 14, 2, -9 }, // 0x65 'e'
{ 1070, 9, 15, 14, 4, -14 }, // 0x66 'f'
{ 1087, 11, 14, 14, 2, -9 }, // 0x67 'g'
{ 1107, 10, 15, 14, 2, -14 }, // 0x68 'h'
{ 1126, 9, 15, 14, 3, -14 }, // 0x69 'i'
{ 1143, 7, 19, 14, 3, -14 }, // 0x6A 'j'
{ 1160, 12, 15, 14, 1, -14 }, // 0x6B 'k'
{ 1183, 9, 15, 14, 3, -14 }, // 0x6C 'l'
{ 1200, 13, 10, 14, 1, -9 }, // 0x6D 'm'
{ 1217, 12, 10, 14, 1, -9 }, // 0x6E 'n'
{ 1232, 11, 10, 14, 2, -9 }, // 0x6F 'o'
{ 1246, 12, 14, 14, 1, -9 }, // 0x70 'p'
{ 1267, 11, 14, 14, 2, -9 }, // 0x71 'q'
{ 1287, 10, 10, 14, 3, -9 }, // 0x72 'r'
{ 1300, 10, 10, 14, 2, -9 }, // 0x73 's'
{ 1313, 11, 14, 14, 1, -13 }, // 0x74 't'
{ 1333, 11, 10, 14, 2, -9 }, // 0x75 'u'
{ 1347, 13, 10, 14, 1, -9 }, // 0x76 'v'
{ 1364, 13, 10, 14, 1, -9 }, // 0x77 'w'
{ 1381, 12, 10, 14, 1, -9 }, // 0x78 'x'
{ 1396, 12, 14, 14, 1, -9 }, // 0x79 'y'
{ 1417, 9, 10, 14, 3, -9 }, // 0x7A 'z'
{ 1429, 5, 18, 14, 5, -14 }, // 0x7B '{'
{ 1441, 1, 18, 14, 7, -14 }, // 0x7C '|'
{ 1444, 5, 18, 14, 5, -14 }, // 0x7D '}'
{ 1456, 10, 3, 14, 2, -7 } }; // 0x7E '~'

const GFXfont FreeMono12pt7b PROGMEM = {
(uint8_t *)FreeMono12pt7bBitmaps,
(GFXglyph *)FreeMono12pt7bGlyphs,
0x20, 0x7E, 24 };

// Approx. 2132 bytes

+ 363
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/GFXFF/FreeMono18pt7b.h 查看文件

@@ -0,0 +1,363 @@
const uint8_t FreeMono18pt7bBitmaps[] PROGMEM = {
0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, 0x00, 0x6F, 0xF6, 0xF1,
0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC3, 0x98, 0x33, 0x06, 0x60, 0xCC,
0x18, 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, 0x20, 0x10, 0x80,
0x42, 0x01, 0x10, 0x04, 0x41, 0xFF, 0xF0, 0x44, 0x02, 0x10, 0x08, 0x40,
0x21, 0x0F, 0xFF, 0xC2, 0x10, 0x08, 0x40, 0x21, 0x00, 0x84, 0x02, 0x10,
0x08, 0x40, 0x23, 0x00, 0x88, 0x02, 0x20, 0x02, 0x00, 0x10, 0x00, 0x80,
0x1F, 0xA3, 0x07, 0x10, 0x09, 0x00, 0x48, 0x00, 0x40, 0x03, 0x00, 0x0C,
0x00, 0x3C, 0x00, 0x1E, 0x00, 0x18, 0x00, 0x20, 0x01, 0x80, 0x0C, 0x00,
0x70, 0x05, 0xE0, 0xC9, 0xF8, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00,
0x10, 0x00, 0x1E, 0x00, 0x42, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08,
0x10, 0x08, 0x40, 0x0F, 0x00, 0x00, 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xE0,
0x0E, 0x00, 0x00, 0x3C, 0x00, 0x86, 0x02, 0x06, 0x04, 0x04, 0x08, 0x08,
0x10, 0x30, 0x10, 0xC0, 0x1E, 0x00, 0x0F, 0xC1, 0x00, 0x20, 0x02, 0x00,
0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x03, 0xC0, 0x6C, 0x3C, 0x62,
0x82, 0x68, 0x34, 0x81, 0xCC, 0x08, 0x61, 0xC3, 0xE7, 0xFF, 0xFF, 0xF6,
0x66, 0x66, 0x08, 0xC4, 0x62, 0x31, 0x8C, 0xC6, 0x31, 0x8C, 0x63, 0x18,
0xC3, 0x18, 0xC2, 0x18, 0xC3, 0x18, 0x86, 0x10, 0xC2, 0x18, 0xC6, 0x10,
0xC6, 0x31, 0x8C, 0x63, 0x18, 0x8C, 0x62, 0x31, 0x98, 0x80, 0x02, 0x00,
0x10, 0x00, 0x80, 0x04, 0x0C, 0x21, 0x9D, 0x70, 0x1C, 0x00, 0xA0, 0x0D,
0x80, 0xC6, 0x04, 0x10, 0x40, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00,
0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0xFE, 0x02,
0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
0x01, 0x00, 0x3E, 0x78, 0xF3, 0xC7, 0x8E, 0x18, 0x70, 0xC1, 0x80, 0xFF,
0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x08, 0x00, 0xC0, 0x04, 0x00, 0x60,
0x02, 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0C, 0x00, 0x40, 0x02,
0x00, 0x20, 0x01, 0x00, 0x10, 0x00, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00,
0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, 0x00, 0x00,
0x0F, 0x81, 0x82, 0x08, 0x08, 0x80, 0x24, 0x01, 0x60, 0x0E, 0x00, 0x30,
0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00,
0x30, 0x03, 0x40, 0x12, 0x00, 0x88, 0x08, 0x60, 0xC0, 0xF8, 0x00, 0x06,
0x00, 0x70, 0x06, 0x80, 0x64, 0x06, 0x20, 0x31, 0x00, 0x08, 0x00, 0x40,
0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00,
0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x0F, 0xFF, 0x80, 0x0F, 0x80,
0xC3, 0x08, 0x04, 0x80, 0x24, 0x00, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00,
0x10, 0x01, 0x00, 0x10, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80,
0x18, 0x01, 0x80, 0x58, 0x03, 0x80, 0x1F, 0xFF, 0x80, 0x0F, 0xC0, 0xC0,
0x86, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x04, 0x00,
0x20, 0x0F, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x40,
0x01, 0x00, 0x04, 0x00, 0x2C, 0x01, 0x9C, 0x0C, 0x0F, 0xC0, 0x01, 0xC0,
0x14, 0x02, 0x40, 0x64, 0x04, 0x40, 0xC4, 0x08, 0x41, 0x84, 0x10, 0x42,
0x04, 0x20, 0x44, 0x04, 0x40, 0x48, 0x04, 0xFF, 0xF0, 0x04, 0x00, 0x40,
0x04, 0x00, 0x40, 0x04, 0x07, 0xF0, 0x3F, 0xF0, 0x80, 0x02, 0x00, 0x08,
0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x0B, 0xF0, 0x30, 0x30, 0x00, 0x60,
0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x40, 0x01, 0x00, 0x0E,
0x00, 0x2C, 0x01, 0x0C, 0x18, 0x0F, 0xC0, 0x01, 0xF0, 0x60, 0x18, 0x03,
0x00, 0x20, 0x04, 0x00, 0x40, 0x0C, 0x00, 0x80, 0x08, 0xF8, 0x98, 0x4A,
0x02, 0xE0, 0x3C, 0x01, 0x80, 0x14, 0x01, 0x40, 0x14, 0x03, 0x20, 0x21,
0x0C, 0x0F, 0x80, 0xFF, 0xF8, 0x01, 0x80, 0x18, 0x03, 0x00, 0x20, 0x02,
0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, 0xC0, 0x08, 0x00, 0x80, 0x18,
0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, 0x0F,
0x81, 0x83, 0x10, 0x05, 0x80, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x03,
0x40, 0x11, 0x83, 0x07, 0xF0, 0x60, 0xC4, 0x01, 0x60, 0x0E, 0x00, 0x30,
0x01, 0x80, 0x0E, 0x00, 0xD0, 0x04, 0x60, 0xC1, 0xFC, 0x00, 0x1F, 0x03,
0x08, 0x40, 0x4C, 0x02, 0x80, 0x28, 0x02, 0x80, 0x18, 0x03, 0xC0, 0x74,
0x05, 0x21, 0x91, 0xF1, 0x00, 0x10, 0x03, 0x00, 0x20, 0x02, 0x00, 0x40,
0x0C, 0x01, 0x80, 0x60, 0xF8, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00,
0x1D, 0xFF, 0xFD, 0xC0, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00,
0x00, 0xF1, 0xE3, 0x8F, 0x1C, 0x38, 0xE1, 0xC3, 0x06, 0x00, 0x00, 0x06,
0x00, 0x18, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x06, 0x00, 0x38,
0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E,
0x00, 0x07, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0xFF, 0xFC, 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70,
0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x70,
0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0x60, 0x00, 0x3F,
0x8E, 0x0C, 0x80, 0x28, 0x01, 0x80, 0x10, 0x01, 0x00, 0x10, 0x02, 0x00,
0xC0, 0x38, 0x06, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E,
0x01, 0xF0, 0x1F, 0x00, 0xE0, 0x0F, 0x01, 0x86, 0x08, 0x08, 0x80, 0x24,
0x01, 0x40, 0x0A, 0x00, 0x50, 0x1E, 0x83, 0x14, 0x20, 0xA2, 0x05, 0x10,
0x28, 0x81, 0x46, 0x0A, 0x18, 0x50, 0x3F, 0x80, 0x04, 0x00, 0x10, 0x00,
0x80, 0x02, 0x00, 0x18, 0x18, 0x3F, 0x00, 0x1F, 0xF0, 0x00, 0x06, 0x80,
0x00, 0x34, 0x00, 0x01, 0x30, 0x00, 0x18, 0x80, 0x00, 0x86, 0x00, 0x04,
0x30, 0x00, 0x60, 0x80, 0x02, 0x06, 0x00, 0x10, 0x10, 0x01, 0x80, 0x80,
0x08, 0x06, 0x00, 0x7F, 0xF0, 0x06, 0x00, 0x80, 0x20, 0x06, 0x01, 0x00,
0x10, 0x18, 0x00, 0xC0, 0x80, 0x06, 0x04, 0x00, 0x11, 0xFC, 0x0F, 0xF0,
0xFF, 0xF8, 0x04, 0x01, 0x01, 0x00, 0x20, 0x40, 0x04, 0x10, 0x01, 0x04,
0x00, 0x41, 0x00, 0x10, 0x40, 0x08, 0x10, 0x0C, 0x07, 0xFF, 0x01, 0x00,
0x70, 0x40, 0x06, 0x10, 0x00, 0x84, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01,
0x10, 0x00, 0x44, 0x00, 0x21, 0x00, 0x33, 0xFF, 0xF8, 0x03, 0xF1, 0x06,
0x0E, 0x8C, 0x01, 0xC4, 0x00, 0x64, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x01,
0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00,
0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x20, 0x01, 0x88, 0x01, 0x83,
0x03, 0x80, 0x7E, 0x00, 0xFF, 0xE0, 0x20, 0x18, 0x20, 0x0C, 0x20, 0x04,
0x20, 0x02, 0x20, 0x02, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01,
0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02,
0x20, 0x04, 0x20, 0x0C, 0x20, 0x18, 0xFF, 0xE0, 0xFF, 0xFF, 0x08, 0x00,
0x84, 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x00, 0x40, 0x00, 0x20,
0x40, 0x10, 0x20, 0x0F, 0xF0, 0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00,
0x80, 0x00, 0x40, 0x02, 0x20, 0x01, 0x10, 0x00, 0x88, 0x00, 0x44, 0x00,
0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11,
0x00, 0x08, 0x80, 0x00, 0x40, 0x00, 0x20, 0x40, 0x10, 0x20, 0x0F, 0xF0,
0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20,
0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xF9,
0x06, 0x07, 0x84, 0x00, 0xC4, 0x00, 0x24, 0x00, 0x12, 0x00, 0x02, 0x00,
0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x0F, 0xF8,
0x00, 0x14, 0x00, 0x09, 0x00, 0x04, 0x80, 0x02, 0x20, 0x01, 0x18, 0x00,
0x83, 0x01, 0xC0, 0x7F, 0x00, 0xFC, 0x3F, 0x20, 0x04, 0x20, 0x04, 0x20,
0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x3F,
0xFC, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20,
0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0xFC, 0x3F, 0xFF, 0xF8, 0x10,
0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00,
0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02,
0x00, 0x10, 0x00, 0x81, 0xFF, 0xF0, 0x03, 0xFF, 0x80, 0x04, 0x00, 0x02,
0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00,
0x08, 0x00, 0x04, 0x00, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42,
0x00, 0x21, 0x00, 0x10, 0x80, 0x10, 0x20, 0x18, 0x0C, 0x18, 0x01, 0xF0,
0x00, 0xFF, 0x1F, 0x84, 0x01, 0x81, 0x00, 0xC0, 0x40, 0x60, 0x10, 0x30,
0x04, 0x18, 0x01, 0x0C, 0x00, 0x46, 0x00, 0x13, 0x00, 0x05, 0xF0, 0x01,
0xC6, 0x00, 0x60, 0xC0, 0x10, 0x18, 0x04, 0x06, 0x01, 0x00, 0xC0, 0x40,
0x30, 0x10, 0x04, 0x04, 0x01, 0x81, 0x00, 0x23, 0xFC, 0x0F, 0xFF, 0x80,
0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04,
0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00,
0x42, 0x00, 0x84, 0x01, 0x08, 0x02, 0x10, 0x04, 0x20, 0x0F, 0xFF, 0xF0,
0xF0, 0x01, 0xE7, 0x00, 0x70, 0xA0, 0x0A, 0x16, 0x03, 0x42, 0x40, 0x48,
0x4C, 0x19, 0x08, 0x82, 0x21, 0x10, 0x44, 0x23, 0x18, 0x84, 0x22, 0x10,
0x86, 0xC2, 0x10, 0x50, 0x42, 0x0E, 0x08, 0x41, 0xC1, 0x08, 0x00, 0x21,
0x00, 0x04, 0x20, 0x00, 0x84, 0x00, 0x10, 0x80, 0x02, 0x7F, 0x03, 0xF0,
0xF8, 0x1F, 0xC6, 0x00, 0x41, 0xC0, 0x10, 0x50, 0x04, 0x12, 0x01, 0x04,
0xC0, 0x41, 0x10, 0x10, 0x46, 0x04, 0x10, 0x81, 0x04, 0x10, 0x41, 0x04,
0x10, 0x40, 0x84, 0x10, 0x31, 0x04, 0x04, 0x41, 0x01, 0x90, 0x40, 0x24,
0x10, 0x05, 0x04, 0x01, 0xC1, 0x00, 0x31, 0xFC, 0x0C, 0x03, 0xE0, 0x06,
0x0C, 0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x05,
0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00,
0x0E, 0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03,
0x06, 0x00, 0x7C, 0x00, 0xFF, 0xF0, 0x10, 0x0C, 0x10, 0x02, 0x10, 0x03,
0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, 0x10, 0x06, 0x10, 0x0C,
0x1F, 0xF0, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFF, 0xC0, 0x03, 0xE0, 0x06, 0x0C,
0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x07, 0x00,
0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0E,
0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06,
0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x7F, 0xC6, 0x38, 0x1E, 0xFF,
0xF0, 0x02, 0x01, 0x80, 0x40, 0x08, 0x08, 0x01, 0x81, 0x00, 0x10, 0x20,
0x02, 0x04, 0x00, 0x40, 0x80, 0x18, 0x10, 0x06, 0x02, 0x03, 0x80, 0x7F,
0xC0, 0x08, 0x18, 0x01, 0x01, 0x80, 0x20, 0x18, 0x04, 0x01, 0x80, 0x80,
0x10, 0x10, 0x03, 0x02, 0x00, 0x20, 0x40, 0x06, 0x7F, 0x80, 0x70, 0x0F,
0xC8, 0x61, 0xE2, 0x01, 0x90, 0x02, 0x40, 0x09, 0x00, 0x04, 0x00, 0x08,
0x00, 0x38, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18,
0x00, 0x60, 0x01, 0x80, 0x0F, 0x00, 0x2B, 0x03, 0x23, 0xF0, 0xFF, 0xFF,
0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x10, 0x20, 0x20, 0x00, 0x40, 0x00,
0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x01, 0xFF, 0xC0,
0xFC, 0x1F, 0x90, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, 0x21, 0x00,
0x10, 0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84,
0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, 0x40, 0x04, 0x10, 0x04,
0x0C, 0x06, 0x03, 0x06, 0x00, 0x7C, 0x00, 0xFE, 0x03, 0xF8, 0x80, 0x02,
0x04, 0x00, 0x10, 0x30, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, 0xC0, 0x30,
0x06, 0x00, 0x80, 0x20, 0x06, 0x03, 0x00, 0x30, 0x10, 0x00, 0x80, 0x80,
0x06, 0x0C, 0x00, 0x10, 0x40, 0x00, 0x86, 0x00, 0x06, 0x20, 0x00, 0x11,
0x00, 0x00, 0xD8, 0x00, 0x06, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00,
0xFC, 0x0F, 0xE8, 0x00, 0x19, 0x00, 0x03, 0x10, 0x00, 0x62, 0x00, 0x08,
0x41, 0x81, 0x08, 0x28, 0x21, 0x05, 0x04, 0x21, 0xA0, 0x84, 0x36, 0x30,
0x84, 0x46, 0x08, 0x88, 0xC1, 0x31, 0x18, 0x24, 0x12, 0x04, 0x82, 0x40,
0xB0, 0x48, 0x14, 0x09, 0x02, 0x80, 0xA0, 0x30, 0x1C, 0x06, 0x03, 0x80,
0x7E, 0x0F, 0xC2, 0x00, 0x60, 0x60, 0x0C, 0x06, 0x03, 0x00, 0x60, 0xC0,
0x0C, 0x10, 0x00, 0xC6, 0x00, 0x0D, 0x80, 0x00, 0xA0, 0x00, 0x1C, 0x00,
0x03, 0x80, 0x00, 0xD8, 0x00, 0x11, 0x00, 0x06, 0x30, 0x01, 0x83, 0x00,
0x60, 0x30, 0x08, 0x06, 0x03, 0x00, 0x60, 0xC0, 0x06, 0x7F, 0x07, 0xF0,
0xFC, 0x1F, 0x98, 0x03, 0x04, 0x01, 0x03, 0x01, 0x80, 0xC1, 0x80, 0x20,
0x80, 0x18, 0xC0, 0x04, 0x40, 0x03, 0x60, 0x00, 0xE0, 0x00, 0x20, 0x00,
0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80,
0x00, 0x40, 0x00, 0x20, 0x03, 0xFF, 0x80, 0xFF, 0xF4, 0x00, 0xA0, 0x09,
0x00, 0x48, 0x04, 0x40, 0x40, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, 0x01,
0x00, 0x10, 0x00, 0x80, 0x08, 0x04, 0x80, 0x24, 0x01, 0x40, 0x0C, 0x00,
0x60, 0x03, 0xFF, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08,
0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, 0x80, 0x02, 0x00, 0x10,
0x00, 0xC0, 0x02, 0x00, 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x40,
0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x04, 0x00, 0x20, 0x00, 0x80,
0x04, 0x00, 0x10, 0x00, 0x80, 0x02, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00,
0x08, 0x00, 0x40, 0xF8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84,
0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xF8, 0x02, 0x00, 0x38, 0x03, 0x60,
0x11, 0x01, 0x8C, 0x18, 0x31, 0x80, 0xD8, 0x03, 0x80, 0x08, 0xFF, 0xFF,
0xF8, 0xC1, 0x83, 0x06, 0x0C, 0x0F, 0xC0, 0x70, 0x30, 0x00, 0x10, 0x00,
0x08, 0x00, 0x08, 0x00, 0x08, 0x0F, 0xF8, 0x30, 0x08, 0x40, 0x08, 0x80,
0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x38, 0x60, 0xE8, 0x3F, 0x8F, 0xF0,
0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00,
0x01, 0x0F, 0x80, 0x4C, 0x18, 0x14, 0x01, 0x06, 0x00, 0x21, 0x80, 0x08,
0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01, 0x18,
0x00, 0x86, 0x00, 0x21, 0xC0, 0x10, 0x5C, 0x18, 0xF1, 0xF8, 0x00, 0x07,
0xE4, 0x30, 0x78, 0x80, 0x32, 0x00, 0x24, 0x00, 0x50, 0x00, 0x20, 0x00,
0x40, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x00, 0xC3,
0x07, 0x01, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00,
0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x7C, 0x20, 0x60, 0xC8, 0x20, 0x0A,
0x10, 0x01, 0x84, 0x00, 0x62, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88,
0x00, 0x22, 0x00, 0x08, 0xC0, 0x06, 0x10, 0x01, 0x82, 0x00, 0xE0, 0x60,
0xE8, 0x0F, 0xE3, 0xC0, 0x07, 0xE0, 0x1C, 0x18, 0x30, 0x0C, 0x60, 0x06,
0x40, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0xC0, 0x00,
0x40, 0x00, 0x60, 0x00, 0x30, 0x03, 0x0C, 0x0E, 0x03, 0xF0, 0x03, 0xFC,
0x18, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x0F, 0xFF, 0x82, 0x00,
0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80,
0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0xFF, 0xF0, 0x0F,
0xC7, 0x9C, 0x3A, 0x18, 0x07, 0x08, 0x01, 0x8C, 0x00, 0xC4, 0x00, 0x22,
0x00, 0x11, 0x00, 0x08, 0x80, 0x04, 0x40, 0x02, 0x10, 0x03, 0x08, 0x01,
0x82, 0x01, 0x40, 0xC3, 0x20, 0x3F, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00,
0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0xF0, 0x00,
0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x47,
0xC0, 0x2C, 0x18, 0x1C, 0x04, 0x0C, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41,
0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10, 0x02, 0x08, 0x01,
0x04, 0x00, 0x82, 0x00, 0x47, 0xC0, 0xF8, 0x06, 0x00, 0x18, 0x00, 0x60,
0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x02, 0x00, 0x08,
0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02,
0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x03, 0xFF, 0xF0, 0x03, 0x00,
0xC0, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x40, 0x10, 0x04,
0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00,
0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x08, 0x06, 0xFE, 0x00, 0xF0,
0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
0xFE, 0x10, 0x30, 0x10, 0xE0, 0x11, 0xC0, 0x13, 0x00, 0x16, 0x00, 0x1E,
0x00, 0x1B, 0x00, 0x11, 0x80, 0x10, 0xC0, 0x10, 0x60, 0x10, 0x30, 0x10,
0x18, 0x10, 0x1C, 0xF0, 0x3F, 0x7E, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80,
0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20,
0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08,
0x00, 0x20, 0x00, 0x80, 0xFF, 0xFC, 0xEF, 0x9E, 0x07, 0x1E, 0x20, 0xC1,
0x82, 0x10, 0x20, 0x42, 0x04, 0x08, 0x40, 0x81, 0x08, 0x10, 0x21, 0x02,
0x04, 0x20, 0x40, 0x84, 0x08, 0x10, 0x81, 0x02, 0x10, 0x20, 0x42, 0x04,
0x08, 0x40, 0x81, 0x3E, 0x1C, 0x38, 0x71, 0xF0, 0x0B, 0x06, 0x07, 0x01,
0x03, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10,
0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x13,
0xF0, 0x3E, 0x07, 0xC0, 0x30, 0x60, 0x80, 0x22, 0x00, 0x24, 0x00, 0x50,
0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x05, 0x00, 0x12, 0x00,
0x22, 0x00, 0x83, 0x06, 0x01, 0xF0, 0x00, 0xF1, 0xFC, 0x05, 0xC1, 0x81,
0xC0, 0x10, 0x60, 0x02, 0x18, 0x00, 0xC4, 0x00, 0x11, 0x00, 0x04, 0x40,
0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x80, 0x08, 0x60, 0x02, 0x14, 0x01,
0x04, 0xC1, 0x81, 0x0F, 0x80, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, 0x01,
0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xE3, 0xC6,
0x0E, 0x86, 0x00, 0xE1, 0x00, 0x18, 0xC0, 0x06, 0x20, 0x00, 0x88, 0x00,
0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x84, 0x00, 0x61, 0x00, 0x18,
0x20, 0x0A, 0x06, 0x0C, 0x80, 0x7C, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00,
0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0F, 0xF0, 0xF8,
0x7C, 0x11, 0x8C, 0x2C, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x00,
0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01,
0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xD1, 0x83, 0x98, 0x04, 0x80, 0x24, 0x00,
0x30, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x00, 0x1C,
0x01, 0xF0, 0x1A, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
0x00, 0x08, 0x00, 0xFF, 0xFC, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
0x00, 0x08, 0x00, 0x08, 0x01, 0x06, 0x0F, 0x03, 0xF8, 0xF0, 0x3E, 0x08,
0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08,
0x20, 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00,
0xE0, 0x41, 0xD0, 0x1F, 0x8E, 0xFE, 0x0F, 0xE2, 0x00, 0x20, 0x60, 0x0C,
0x0C, 0x01, 0x80, 0x80, 0x20, 0x18, 0x0C, 0x01, 0x01, 0x00, 0x30, 0x60,
0x02, 0x08, 0x00, 0x41, 0x00, 0x0C, 0x60, 0x00, 0x88, 0x00, 0x19, 0x00,
0x01, 0x40, 0x00, 0x38, 0x00, 0xFC, 0x07, 0xE4, 0x00, 0x10, 0x80, 0x02,
0x18, 0x20, 0xC3, 0x0E, 0x18, 0x21, 0x42, 0x04, 0x28, 0x40, 0x8D, 0x88,
0x19, 0x93, 0x03, 0x22, 0x60, 0x2C, 0x68, 0x05, 0x85, 0x00, 0xA0, 0xA0,
0x1C, 0x1C, 0x01, 0x81, 0x80, 0x7C, 0x1F, 0x18, 0x03, 0x06, 0x03, 0x01,
0x83, 0x00, 0x63, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x03, 0x80, 0x03, 0x60,
0x03, 0x18, 0x03, 0x06, 0x03, 0x01, 0x83, 0x00, 0x61, 0x00, 0x33, 0xF0,
0x7E, 0xFC, 0x1F, 0x90, 0x01, 0x8C, 0x00, 0x86, 0x00, 0xC1, 0x80, 0x40,
0xC0, 0x60, 0x20, 0x20, 0x18, 0x30, 0x04, 0x10, 0x03, 0x08, 0x00, 0x8C,
0x00, 0x64, 0x00, 0x16, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01,
0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x07, 0xFE, 0x00,
0xFF, 0xF4, 0x01, 0x20, 0x09, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00,
0xC0, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x14, 0x00, 0xA0, 0x07, 0xFF,
0xE0, 0x07, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x30, 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x0C, 0x07, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x30, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x0C, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0xE0, 0x1C, 0x00, 0x44, 0x0D, 0x84,
0x36, 0x04, 0x40, 0x07, 0x00 };

const GFXglyph FreeMono18pt7bGlyphs[] PROGMEM = {
{ 0, 0, 0, 21, 0, 1 }, // 0x20 ' '
{ 0, 4, 22, 21, 8, -21 }, // 0x21 '!'
{ 11, 11, 10, 21, 5, -20 }, // 0x22 '"'
{ 25, 14, 24, 21, 3, -21 }, // 0x23 '#'
{ 67, 13, 26, 21, 4, -22 }, // 0x24 '$'
{ 110, 15, 21, 21, 3, -20 }, // 0x25 '%'
{ 150, 12, 18, 21, 4, -17 }, // 0x26 '&'
{ 177, 4, 10, 21, 8, -20 }, // 0x27 '''
{ 182, 5, 25, 21, 10, -20 }, // 0x28 '('
{ 198, 5, 25, 21, 6, -20 }, // 0x29 ')'
{ 214, 13, 12, 21, 4, -20 }, // 0x2A '*'
{ 234, 15, 17, 21, 3, -17 }, // 0x2B '+'
{ 266, 7, 10, 21, 5, -4 }, // 0x2C ','
{ 275, 15, 1, 21, 3, -9 }, // 0x2D '-'
{ 277, 5, 5, 21, 8, -4 }, // 0x2E '.'
{ 281, 13, 26, 21, 4, -22 }, // 0x2F '/'
{ 324, 13, 21, 21, 4, -20 }, // 0x30 '0'
{ 359, 13, 21, 21, 4, -20 }, // 0x31 '1'
{ 394, 13, 21, 21, 3, -20 }, // 0x32 '2'
{ 429, 14, 21, 21, 3, -20 }, // 0x33 '3'
{ 466, 12, 21, 21, 4, -20 }, // 0x34 '4'
{ 498, 14, 21, 21, 3, -20 }, // 0x35 '5'
{ 535, 12, 21, 21, 5, -20 }, // 0x36 '6'
{ 567, 12, 21, 21, 4, -20 }, // 0x37 '7'
{ 599, 13, 21, 21, 4, -20 }, // 0x38 '8'
{ 634, 12, 21, 21, 5, -20 }, // 0x39 '9'
{ 666, 5, 15, 21, 8, -14 }, // 0x3A ':'
{ 676, 7, 20, 21, 5, -14 }, // 0x3B ';'
{ 694, 15, 16, 21, 3, -17 }, // 0x3C '<'
{ 724, 17, 6, 21, 2, -12 }, // 0x3D '='
{ 737, 15, 16, 21, 3, -17 }, // 0x3E '>'
{ 767, 12, 20, 21, 5, -19 }, // 0x3F '?'
{ 797, 13, 23, 21, 4, -20 }, // 0x40 '@'
{ 835, 21, 20, 21, 0, -19 }, // 0x41 'A'
{ 888, 18, 20, 21, 1, -19 }, // 0x42 'B'
{ 933, 17, 20, 21, 2, -19 }, // 0x43 'C'
{ 976, 16, 20, 21, 2, -19 }, // 0x44 'D'
{ 1016, 17, 20, 21, 1, -19 }, // 0x45 'E'
{ 1059, 17, 20, 21, 1, -19 }, // 0x46 'F'
{ 1102, 17, 20, 21, 2, -19 }, // 0x47 'G'
{ 1145, 16, 20, 21, 2, -19 }, // 0x48 'H'
{ 1185, 13, 20, 21, 4, -19 }, // 0x49 'I'
{ 1218, 17, 20, 21, 3, -19 }, // 0x4A 'J'
{ 1261, 18, 20, 21, 1, -19 }, // 0x4B 'K'
{ 1306, 15, 20, 21, 3, -19 }, // 0x4C 'L'
{ 1344, 19, 20, 21, 1, -19 }, // 0x4D 'M'
{ 1392, 18, 20, 21, 1, -19 }, // 0x4E 'N'
{ 1437, 17, 20, 21, 2, -19 }, // 0x4F 'O'
{ 1480, 16, 20, 21, 1, -19 }, // 0x50 'P'
{ 1520, 17, 24, 21, 2, -19 }, // 0x51 'Q'
{ 1571, 19, 20, 21, 1, -19 }, // 0x52 'R'
{ 1619, 14, 20, 21, 3, -19 }, // 0x53 'S'
{ 1654, 15, 20, 21, 3, -19 }, // 0x54 'T'
{ 1692, 17, 20, 21, 2, -19 }, // 0x55 'U'
{ 1735, 21, 20, 21, 0, -19 }, // 0x56 'V'
{ 1788, 19, 20, 21, 1, -19 }, // 0x57 'W'
{ 1836, 19, 20, 21, 1, -19 }, // 0x58 'X'
{ 1884, 17, 20, 21, 2, -19 }, // 0x59 'Y'
{ 1927, 13, 20, 21, 4, -19 }, // 0x5A 'Z'
{ 1960, 5, 25, 21, 10, -20 }, // 0x5B '['
{ 1976, 13, 26, 21, 4, -22 }, // 0x5C '\'
{ 2019, 5, 25, 21, 6, -20 }, // 0x5D ']'
{ 2035, 13, 9, 21, 4, -20 }, // 0x5E '^'
{ 2050, 21, 1, 21, 0, 4 }, // 0x5F '_'
{ 2053, 6, 5, 21, 5, -21 }, // 0x60 '`'
{ 2057, 16, 15, 21, 3, -14 }, // 0x61 'a'
{ 2087, 18, 21, 21, 1, -20 }, // 0x62 'b'
{ 2135, 15, 15, 21, 3, -14 }, // 0x63 'c'
{ 2164, 18, 21, 21, 2, -20 }, // 0x64 'd'
{ 2212, 16, 15, 21, 2, -14 }, // 0x65 'e'
{ 2242, 14, 21, 21, 4, -20 }, // 0x66 'f'
{ 2279, 17, 22, 21, 2, -14 }, // 0x67 'g'
{ 2326, 17, 21, 21, 1, -20 }, // 0x68 'h'
{ 2371, 14, 22, 21, 4, -21 }, // 0x69 'i'
{ 2410, 10, 29, 21, 5, -21 }, // 0x6A 'j'
{ 2447, 16, 21, 21, 2, -20 }, // 0x6B 'k'
{ 2489, 14, 21, 21, 4, -20 }, // 0x6C 'l'
{ 2526, 19, 15, 21, 1, -14 }, // 0x6D 'm'
{ 2562, 17, 15, 21, 1, -14 }, // 0x6E 'n'
{ 2594, 15, 15, 21, 3, -14 }, // 0x6F 'o'
{ 2623, 18, 22, 21, 1, -14 }, // 0x70 'p'
{ 2673, 18, 22, 21, 2, -14 }, // 0x71 'q'
{ 2723, 15, 15, 21, 3, -14 }, // 0x72 'r'
{ 2752, 13, 15, 21, 4, -14 }, // 0x73 's'
{ 2777, 16, 20, 21, 1, -19 }, // 0x74 't'
{ 2817, 17, 15, 21, 1, -14 }, // 0x75 'u'
{ 2849, 19, 15, 21, 1, -14 }, // 0x76 'v'
{ 2885, 19, 15, 21, 1, -14 }, // 0x77 'w'
{ 2921, 17, 15, 21, 2, -14 }, // 0x78 'x'
{ 2953, 17, 22, 21, 2, -14 }, // 0x79 'y'
{ 3000, 13, 15, 21, 4, -14 }, // 0x7A 'z'
{ 3025, 8, 25, 21, 6, -20 }, // 0x7B '{'
{ 3050, 1, 25, 21, 10, -20 }, // 0x7C '|'
{ 3054, 8, 25, 21, 7, -20 }, // 0x7D '}'
{ 3079, 15, 5, 21, 3, -11 } }; // 0x7E '~'

const GFXfont FreeMono18pt7b PROGMEM = {
(uint8_t *)FreeMono18pt7bBitmaps,
(GFXglyph *)FreeMono18pt7bGlyphs,
0x20, 0x7E, 35 };

// Approx. 3761 bytes

+ 577
- 0
MK3_Firmware/lib/TFT_eSPI_Modified/Fonts/GFXFF/FreeMono24pt7b.h 查看文件

@@ -0,0 +1,577 @@
const uint8_t FreeMono24pt7bBitmaps[] PROGMEM = {
0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x10, 0x84, 0x21, 0x08,
0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0xFE, 0x7F, 0x7C, 0x3E, 0x7C,
0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x3C,
0x3E, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x01,
0x86, 0x00, 0x30, 0xC0, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18, 0x60, 0x03,
0x0C, 0x00, 0x61, 0x80, 0x0C, 0x70, 0x01, 0x8C, 0x00, 0x61, 0x80, 0x0C,
0x30, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18,
0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x7F, 0xFF, 0xEF, 0xFF,
0xFC, 0x06, 0x18, 0x00, 0xC7, 0x00, 0x38, 0xC0, 0x06, 0x18, 0x00, 0xC3,
0x00, 0x18, 0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x01, 0x86,
0x00, 0x30, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0F, 0xC0,
0x0F, 0xFD, 0x87, 0x03, 0xE3, 0x80, 0x39, 0xC0, 0x06, 0x60, 0x01, 0x98,
0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F,
0x80, 0x03, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03,
0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x80, 0x0E, 0xFC, 0x0F, 0x37,
0xFF, 0x80, 0x7F, 0x80, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C,
0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x80, 0x01, 0xFE, 0x00, 0x38,
0x70, 0x03, 0x03, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06,
0x01, 0x80, 0x30, 0x30, 0x03, 0x87, 0x00, 0x1F, 0xE0, 0x30, 0x78, 0x1F,
0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x00, 0xF8, 0x00,
0x0C, 0x01, 0xE0, 0x00, 0x7F, 0x80, 0x0E, 0x1C, 0x00, 0xC0, 0xC0, 0x18,
0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x0C, 0x0E, 0x00,
0xE1, 0xC0, 0x07, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xEC, 0x01, 0xFF, 0x00,
0xE1, 0x00, 0x70, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30,
0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x7C, 0x00, 0x3B, 0x83,
0xD8, 0x60, 0xFE, 0x0C, 0x33, 0x03, 0x98, 0xC0, 0x66, 0x30, 0x0D, 0x8C,
0x03, 0xC3, 0x00, 0x70, 0x60, 0x1C, 0x1C, 0x0F, 0x03, 0x87, 0x7C, 0x7F,
0x9F, 0x07, 0x80, 0x00, 0xFE, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x3C,
0x70, 0xE1, 0xC3, 0x87, 0x00, 0x06, 0x1C, 0x30, 0xE1, 0x87, 0x0E, 0x18,
0x70, 0xE1, 0xC3, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x0C,
0x1C, 0x38, 0x70, 0x60, 0xE1, 0xC1, 0x83, 0x83, 0x06, 0x06, 0x04, 0xC1,
0xC1, 0x83, 0x83, 0x07, 0x0E, 0x0C, 0x1C, 0x38, 0x70, 0xE0, 0xE1, 0xC3,
0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x87, 0x0E, 0x1C, 0x30, 0x61, 0xC3,
0x0E, 0x18, 0x70, 0xC1, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00,
0x03, 0x00, 0x00, 0xC0, 0x10, 0x30, 0x3F, 0x8C, 0x7C, 0xFF, 0xFC, 0x07,
0xF8, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x0C, 0xC0, 0x06, 0x18, 0x03, 0x87,
0x00, 0xC0, 0xC0, 0x60, 0x18, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60,
0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06,
0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00,
0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00,
0x1F, 0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C,
0x1C, 0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF0, 0x7D, 0xFF,
0xFF, 0xFF, 0xEF, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00,
0x06, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C,
0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00,
0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06,
0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0E, 0x00,
0x03, 0x00, 0x01, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x0C, 0x00, 0x07,
0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x03,
0xF0, 0x03, 0xFF, 0x01, 0xE1, 0xE0, 0xE0, 0x18, 0x30, 0x03, 0x1C, 0x00,
0xE6, 0x00, 0x19, 0x80, 0x06, 0xE0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F,
0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0,
0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00,
0x76, 0x00, 0x19, 0x80, 0x06, 0x70, 0x03, 0x8C, 0x00, 0xC3, 0x80, 0x60,
0x78, 0x78, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x03, 0x80, 0x07, 0x80, 0x0F,
0x80, 0x1D, 0x80, 0x39, 0x80, 0x71, 0x80, 0xE1, 0x80, 0xC1, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xC0, 0xE0,
0xC0, 0x1C, 0x60, 0x03, 0xB8, 0x00, 0x6C, 0x00, 0x0F, 0x00, 0x03, 0x00,
0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01,
0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00,
0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30,
0x00, 0xD0, 0x00, 0x38, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03,
0xF8, 0x01, 0xFF, 0xC0, 0x70, 0x3C, 0x18, 0x01, 0xC6, 0x00, 0x18, 0x00,
0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00,
0x06, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x00,
0x78, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00,
0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xD8, 0x00,
0x3B, 0x80, 0x0E, 0x3E, 0x07, 0x81, 0xFF, 0xE0, 0x07, 0xE0, 0x00, 0x00,
0x3C, 0x00, 0x7C, 0x00, 0x6C, 0x00, 0xCC, 0x00, 0x8C, 0x01, 0x8C, 0x03,
0x0C, 0x03, 0x0C, 0x06, 0x0C, 0x04, 0x0C, 0x0C, 0x0C, 0x08, 0x0C, 0x10,
0x0C, 0x30, 0x0C, 0x20, 0x0C, 0x60, 0x0C, 0x40, 0x0C, 0x80, 0x0C, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00,
0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x00, 0xFF, 0x3F, 0xFF, 0x07, 0xFF, 0xE0,
0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01,
0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC7, 0xE0, 0x1F, 0xFF, 0x03,
0x80, 0x70, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x60,
0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0,
0x00, 0x30, 0x00, 0x06, 0xC0, 0x01, 0xDC, 0x00, 0x71, 0xF0, 0x3C, 0x0F,
0xFF, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xF0, 0x3E, 0x00, 0x1E,
0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00,
0x18, 0x00, 0x06, 0x00, 0x03, 0x80, 0x00, 0xC1, 0xF8, 0x31, 0xFF, 0x0C,
0xF0, 0xF3, 0x70, 0x0C, 0xD8, 0x01, 0xBC, 0x00, 0x6E, 0x00, 0x0F, 0x80,
0x03, 0xC0, 0x00, 0xD8, 0x00, 0x36, 0x00, 0x0D, 0x80, 0x03, 0x30, 0x01,
0x8E, 0x00, 0x61, 0xC0, 0x30, 0x38, 0x38, 0x07, 0xFC, 0x00, 0x7C, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xC0,
0x00, 0x60, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00,
0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30,
0x00, 0x0C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00,
0x0C, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C,
0x00, 0x03, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x03, 0xC0, 0xF1, 0xC0, 0x0E,
0x60, 0x01, 0xB8, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0,
0x00, 0x36, 0x00, 0x18, 0xC0, 0x0C, 0x1C, 0x0E, 0x03, 0xFF, 0x00, 0xFF,
0xC0, 0x70, 0x38, 0x30, 0x03, 0x18, 0x00, 0x66, 0x00, 0x1B, 0x00, 0x03,
0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x60, 0x01, 0x98,
0x00, 0xE3, 0x00, 0x70, 0x70, 0x38, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x07,
0xE0, 0x03, 0xFE, 0x01, 0xC1, 0xC0, 0xC0, 0x38, 0x60, 0x07, 0x18, 0x00,
0xCC, 0x00, 0x1B, 0x00, 0x06, 0xC0, 0x01, 0xB0, 0x00, 0x3C, 0x00, 0x1F,
0x00, 0x07, 0x60, 0x03, 0xD8, 0x01, 0xB3, 0x00, 0xCC, 0xF0, 0xF3, 0x0F,
0xF8, 0xC1, 0xF8, 0x30, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00,
0xE0, 0x00, 0x30, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x80,
0x07, 0xC0, 0xFF, 0xC0, 0x1F, 0xC0, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF,
0xF7, 0xC0, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF1, 0xF8, 0x7C, 0x3F, 0x0F,
0x83, 0xE0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x38, 0x04, 0x00,
0x00, 0x00, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00,
0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00,
0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00,
0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00,
0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x38, 0x00, 0x00,
0x20, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
0xFF, 0x7F, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00,
0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03,
0xC0, 0x00, 0x07, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xE0,
0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0,
0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0x60,
0x00, 0x00, 0x07, 0xF0, 0x1F, 0xFE, 0x3E, 0x07, 0x98, 0x00, 0xEC, 0x00,
0x36, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0xC0,
0x00, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x00, 0x03, 0x00,
0x01, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00,
0x78, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xE0, 0xE0, 0xE0, 0x1C, 0x30,
0x03, 0x1C, 0x00, 0x66, 0x00, 0x19, 0x80, 0x06, 0xC0, 0x01, 0xB0, 0x07,
0xEC, 0x07, 0xFB, 0x03, 0xC6, 0xC1, 0xC1, 0xB0, 0xE0, 0x6C, 0x30, 0x1B,
0x0C, 0x06, 0xC3, 0x01, 0xB0, 0xC0, 0x6C, 0x18, 0x1B, 0x07, 0x86, 0xC0,
0xFF, 0xF0, 0x0F, 0xFC, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00,
0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x80, 0xC0, 0xFF, 0xF0,
0x0F, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1B, 0x00,
0x00, 0x01, 0x98, 0x00, 0x00, 0x11, 0x80, 0x00, 0x03, 0x0C, 0x00, 0x00,
0x30, 0xC0, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06,
0x00, 0x00, 0xC0, 0x30, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x80, 0x30, 0x00,
0x18, 0x01, 0x80, 0x01, 0x80, 0x18, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF,
0xFC, 0x00, 0x20, 0x00, 0xC0, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60,
0x0C, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x01, 0x80,
0x00, 0x18, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x03,
0xFF, 0xFF, 0x01, 0x80, 0x0E, 0x06, 0x00, 0x1C, 0x18, 0x00, 0x38, 0x60,
0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x38, 0x60, 0x01,
0xC1, 0x80, 0x1E, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x60, 0x03, 0xC1,
0x80, 0x03, 0x86, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x60, 0x00, 0x31, 0x80,
0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x61, 0x80, 0x03,
0x86, 0x00, 0x1C, 0xFF, 0xFF, 0xE3, 0xFF, 0xFE, 0x00, 0x00, 0xFC, 0x00,
0x0F, 0xFE, 0x60, 0xF0, 0x3D, 0x87, 0x00, 0x3E, 0x38, 0x00, 0x38, 0xC0,
0x00, 0xE7, 0x00, 0x01, 0x98, 0x00, 0x06, 0x60, 0x00, 0x03, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C,
0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00,
0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00,
0xC7, 0x00, 0x06, 0x0E, 0x00, 0x70, 0x1E, 0x07, 0x80, 0x3F, 0xFC, 0x00,
0x1F, 0x80, 0xFF, 0xFE, 0x03, 0xFF, 0xFE, 0x03, 0x00, 0x3C, 0x0C, 0x00,
0x38, 0x30, 0x00, 0x70, 0xC0, 0x00, 0xC3, 0x00, 0x03, 0x8C, 0x00, 0x06,
0x30, 0x00, 0x1C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30,
0x00, 0x0C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30, 0x00,
0x0C, 0xC0, 0x00, 0x33, 0x00, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x30,
0xC0, 0x01, 0xC3, 0x00, 0x0E, 0x0C, 0x00, 0xF0, 0xFF, 0xFF, 0x83, 0xFF,
0xF8, 0x00, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xE1, 0x80, 0x01, 0x86, 0x00,
0x06, 0x18, 0x00, 0x18, 0x60, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x00,
0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F,
0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00,
0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C,
0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x80, 0x00, 0xC6, 0x00,
0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x00,
0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F,
0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00,
0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00,
0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0xFF, 0xF0, 0x03, 0xFF,
0xC0, 0x00, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0x98, 0x1E, 0x03, 0xF0, 0x70,
0x01, 0xE1, 0x80, 0x01, 0xC6, 0x00, 0x01, 0x9C, 0x00, 0x03, 0x30, 0x00,
0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x03, 0xFF,
0xC0, 0x07, 0xFF, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x37, 0x00, 0x00, 0x66,
0x00, 0x00, 0xCC, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x1C, 0x00, 0x06, 0x1E,
0x00, 0x0C, 0x0F, 0x00, 0xF8, 0x0F, 0xFF, 0xC0, 0x03, 0xFC, 0x00, 0x7F,
0x01, 0xFC, 0xFE, 0x03, 0xF8, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80,
0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00,
0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30,
0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03,
0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0xFF, 0x01, 0xFF, 0xFE,
0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xFF, 0xFC,
0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00,
0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00,
0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00,
0x30, 0x60, 0x00, 0x60, 0xC0, 0x00, 0xC1, 0x80, 0x01, 0x83, 0x00, 0x03,
0x06, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x30, 0x38, 0x00, 0x60,
0x38, 0x01, 0x80, 0x3C, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
0xFF, 0x81, 0xFE, 0xFF, 0x81, 0xFE, 0x18, 0x00, 0x30, 0x18, 0x00, 0xE0,
0x18, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x18, 0x07, 0x00, 0x18, 0x0E, 0x00,
0x18, 0x18, 0x00, 0x18, 0x70, 0x00, 0x18, 0xE0, 0x00, 0x19, 0xE0, 0x00,
0x1B, 0xF8, 0x00, 0x1F, 0x1C, 0x00, 0x1C, 0x06, 0x00, 0x18, 0x03, 0x00,
0x18, 0x03, 0x80, 0x18, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x18, 0x00, 0xC0,
0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x70, 0x18, 0x00, 0x30,
0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x01,
0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00,
0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C,
0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00,
0x06, 0x00, 0x18, 0x30, 0x00, 0xC1, 0x80, 0x06, 0x0C, 0x00, 0x30, 0x60,
0x01, 0x83, 0x00, 0x0C, 0x18, 0x00, 0x60, 0xC0, 0x03, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xC0, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xF3, 0x60, 0x01,
0xB0, 0xD8, 0x00, 0x6C, 0x33, 0x00, 0x33, 0x0C, 0xC0, 0x0C, 0xC3, 0x38,
0x07, 0x30, 0xC6, 0x01, 0x8C, 0x31, 0xC0, 0xE3, 0x0C, 0x30, 0x30, 0xC3,
0x0C, 0x0C, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x0C, 0xC0,
0xC3, 0x03, 0x30, 0x30, 0xC0, 0x78, 0x0C, 0x30, 0x1E, 0x03, 0x0C, 0x03,
0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0x30, 0x00, 0x03, 0x0C,
0x00, 0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0xFF, 0x00, 0x3F,
0xFF, 0xC0, 0x0F, 0xF0, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0x1E, 0x00,
0x0C, 0x1F, 0x00, 0x0C, 0x1B, 0x00, 0x0C, 0x19, 0x80, 0x0C, 0x19, 0xC0,
0x0C, 0x18, 0xC0, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x30,
0x0C, 0x18, 0x38, 0x0C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x0C, 0x18, 0x0E,
0x0C, 0x18, 0x06, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x01,
0x8C, 0x18, 0x01, 0xCC, 0x18, 0x00, 0xCC, 0x18, 0x00, 0x6C, 0x18, 0x00,
0x7C, 0x18, 0x00, 0x3C, 0x7F, 0x80, 0x1C, 0x7F, 0x80, 0x1C, 0x00, 0x7E,
0x00, 0x01, 0xFF, 0xC0, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00,
0x38, 0x38, 0x00, 0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00,
0x06, 0x60, 0x00, 0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
0x03, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00,
0x0E, 0x30, 0x00, 0x0C, 0x38, 0x00, 0x1C, 0x1C, 0x00, 0x38, 0x0E, 0x00,
0x70, 0x07, 0x81, 0xE0, 0x03, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0xFF, 0xFF,
0x07, 0xFF, 0xFE, 0x06, 0x00, 0x78, 0x30, 0x00, 0xE1, 0x80, 0x03, 0x0C,
0x00, 0x0C, 0x60, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, 0xC0, 0x01,
0xC6, 0x00, 0x0C, 0x30, 0x00, 0xC1, 0x80, 0x1E, 0x0F, 0xFF, 0xC0, 0x7F,
0xF8, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00,
0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00,
0x00, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFF,
0x80, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00, 0x38, 0x38, 0x00,
0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00, 0x06, 0x60, 0x00,
0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0E, 0x30, 0x00,
0x0C, 0x18, 0x00, 0x1C, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x81,
0xE0, 0x00, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xFF,
0x87, 0x07, 0xFF, 0xFE, 0x07, 0x00, 0xF8, 0xFF, 0xFE, 0x00, 0xFF, 0xFF,
0x80, 0x18, 0x03, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00,
0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00,
0x70, 0x18, 0x00, 0x60, 0x18, 0x01, 0xC0, 0x18, 0x07, 0x80, 0x1F, 0xFF,
0x00, 0x1F, 0xFC, 0x00, 0x18, 0x0E, 0x00, 0x18, 0x07, 0x00, 0x18, 0x03,
0x80, 0x18, 0x01, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00,
0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, 0xFF, 0x80, 0x1F, 0xFF, 0x80,
0x0F, 0x03, 0xF8, 0x00, 0xFF, 0xE6, 0x1E, 0x07, 0xE3, 0x80, 0x1E, 0x30,
0x00, 0xE6, 0x00, 0x06, 0x60, 0x00, 0x66, 0x00, 0x06, 0x60, 0x00, 0x07,
0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0xC0,
0x00, 0x3F, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00,
0x30, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00,
0x06, 0xF8, 0x01, 0xED, 0xE0, 0x7C, 0xCF, 0xFF, 0x00, 0x3F, 0xC0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xF0, 0x0C, 0x03, 0xC0, 0x30,
0x0F, 0x00, 0xC0, 0x3C, 0x03, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0x30, 0x00,
0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00,
0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0,
0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00,
0x03, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0xFF,
0x01, 0xFF, 0xFE, 0x03, 0xFC, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00,
0x01, 0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00,
0x18, 0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00, 0x01,
0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x18,
0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x80, 0x03, 0x83,
0x00, 0x06, 0x07, 0x00, 0x1C, 0x07, 0x00, 0x70, 0x07, 0x83, 0xC0, 0x07,
0xFF, 0x00, 0x03, 0xF8, 0x00, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF,
0x18, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x00, 0x60,
0x00, 0x30, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x03, 0x00, 0x0C,
0x00, 0x30, 0x00, 0xC0, 0x03, 0x80, 0x0C, 0x00, 0x18, 0x01, 0x80, 0x01,
0x80, 0x18, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x0E, 0x03,
0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, 0x00, 0x00, 0x30, 0xC0, 0x00,
0x03, 0x0C, 0x00, 0x00, 0x30, 0x80, 0x00, 0x01, 0x98, 0x00, 0x00, 0x19,
0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x00,
0xFF, 0x80, 0x7F, 0xFF, 0xE0, 0x1F, 0xF3, 0x00, 0x00, 0x30, 0xC0, 0x00,
0x0C, 0x30, 0x00, 0x03, 0x0C, 0x03, 0x80, 0xC3, 0x01, 0xE0, 0x30, 0x60,
0x78, 0x0C, 0x18, 0x1F, 0x02, 0x06, 0x04, 0xC0, 0x81, 0x83, 0x30, 0x60,
0x60, 0xCC, 0x18, 0x18, 0x31, 0x86, 0x06, 0x18, 0x61, 0x81, 0x86, 0x18,
0x60, 0x71, 0x87, 0x18, 0x0C, 0x40, 0xC6, 0x03, 0x30, 0x31, 0x00, 0xCC,
0x0C, 0xC0, 0x33, 0x01, 0xB0, 0x0D, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00,
0xD8, 0x06, 0xC0, 0x34, 0x00, 0xF0, 0x07, 0x00, 0x3C, 0x01, 0xC0, 0x0E,
0x00, 0x7F, 0x00, 0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00,
0x38, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x60, 0x03, 0x00, 0xC0, 0x01, 0x81,
0x80, 0x01, 0xC3, 0x80, 0x00, 0xE7, 0x00, 0x00, 0x76, 0x00, 0x00, 0x3C,
0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66,
0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x03, 0x81, 0xC0, 0x07, 0x00,
0xE0, 0x06, 0x00, 0x60, 0x0C, 0x00, 0x30, 0x18, 0x00, 0x18, 0x38, 0x00,
0x1C, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x30, 0x0E, 0x00, 0x70, 0x06, 0x00,
0x60, 0x03, 0x00, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC3,
0x00, 0x00, 0xE7, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C,
0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x07, 0xFF, 0xE0, 0x07, 0xFF,
0xE0, 0x7F, 0xFF, 0x9F, 0xFF, 0xE6, 0x00, 0x19, 0x80, 0x0C, 0x60, 0x07,
0x18, 0x03, 0x86, 0x00, 0xC1, 0x80, 0x70, 0x00, 0x38, 0x00, 0x0C, 0x00,
0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x1C,
0x00, 0x06, 0x00, 0x03, 0x80, 0x31, 0xC0, 0x0C, 0x60, 0x03, 0x30, 0x00,
0xDC, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18,
0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06,
0x0C, 0x18, 0x30, 0x60, 0xFF, 0xFC, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00,
0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00,
0x0C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00,
0xC0, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06,
0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x80, 0x00, 0x60,
0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x18, 0x00, 0x07, 0x00,
0x00, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00,
0x0C, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30,
0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C,
0x18, 0x30, 0x60, 0xC1, 0x83, 0xFF, 0xFC, 0x00, 0x40, 0x00, 0x30, 0x00,
0x1E, 0x00, 0x0E, 0xC0, 0x07, 0x38, 0x01, 0x87, 0x00, 0xC0, 0xC0, 0x60,
0x18, 0x38, 0x03, 0x1C, 0x00, 0xE6, 0x00, 0x1F, 0x00, 0x03, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x3C, 0x0E, 0x07, 0x03,
0x01, 0xFC, 0x00, 0x7F, 0xFC, 0x01, 0xC0, 0x3C, 0x00, 0x00, 0x30, 0x00,
0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00,
0x60, 0x0F, 0xF9, 0x81, 0xFF, 0xFE, 0x0F, 0x80, 0x38, 0x70, 0x00, 0x63,
0x80, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x18, 0xC0, 0x00, 0xE3, 0x00,
0x07, 0x86, 0x00, 0x76, 0x1E, 0x07, 0x9F, 0x3F, 0xF8, 0x7C, 0x3F, 0x80,
0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00,
0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x1F, 0x80,
0x18, 0xFF, 0xC0, 0x33, 0x81, 0xC0, 0x6E, 0x01, 0xC0, 0xF0, 0x00, 0xC1,
0xE0, 0x01, 0xC3, 0x80, 0x01, 0x87, 0x00, 0x03, 0x8C, 0x00, 0x03, 0x18,
0x00, 0x06, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80,
0x00, 0x63, 0x80, 0x01, 0x87, 0x00, 0x03, 0x0F, 0x00, 0x0E, 0x1F, 0x00,
0x38, 0x37, 0x00, 0xE3, 0xE7, 0x03, 0x87, 0xC7, 0xFE, 0x00, 0x03, 0xF0,
0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF9, 0x83, 0xC0, 0xFC, 0x38, 0x01, 0xE3,
0x00, 0x07, 0x38, 0x00, 0x19, 0x80, 0x00, 0xDC, 0x00, 0x06, 0xC0, 0x00,
0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60,
0x00, 0x03, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00,
0xC7, 0x00, 0x1E, 0x1E, 0x03, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0x00, 0x00,
0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x01, 0xF8, 0x18, 0x07,
0xFE, 0x18, 0x0F, 0x07, 0x98, 0x1C, 0x01, 0xD8, 0x38, 0x00, 0xF8, 0x70,
0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0, 0x00, 0x18, 0xC0,
0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0,
0x00, 0x18, 0x60, 0x00, 0x38, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x38,
0x00, 0xD8, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x9F, 0x07, 0xFE, 0x1F, 0x01,
0xF8, 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x07, 0x80, 0xF0, 0x70, 0x01,
0xC3, 0x00, 0x07, 0x30, 0x00, 0x19, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0,
0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x0C, 0x00, 0x00,
0x60, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0,
0x00, 0xC7, 0x00, 0x0E, 0x1E, 0x03, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x00,
0x00, 0x7F, 0xC0, 0x3F, 0xFC, 0x0E, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00,
0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x9F, 0xFF, 0xF0,
0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00,
0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00,
0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00,
0xC0, 0x03, 0xFF, 0xFC, 0x7F, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xFC,
0x7C, 0x38, 0x1C, 0xF8, 0xE0, 0x0D, 0x83, 0x00, 0x0F, 0x0E, 0x00, 0x1E,
0x18, 0x00, 0x1C, 0x70, 0x00, 0x38, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63,
0x00, 0x00, 0xC6, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x18, 0x00, 0x06, 0x18,
0x00, 0x1C, 0x30, 0x00, 0x38, 0x30, 0x00, 0xF0, 0x70, 0x03, 0x60, 0x78,
0x1C, 0xC0, 0x3F, 0xF1, 0x80, 0x1F, 0x83, 0x00, 0x00, 0x06, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03,
0x80, 0x00, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xC0, 0x00, 0xF8, 0x00,
0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00,
0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x18, 0xFF, 0x80,
0x37, 0x03, 0x80, 0x7C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03,
0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30,
0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00,
0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00,
0x63, 0xFC, 0x07, 0xFF, 0xF8, 0x0F, 0xF0, 0x01, 0xC0, 0x00, 0x70, 0x00,
0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x03, 0x00, 0x00, 0xC0,
0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00,
0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03,
0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x00, 0x0C,
0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03,
0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00,
0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00,
0x70, 0x03, 0x80, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xF8, 0x00, 0x03, 0xE0,
0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00,
0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x1F, 0xE0, 0x60, 0x7F, 0x81,
0x80, 0x60, 0x06, 0x07, 0x00, 0x18, 0x38, 0x00, 0x61, 0xC0, 0x01, 0x8E,
0x00, 0x06, 0x70, 0x00, 0x1B, 0x80, 0x00, 0x7F, 0x00, 0x01, 0xCE, 0x00,
0x06, 0x1C, 0x00, 0x18, 0x38, 0x00, 0x60, 0x70, 0x01, 0x80, 0xE0, 0x06,
0x01, 0xC0, 0x18, 0x03, 0x80, 0x60, 0x07, 0x0F, 0x80, 0x7F, 0xFE, 0x01,
0xFF, 0x3F, 0xC0, 0x0F, 0xF0, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0,
0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00,
0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03,
0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0,
0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x0F,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x3C, 0x0F, 0x9F, 0x87, 0xE0, 0xFB,
0x1C, 0xC7, 0x01, 0xE0, 0xD8, 0x38, 0x1C, 0x07, 0x01, 0x81, 0x80, 0x60,
0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81,
0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06,
0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18,
0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x8F, 0xE0,
0x7C, 0x1F, 0xFE, 0x07, 0xC1, 0xF0, 0x00, 0x1F, 0x00, 0xF8, 0xFF, 0x81,
0xF3, 0x83, 0x80, 0x6C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03,
0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30,
0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00,
0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00,
0x67, 0xFC, 0x03, 0xFF, 0xF8, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xFE,
0x00, 0xF0, 0x3C, 0x07, 0x00, 0x38, 0x38, 0x00, 0x71, 0xC0, 0x00, 0xE6,
0x00, 0x01, 0x98, 0x00, 0x06, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00,
0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x36, 0x00, 0x01,
0x98, 0x00, 0x06, 0x70, 0x00, 0x38, 0xE0, 0x01, 0xC1, 0xC0, 0x0E, 0x03,
0xC0, 0xF0, 0x07, 0xFF, 0x80, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x01, 0xF1,
0xFF, 0x83, 0xE7, 0x03, 0x80, 0xD8, 0x01, 0x81, 0xE0, 0x01, 0x83, 0xC0,
0x03, 0x87, 0x00, 0x03, 0x0E, 0x00, 0x07, 0x18, 0x00, 0x06, 0x30, 0x00,
0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00,
0xC7, 0x00, 0x03, 0x0E, 0x00, 0x06, 0x1E, 0x00, 0x18, 0x36, 0x00, 0x70,
0x67, 0x03, 0xC0, 0xC7, 0xFE, 0x01, 0x83, 0xF0, 0x03, 0x00, 0x00, 0x06,
0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60,
0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x01,
0xF8, 0x00, 0x07, 0xFF, 0x1F, 0x0F, 0x07, 0x9F, 0x1C, 0x01, 0xD8, 0x38,
0x00, 0x78, 0x70, 0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0,
0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0,
0x00, 0x18, 0xC0, 0x00, 0x18, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x30,
0x00, 0x78, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x98, 0x07, 0xFF, 0x18, 0x01,
0xFC, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
0x03, 0xFF, 0x00, 0x03, 0xFF, 0x7E, 0x03, 0xC3, 0xF0, 0x7F, 0x81, 0x8F,
0x0E, 0x0C, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x00,
0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00,
0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06,
0x00, 0x00, 0x30, 0x00, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x00, 0x07, 0xF0,
0x07, 0xFF, 0x63, 0xC0, 0xF9, 0xC0, 0x0E, 0x60, 0x01, 0x98, 0x00, 0x66,
0x00, 0x19, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F, 0xC0, 0x00,
0x7C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00,
0xF8, 0x00, 0x7F, 0x00, 0x3B, 0xF0, 0x3C, 0xDF, 0xFE, 0x00, 0xFE, 0x00,
0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0,
0x00, 0x06, 0x00, 0x03, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0, 0x0C, 0x00, 0x00,
0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00,
0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03,
0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00,
0x00, 0xC0, 0x07, 0x07, 0x01, 0xF0, 0x1F, 0xFF, 0x00, 0x3F, 0x80, 0xF8,
0x03, 0xF1, 0xF0, 0x07, 0xE0, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80,
0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00,
0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03,
0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x18, 0x00, 0xF0,
0x18, 0x03, 0x60, 0x38, 0x3C, 0xF8, 0x3F, 0xF1, 0xF0, 0x1F, 0x00, 0x00,
0x7F, 0xC0, 0xFF, 0xDF, 0xF0, 0x3F, 0xF0, 0xC0, 0x00, 0xC0, 0x30, 0x00,
0x30, 0x06, 0x00, 0x1C, 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C,
0x00, 0xC0, 0x03, 0x80, 0x30, 0x00, 0x60, 0x18, 0x00, 0x18, 0x06, 0x00,
0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x30, 0x00, 0x06, 0x18,
0x00, 0x00, 0xC6, 0x00, 0x00, 0x33, 0x00, 0x00, 0x0E, 0xC0, 0x00, 0x01,
0xE0, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x0F, 0xF1,
0x80, 0x00, 0x20, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, 0x06, 0x03, 0x01,
0x80, 0x81, 0xE0, 0x60, 0x30, 0x78, 0x10, 0x0C, 0x1E, 0x0C, 0x03, 0x0C,
0xC3, 0x00, 0xC3, 0x30, 0xC0, 0x10, 0xCC, 0x30, 0x06, 0x61, 0x98, 0x01,
0x98, 0x66, 0x00, 0x66, 0x19, 0x80, 0x0B, 0x03, 0x60, 0x03, 0xC0, 0xD0,
0x00, 0xF0, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x0E, 0x01, 0xC0, 0x3F, 0x81,
0xFE, 0x3F, 0x81, 0xFE, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x00,
0xE0, 0x01, 0x81, 0xC0, 0x00, 0xC3, 0x80, 0x00, 0x67, 0x00, 0x00, 0x3C,
0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x67, 0x00, 0x00, 0xC3,
0x80, 0x01, 0x81, 0xC0, 0x03, 0x00, 0xE0, 0x06, 0x00, 0x70, 0x0C, 0x00,
0x38, 0x18, 0x00, 0x1C, 0x7F, 0x81, 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0x00,
0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00,
0x18, 0x0C, 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x60, 0x03, 0x00,
0x60, 0x03, 0x00, 0xC0, 0x01, 0x80, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC1,
0x80, 0x00, 0xC3, 0x00, 0x00, 0x63, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36,
0x00, 0x00, 0x34, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60,
0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC,
0x00, 0xFF, 0xFF, 0x7F, 0xFF, 0xB0, 0x01, 0x98, 0x01, 0xCC, 0x01, 0xC0,
0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE0,
0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x03, 0x70,
0x01, 0xB0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xE0, 0x7C, 0x0C,
0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03,
0x00, 0x60, 0x0C, 0x03, 0x00, 0xE0, 0xF0, 0x1E, 0x00, 0x70, 0x06, 0x00,
0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60,
0x0C, 0x01, 0x80, 0x18, 0x03, 0xE0, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0x1F, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x18,
0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x01,
0x80, 0x38, 0x01, 0xE0, 0x3C, 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x03, 0x00,
0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0,
0xF8, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0xFC, 0x03, 0x70, 0xE0, 0x76, 0x07,
0x8E, 0xC0, 0x1F, 0xC0, 0x00, 0xF0 };

const GFXglyph FreeMono24pt7bGlyphs[] PROGMEM = {
{ 0, 0, 0, 28, 0, 1 }, // 0x20 ' '
{ 0, 5, 30, 28, 11, -28 }, // 0x21 '!'
{ 19, 16, 14, 28, 6, -28 }, // 0x22 '"'
{ 47, 19, 32, 28, 4, -29 }, // 0x23 '#'
{ 123, 18, 33, 28, 5, -29 }, // 0x24 '$'
{ 198, 20, 29, 28, 4, -27 }, // 0x25 '%'
{ 271, 18, 25, 28, 5, -23 }, // 0x26 '&'
{ 328, 7, 14, 28, 11, -28 }, // 0x27 '''
{ 341, 7, 34, 28, 14, -27 }, // 0x28 '('
{ 371, 7, 34, 28, 8, -27 }, // 0x29 ')'
{ 401, 18, 16, 28, 5, -27 }, // 0x2A '*'
{ 437, 20, 22, 28, 4, -23 }, // 0x2B '+'
{ 492, 9, 14, 28, 6, -6 }, // 0x2C ','
{ 508, 22, 2, 28, 3, -13 }, // 0x2D '-'
{ 514, 7, 6, 28, 11, -4 }, // 0x2E '.'
{ 520, 18, 35, 28, 5, -30 }, // 0x2F '/'
{ 599, 18, 30, 28, 5, -28 }, // 0x30 '0'
{ 667, 16, 29, 28, 6, -28 }, // 0x31 '1'
{ 725, 18, 29, 28, 5, -28 }, // 0x32 '2'
{ 791, 19, 30, 28, 5, -28 }, // 0x33 '3'
{ 863, 16, 28, 28, 6, -27 }, // 0x34 '4'
{ 919, 19, 29, 28, 5, -27 }, // 0x35 '5'
{ 988, 18, 30, 28, 6, -28 }, // 0x36 '6'
{ 1056, 18, 28, 28, 5, -27 }, // 0x37 '7'
{ 1119, 18, 30, 28, 5, -28 }, // 0x38 '8'
{ 1187, 18, 30, 28, 6, -28 }, // 0x39 '9'
{ 1255, 7, 21, 28, 11, -19 }, // 0x3A ':'
{ 1274, 10, 27, 28, 7, -19 }, // 0x3B ';'
{ 1308, 22, 22, 28, 3, -23 }, // 0x3C '<'
{ 1369, 24, 9, 28, 2, -17 }, // 0x3D '='
{ 1396, 21, 22, 28, 4, -23 }, // 0x3E '>'
{ 1454, 17, 28, 28, 6, -26 }, // 0x3F '?'
{ 1514, 18, 32, 28, 5, -28 }, // 0x40 '@'
{ 1586, 28, 26, 28, 0, -25 }, // 0x41 'A'
{ 1677, 22, 26, 28, 3, -25 }, // 0x42 'B'
{ 1749, 22, 28, 28, 3, -26 }, // 0x43 'C'
{ 1826, 22, 26, 28, 3, -25 }, // 0x44 'D'
{ 1898, 22, 26, 28, 3, -25 }, // 0x45 'E'
{ 1970, 22, 26, 28, 3, -25 }, // 0x46 'F'
{ 2042, 23, 28, 28, 3, -26 }, // 0x47 'G'
{ 2123, 23, 26, 28, 3, -25 }, // 0x48 'H'
{ 2198, 16, 26, 28, 6, -25 }, // 0x49 'I'
{ 2250, 23, 27, 28, 4, -25 }, // 0x4A 'J'
{ 2328, 24, 26, 28, 3, -25 }, // 0x4B 'K'
{ 2406, 21, 26, 28, 4, -25 }, // 0x4C 'L'
{ 2475, 26, 26, 28, 1, -25 }, // 0x4D 'M'
{ 2560, 24, 26, 28, 2, -25 }, // 0x4E 'N'
{ 2638, 24, 28, 28, 2, -26 }, // 0x4F 'O'
{ 2722, 21, 26, 28, 3, -25 }, // 0x50 'P'
{ 2791, 24, 32, 28, 2, -26 }, // 0x51 'Q'
{ 2887, 24, 26, 28, 3, -25 }, // 0x52 'R'
{ 2965, 20, 28, 28, 4, -26 }, // 0x53 'S'
{ 3035, 22, 26, 28, 3, -25 }, // 0x54 'T'
{ 3107, 23, 27, 28, 3, -25 }, // 0x55 'U'
{ 3185, 28, 26, 28, 0, -25 }, // 0x56 'V'
{ 3276, 26, 26, 28, 1, -25 }, // 0x57 'W'
{ 3361, 24, 26, 28, 2, -25 }, // 0x58 'X'
{ 3439, 24, 26, 28, 2, -25 }, // 0x59 'Y'
{ 3517, 18, 26, 28, 5, -25 }, // 0x5A 'Z'
{ 3576, 7, 34, 28, 13, -27 }, // 0x5B '['
{ 3606, 18, 35, 28, 5, -30 }, // 0x5C '\'
{ 3685, 7, 34, 28, 8, -27 }, // 0x5D ']'
{ 3715, 18, 12, 28, 5, -28 }, // 0x5E '^'
{ 3742, 28, 2, 28, 0, 5 }, // 0x5F '_'
{ 3749, 8, 7, 28, 7, -29 }, // 0x60 '`'
{ 3756, 22, 22, 28, 3, -20 }, // 0x61 'a'
{ 3817, 23, 29, 28, 2, -27 }, // 0x62 'b'
{ 3901, 21, 22, 28, 4, -20 }, // 0x63 'c'
{ 3959, 24, 29, 28, 3, -27 }, // 0x64 'd'
{ 4046, 21, 22, 28, 3, -20 }, // 0x65 'e'
{ 4104, 19, 28, 28, 6, -27 }, // 0x66 'f'
{ 4171, 23, 30, 28, 3, -20 }, // 0x67 'g'
{ 4258, 23, 28, 28, 3, -27 }, // 0x68 'h'
{ 4339, 18, 29, 28, 5, -28 }, // 0x69 'i'
{ 4405, 14, 38, 28, 6, -28 }, // 0x6A 'j'
{ 4472, 22, 28, 28, 4, -27 }, // 0x6B 'k'
{ 4549, 18, 28, 28, 5, -27 }, // 0x6C 'l'
{ 4612, 28, 21, 28, 0, -20 }, // 0x6D 'm'
{ 4686, 23, 21, 28, 2, -20 }, // 0x6E 'n'
{ 4747, 22, 22, 28, 3, -20 }, // 0x6F 'o'
{ 4808, 23, 30, 28, 2, -20 }, // 0x70 'p'
{ 4895, 24, 30, 28, 3, -20 }, // 0x71 'q'
{ 4985, 21, 20, 28, 5, -19 }, // 0x72 'r'
{ 5038, 18, 22, 28, 5, -20 }, // 0x73 's'
{ 5088, 21, 27, 28, 3, -25 }, // 0x74 't'
{ 5159, 23, 21, 28, 3, -19 }, // 0x75 'u'
{ 5220, 26, 20, 28, 1, -19 }, // 0x76 'v'
{ 5285, 26, 20, 28, 1, -19 }, // 0x77 'w'
{ 5350, 24, 20, 28, 2, -19 }, // 0x78 'x'
{ 5410, 24, 29, 28, 2, -19 }, // 0x79 'y'
{ 5497, 17, 20, 28, 6, -19 }, // 0x7A 'z'
{ 5540, 11, 34, 28, 8, -27 }, // 0x7B '{'
{ 5587, 2, 34, 28, 13, -27 }, // 0x7C '|'
{ 5596, 11, 34, 28, 9, -27 }, // 0x7D '}'
{ 5643, 20, 6, 28, 4, -15 } }; // 0x7E '~'

const GFXfont FreeMono24pt7b PROGMEM = {
(uint8_t *)FreeMono24pt7bBitmaps,
(GFXglyph *)FreeMono24pt7bGlyphs,
0x20, 0x7E, 47 };

// Approx. 6330 bytes

部分文件因文件數量過多而無法顯示

Loading…
取消
儲存