Решил сделать что-то подобное на каноничном PIC16@20МГц. Основная цель - выводить много (относительно LCD1602) текста на большой экран с микроконтроллерной системы через ПАРАЛЛЕЛЬНУЮ шину. Но никаких внешних регистров и внешней памяти, все исключительно на внутренних ресурсах PIC16 (нездоровый минимализм), знакогенератор в памяти программ, на стороне ПИКа задействован PSP. В реальном железе пока не воплотил, только код и наброски схемы. Генерация видеосигнала путем выдачи байта данных в USART, работающий в синхронном режиме. Можно будет переделать на выдачу данных через SPI, это не принципиально, пиксельклок получается точно такой же - 5 МГц. Столкнулся с тем, что выдача 1 байта из регистра сдвига занимает 1,6 мкс (8*0,2мкс), а выборку 1 байта из памяти программ не могу осуществить быстрее 1,8 мкс. Между символами получается естественная граница в 1 темный "пиксель" (1,8 - 1,6 = 0,2 мкс). Зато можно использовать полных 8 бит для прорисовки 1 символа, не теряя 1 пиксель скраю знакоместа на создание искусственной границы между символами. Ну и общее быстродействие ПИКа не позволяет выводить более 29 символов в одной строке (для PAL 52мкс/1,8мкс = почти 29). Некрасивое число, получаются сильные потери в банках памяти, ведь времени переключать их во время вывода строки просто не остаётся. Ограничился 24 символами в строке. Получается по 4 строки на каждые 96 байт памяти (размер одного банка для PIC16F77). Задействовал 3 банка по 96 байт, итого 4*3=12 строк отображаемых символов. 24*12=288 байт ОЗУ задействовано под видеопамять. Остаётся 368-288=80 байт под программные нужды. Нулевой банк задействовать под видеопамять нельзя, для вывода в сдвиговый регистр USART, как впрочем и SPI, должен быть выбран именно банк 0, а под переменные в нем места не останется, если разместить там видеопамять. Значит видеопамять находится в банках 1-3. Причем если для последних 2 все ок, то для банка 1 есть нюанс. У него обьем всего 80 независимых байт, а нижние 16 байт shared memory, в которые отображаются старшие 16 байт банка 0. Получается старшие 16 байт видеопамяти банка 1 отображаются на ВСЕ банки, и теряется возможность использовать shared memory. Ну ничего, как-то переживём. Все равно все переменные в банке 0, только регистр выбора банка для косвенной адресации иногда надо переключить. Все манипуляции с видесигналом исключительно в прерывании по таймеру. Пока даже не уверен, что прием данных буду делать по прерыванию PSP, возможно слишком высоки будут накладные расходы на отдельный вызов прерывания PSP, и прием будет осуществляться исключительно опросом пина WR в моменты вывода пустых строк. Но тогда теряется сама суть PSP... Вот такие ухищрения, чтобы втиснуть все в 1 корпус МК.
П.С. Для VGA все ещё грустные, там максимум 14 строк успевает вывестись при 20 МГц. Выбрал для красоты 12 символов, и 8 строк. Как раз 12*8=96 байт, 1 банк под видеопамять, так что хватит даже PIC16F74 с его жалкими 192 байтами в 2 банках.
П.П.С. Посоветуйте, до скольки разогнать ПИК, и какое разрешение при Вашей предложенной частоте выбрать ? Потому что у меня соотношение ширины к высоте разрешения в лучшем случае 2 :1, тогда как в классическом терминале более 3:1, и мои шрифты будут просто уродски широкими.
Вывод текста на TV или VGA с помощью PIC16
Moderator: Shaos
-
MCS51
- Junior
- Posts: 8
- Joined: 22 Nov 2016 10:55
-
Shaos
- Admin
- Posts: 25308
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
На PIC16 я 20 лет назад делал 32x24 на NTSC и PAL - см. viewtopic.php?f=67&t=7533
Но там снаружи были кое-какие микросхемы в помощь...
Но там снаружи были кое-какие микросхемы в помощь...
-
emax
- Novelist
- Posts: 49
- Joined: 15 Sep 2014 22:32
- Location: Пермь
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
я больше к VGA склоняюсь, мониторов сейчас много остается и с цветами проще. На AVR получил 64х25, знакоместо 5х7, без внешних микросхем. Правда AVR китайский аналог 328, он на 32МГц работает.
-
Shaos
- Admin
- Posts: 25308
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
Старых пиков на VGA не хватит - медленные они (20 МГц это только 5 миллионов операций в секунду)
P.S. Хотя есть PIC16 посовременнее аж на 48 МГц:
P.P.S. Предлагаю отделить беседу в новую тему "Вывод текста на VGA с помощью PIC16"
P.S. Хотя есть PIC16 посовременнее аж на 48 МГц:
Там даже есть USB v2.0 и наряду с привычным АЦП имеется один 5-битный ЦАПPIC16F1455-I/SL
IC MCU 8BIT 14KB FLASH 14SOIC
P.P.S. Предлагаю отделить беседу в новую тему "Вывод текста на VGA с помощью PIC16"
-
MCS51
- Junior
- Posts: 8
- Joined: 22 Nov 2016 10:55
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
Да, медленные . Но именно поэтому захотелось реализовать это на PIC16. Не PIC18 (уже есть реализация от Тимофеева), не AVR (куча реализаций), а именно эти старички на 20МГц (можно под небольшим разгоном). Их есть у меня. Спортивный интерес - что смогу выжать из них?Shaos wrote:Старых пиков на VGA не хватит - медленные они...
P.S. Хотя есть PIC16 посовременнее аж на 48 МГц:
P.P.S. Предлагаю отделить беседу в новую тему "Вывод текста на VGA с помощью PIC16"
Уже вижу, что в VGA очень уж скромно по разрешению получается. Может хоть ТВ юзабельно получится.
Тему пока создавать не надо. Даже макета рабочего ещё нет, все времянки отлаживаю в симуляторе MPLABa.
Как сделаю и запущу (очень надеюсь, что хватит силы воли и терпения), так создам отдельную тему. Просто по своему скромному опыту знаю, что если спаяю макет, то как правило довожу проект до стадии "оно что-то может", а если нет макета, то очень много идей остаётся в голове, так и не реализовавшись. А сейчас на службе, не до пайки макетов тут, максимум программировать пару часов в свободное время. Может хоть Протеус наконец освою. Как гляжу какие схемы в нем Lavr отлаживает, аж уважение пробирает...
-
Shaos
- Admin
- Posts: 25308
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Вывод текста на TV или VGA с помощью PIC16
Тему всё-таки отделил
Ради спортивного интереса я PIC12 заставил видео NTSC генерировать в 2016 году
viewtopic.php?f=67&t=16610
Правда до чего-то полезного типа текста так дело и не дошло...
Ради спортивного интереса я PIC12 заставил видео NTSC генерировать в 2016 году
viewtopic.php?f=67&t=16610
Правда до чего-то полезного типа текста так дело и не дошло...
-
MCS51
- Junior
- Posts: 8
- Joined: 22 Nov 2016 10:55
Re: Вывод текста на TV или VGA с помощью PIC16
Вот только сейчас понял, что я не учел, как себя ведёт ножка RX (через которую осуществляется вывод данных в синхронном режиме USART), между передачами, когда последний бит отправляемого байта был лог. 1. Если она остаётся в лог. 1 (не могу что-то найти точную инфу, но по логике так должно быть), то я получу светящийся пиксель между символами. Обидно однако, возможно придется ограничить видимую ширину символа до 7 бит, а последний всегда передавать погашенным, получая 2 "пикселя" темноты между символами - 1 собственно сам погашеный пиксель, а за ним 1 такт ожидания (с таким же лог. уровнем) поступления нового байта в сдвиговый регистр передатчика.
Первоначальные наброски кода делал на ассемблере, выверял такты, чтобы определить самый быстрый способ выборки байтов знакогенератора из Flash. Потом попробовал компилятор CC5X (бесплатная версия) и остался доволен им. После внимательного чтении документации (и отключении авто переключения банков и прочих удобностей типа авто сохранения кучи регистров при вызове прерывания) я добился того, что он генерировал код, точно такой же, как я написал на асме - я остался доволен. Кстати, самый быстрый способ выборки байта из Flash и закидывание этого байта в TXREG оказался через старые добрые поисковые таблицы, а не через нововведений Microchip способ чтения из Flash как памяти данных, с помощью регистров PMADDR и PMDATA. А все потому, что эти регистры находятся в 3 банке памяти, а регистр готовности флеш к вычитке в 4 банке, а TXREG (как впрочем и SSPBUF) в 0 банке. И это переключение банков туда сюда при вычитке-отправке КАЖДОГО байта убивает быстродействие в 0. А так да, способ хранения хороший, позволяет упаковывать по 2шт. 7 битных ASCII символа в 1 слово памяти программ, делая таблицы знакогенератоов в 2 раза меньше. Но конкретно для этого приминения способ не подошёл из-за тормознутости.
И я смог вписаться в 9 тактов только благодаря размещения знакогенератора, как в проекте на PIC18 от Тимофеева - знакогенератор в виде 256 байтных массивов в количестве строк на символ (в моем случае - 12).
П.С. Кстати, в AVR этот способ вывода через USART/SPI, не везде можно реализовать, например в AT90S2313 не USART, а просто UART, без синхронного режима, а SPI вообще нет. Он в пролете.
Первоначальные наброски кода делал на ассемблере, выверял такты, чтобы определить самый быстрый способ выборки байтов знакогенератора из Flash. Потом попробовал компилятор CC5X (бесплатная версия) и остался доволен им. После внимательного чтении документации (и отключении авто переключения банков и прочих удобностей типа авто сохранения кучи регистров при вызове прерывания) я добился того, что он генерировал код, точно такой же, как я написал на асме - я остался доволен. Кстати, самый быстрый способ выборки байта из Flash и закидывание этого байта в TXREG оказался через старые добрые поисковые таблицы, а не через нововведений Microchip способ чтения из Flash как памяти данных, с помощью регистров PMADDR и PMDATA. А все потому, что эти регистры находятся в 3 банке памяти, а регистр готовности флеш к вычитке в 4 банке, а TXREG (как впрочем и SSPBUF) в 0 банке. И это переключение банков туда сюда при вычитке-отправке КАЖДОГО байта убивает быстродействие в 0. А так да, способ хранения хороший, позволяет упаковывать по 2шт. 7 битных ASCII символа в 1 слово памяти программ, делая таблицы знакогенератоов в 2 раза меньше. Но конкретно для этого приминения способ не подошёл из-за тормознутости.
И я смог вписаться в 9 тактов только благодаря размещения знакогенератора, как в проекте на PIC18 от Тимофеева - знакогенератор в виде 256 байтных массивов в количестве строк на символ (в моем случае - 12).
П.С. Кстати, в AVR этот способ вывода через USART/SPI, не везде можно реализовать, например в AT90S2313 не USART, а просто UART, без синхронного режима, а SPI вообще нет. Он в пролете.
-
MCS51
- Junior
- Posts: 8
- Joined: 22 Nov 2016 10:55
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
Вот что удалось выжать для VGA из PIC16 на 20 МГЦ. Как и планировал, экран 12*8 (96 знакомест). Вывод оказалось проще сделать через SPI, не надо ставить инвертор (но в исходнике предусмотрел и сборку для вывода через UART с инвертором). Итого, текстовая nedoвидеокарта состоит из: микроконтроллер PIC16F73(74) -1 шт., резонатор 20 MHz -1 шт., резистор 100-200 Ohm -1 шт. (подал сигнал только на зеленый цвет, чтобы не нагружать вывод МК, и не применять буферы/повторители).Shaos wrote: 28 Aug 2024 23:01 Старых пиков на VGA не хватит - медленные они (20 МГц это только 5 миллионов операций в секунду)...
Исходник занял смешные 336 байт (+3 KB шрифтов), ОЗУ - жалкие 9 байт (+96 байт экранного буфера).
Использовал компилятор, про который писал здесь. viewtopic.php?start=30&t=22845&sid=02b6 ... c35edbea86
Принцып выборки символов из знакогенератора и вывода видеосигнала через снутренний сдвиговый регистр МК (UART/SPI) честно сворованы отсюда -> http://www.pic24.ru/doku.php/osa/articles/vga_terminal
Я просто упростил концепцию до минимума (и взял самый слабый МК, пригодный для этого).
You do not have the required permissions to view the files attached to this post.
-
Shaos
- Admin
- Posts: 25308
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
MCS51
- Junior
- Posts: 8
- Joined: 22 Nov 2016 10:55
Re: Вывод текста на TV или VGA с помощью PIC16
Ну, раз хотя бы кому-то хоть чуть-чуть интересны мои нелепые потуги, то вот исходник. Может кто увидит, где можно улучшить.
Code: Select all
#include "int16CXX.h" // device dependent interrupt definitions
//====================================================================================
#pragma config CP = OFF
#pragma config FOSC = HS // FOSC = 20 MHz !!!
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config BOREN = ON
//------------------------------------------------------------------------------------
#if !defined _16F73 && !defined _16F74
#error "This code only for PIC16F73 or PIC16F74"
#endif
//====================================================================================
#pragma update_IRP 0 // disable auto update_IRP
#pragma update_PAGE 0 // disable auto update_PAGE
//====================================================================================
#define SPI 0
#define UART 1 // an inverted font is used + invertor on PORTC.7
#define USING_INTERFACE SPI
#define DRAW_INTERRUPT 1 // display output within an interrupt (lower jitter)
//------------------------------------------------------------------------------------
#define FONT_HEIGHT 12
#define FONT_TABLE_ADDR 0x400
#define FONT_TABLE_SIZE (FONT_HEIGHT*256)
#define SYMBOLS_PER_STRING 12 // <= 14
#define STRINGS (96/SYMBOLS_PER_STRING) // 8
#define LINES_PER_SYMBOL (480/(STRINGS*FONT_HEIGHT)) // 5
#define FRONT_PORCH 1 // lines*31.8us 10 1
#define V_SYNC_PULSE 2 // lines*31.8us 2 2
#define BACK_PORCH 43 // lines*31.8us 33 43
//------------------------------------------------------------------------------------
// Connect the Video output to 3 RGB pins or only the Green pin via a 100-ohm resistor
//------------------------------------------------------------------------------------
#define H_SYNC_PORT PORTC
#define H_SYNC_TRIS TRISC
#define V_SYNC_PORT PORTC
#define V_SYNC_TRIS TRISC
#if USING_INTERFACE == SPI
#define H_SYNC_PIN 7
#define V_SYNC_PIN 6
#elif USING_INTERFACE == UART
#define H_SYNC_PIN 5
#define V_SYNC_PIN 4
#endif
#pragma bit H_SYNC @H_SYNC_PORT.H_SYNC_PIN
#pragma bit V_SYNC @V_SYNC_PORT.V_SYNC_PIN
//------------------------------------------------------------------------------------
#ifdef _16F73
#define RD_PORT PORTB
#define RD_PIN 0
#pragma bit RD_ @RD_PORT.RD_PIN
#endif
//------------------------------------------------------------------------------------
#define _toggle(PORT,PIN) PORT ^= 1<<PIN
//------------------------------------------------------------------------------------
#if USING_INTERFACE == SPI
#define _drawLineSymbol nop();\
SSPBUF = fontTable(INDF);\
++FSR;
#elif USING_INTERFACE == UART
#define _drawLineSymbol TXREG = fontTable(INDF);\
++FSR;
#else
#error
#endif
//====================================================================================
// use all Bank 1 for 96 bytes buffer
bank1 char videoRAM[SYMBOLS_PER_STRING*STRINGS];
// select default Bank 0 for all next variables
#pragma rambank 0
static char strCount;
static char lineCount;
//====================================================================================
char fontTable(char W);
// It is necessary to make a call to the 2 part of fontTable, so that the compiler includes it in the code
char fontTable2(void); // This function will never be executed
//====================================================================================
#pragma library 1 // CC5X will automatically remove unused libraries functions
#pragma origin 4 // start address of interrupt routine (14 bit core)
#pragma interruptSaveCheck w // if no int_save_registers - warning only
//====================================================================================
interrupt serverX(void)
{
//#pragma updateBank 0 // disable auto updateBank
//int_save_registers // W, STATUS (and PCLATH if required)
//char tempFSR = FSR; // save FSR when using tables/pointers
// An error is generated if FSR need to be saved and the compiler does not detect that this is actually done
#if DRAW_INTERRUPT
if (T0IF){
static char highTable;
H_SYNC = 1; // end Horizontal Sync pulse - Back porch start
TMR0 = 108; // 108 for every 31,8us
T0IF = 0;
if (strCount){
PCLATH = highTable; // update PCLATH before Table Call
// Back porch end - start draw line at 1,8us after H_SYNC = 1
_drawLineSymbol // Line Symbol 1
_drawLineSymbol // Line Symbol 2
_drawLineSymbol // Line Symbol 3
_drawLineSymbol // Line Symbol 4
_drawLineSymbol // Line Symbol 5
_drawLineSymbol // Line Symbol 6
_drawLineSymbol // Line Symbol 7
_drawLineSymbol // Line Symbol 8
_drawLineSymbol // Line Symbol 9
_drawLineSymbol // Line Symbol 10
_drawLineSymbol // Line Symbol 11
#if USING_INTERFACE == SPI
SSPBUF = fontTable(INDF); // Line Symbol 12
#elif USING_INTERFACE == UART
TXREG = fontTable(INDF); // Line Symbol 12
#endif
// after ever visible line
FSR -= SYMBOLS_PER_STRING-1; // restore pointer to the first symbol of current string
PCLATH = 0; // restore PCLATH after all Table Calls
if (--lineCount == 0){ // every 5 visible lines
lineCount = LINES_PER_SYMBOL; // restore visible lines counter
if (++highTable == (FONT_TABLE_ADDR+FONT_TABLE_SIZE)/256){ // if highTable == 16
highTable = FONT_TABLE_ADDR >> 8; // restore high byte of fontTable pointer
FSR += SYMBOLS_PER_STRING; // update pointer to the first symbol of next string
if (--strCount == 0){
lineCount = FRONT_PORCH+V_SYNC_PULSE+BACK_PORCH;
goto Exit_T0IF;
}
}
}
}
//------------------------------------------------------------------------------------
else { // strCount == 0
if (--lineCount == 0){
lineCount = LINES_PER_SYMBOL;
highTable = FONT_TABLE_ADDR >> 8;
strCount = STRINGS;
FSR = videoRAM;
}
else if (lineCount == V_SYNC_PULSE+BACK_PORCH || lineCount == BACK_PORCH){
V_SYNC = !V_SYNC;
}
}
//------------------------------------------------------------------------------------
while (TMR0 < 242); // 242 for every 31,8us
Exit_T0IF:
H_SYNC = 0; // start Horizontal Sync pulse
}
#endif
//FSR = tempFSR; // restore FSR
//int_restore_registers // W, STATUS (and PCLATH if required)
//#pragma updateBank 1 // enable auto updateBank
}
//====================================================================================
void fillStr(char offset, const char *str)
{
char i = 0;
char targetIdx;
char ch;
while (1){
ch = str[i];
if (ch == 0)
break;
targetIdx = offset + i;
videoRAM[targetIdx] = ch;
i++;
}
}
//====================================================================================
void main(void)
{
clearRAM();
fillStr(0, "ABCDEFGHIJKL");
fillStr(12,"MNOPQRSTUVWX");
fillStr(24,"YZ1234567890");
fillStr(36,"abcdefghijkl");
fillStr(48,"mnopqrstuvwx");
fillStr(60,"yz0987654321");
fillStr(72,"ABCDEFGHIJKL");
fillStr(84,"MNOPQRSTUVWX");
// set levels on the output pins before configurate them as outputs
H_SYNC = 1;
H_SYNC_TRIS.H_SYNC_PIN = 0;
V_SYNC = 1;
V_SYNC_TRIS.V_SYNC_PIN = 0;
//PORTC.7 = 0;
//TRISC.7 = 0;
// next operations with Bank 1 -----------------------------------------------------
// bits 76543.210
OPTION_REG = 0b.00001.111;
// ||||| +++- PS2:PS0: Prescaler Rate Select bits
// ||||| Value TMR0_Rate WDT_Rate
// ||||| 000 1 : 2 1 : 1
// ||||| 001 1 : 4 1 : 2
// ||||| 010 1 : 8 1 : 4
// ||||| 011 1 : 16 1 : 8
// ||||| 100 1 : 32 1 : 16
// ||||| 101 1 : 64 1 : 32
// ||||| 110 1 : 128 1 : 64
// ||||| 111 1 : 256 1 : 128
// ||||+----- PSA: Prescaler Assignment bit
// |||| 1 = Prescaler is assigned to the WDT
// |||| 0 = Prescaler is assigned to the Timer0 module
// |||+------ T0SE: TMR0 Source Edge Select bit
// ||| 1 = Increment on high-to-low transition on RA4/T0CKI pin
// ||| 0 = Increment on low-to-high transition on RA4/T0CKI pin
// ||+------- T0CS: TMR0 Clock Source Select bit
// || 1 = Transition on RA4/T0CKI pin
// || 0 = Internal instruction cycle clock (CLKOUT)
// |+-------- INTEDG: Interrupt Edge Select bit
// | 1 = Interrupt on rising edge of RB0/INT pin
// | 0 = Interrupt on falling edge of RB0/INT pin
// +--------- RBPU: PORTB Pull-up Enable bit
// 1 = PORTB pull-ups are disabled
// 0 = PORTB pull-ups are enabled by individual port latch values
#ifdef _16F74
// bits 7654.3.210
TRISE = 0b.0001.0.111; // set RD, WR and CS pins as digital inputs for use Parallel Slave Port
// |||| | +++- PORTE Data Direction bits: 1 = Input, 0 = Output
// |||| | ||+- Bit0: Direction Control bit for pin RE0/RD/AN5
// |||| | |+-- Bit1: Direction Control bit for pin RE1/WR/AN6
// |||| | +--- Bit2: Direction Control bit for pin RE2/CS/AN7
// |||| +----- Unimplemented: Read as '0'
// |||+------- PSPMODE: Parallel Slave Port Mode Select bit
// ||| 1 = Parallel Slave Port mode
// ||| 0 = General Purpose I/O mode
// ||+-------- IBOV: Input Buffer Overflow Detect bit (in Microprocessor mode)
// || 1 = A write occurred when a previously input word has not been read (must be cleared in software)
// || 0 = No overflow occurred
// |+--------- OBF: Output Buffer Full Status bit
// | 1 = The output buffer still holds a previously written word
// | 0 = The output buffer has been read
// +---------- IBF: Input Buffer Full Status bit
// 1 = A word has been received and is waiting to be read by the CPU
// 0 = No word has been received
// bits 76543210
PIE1 = 0b00000000;
// |||||||+- TMR2IE
// ||||||+-- TMR2IE
// |||||+--- CCP1IE
// ||||+---- SSPIE
// |||+----- TXIE
// ||+------ RCIE
// |+------- ADIE
// +-------- PSPIE
#endif
#if USING_INTERFACE == SPI
TRISC.5 = 0; // set SDO as output
SSPEN = 1; // enable SSP, SSCON default - 5 MHz(200ns)
#elif USING_INTERFACE == UART
SPBRG = 0; // Synchronous Baud Rate = FOSC/(4(X+1)) = 20/(4*(0+1)) = 20/4 = 5 MHz(200ns)
// bits 7654.3.210
TXSTA = 0b.1011.0.000;
// |||| | ||+- TX9D: 9th bit of Transmit Data. Can be parity bit
// |||| | |+-- TRMT: Transmit Shift Register Status bit: 1 = TSR empty, 0 = TSR full
// |||| | +--- BRGH: High Baud Rate Select bit Asynchronous mode: 1 = High speed, 0 = Low speed. Synchronous mode: Unused in this mode
// |||| +----- Unimplemented: Read as '0'
// |||+------- SYNC: USART Mode Select bit: 1 = Synchronous mode, 0 = Asynchronous mode
// ||+-------- TXEN: Transmit Enable bit
// |+--------- TX9: 9-bit Transmit Enable bit
// +---------- CSRC: Clock Source Select bit: Asynchronous mode: Don’t care, Synchronous mode: 1 = Master, 0 = Slave
// next operations with Bank 0 -----------------------------------------------------
// bits 7654.3.210
RCSTA = 0b.1000.0.000;
// |||| | ||+- RX9D: 9th bit of Received Data. Can be parity bit (parity to be calculated by firmware)
// |||| | |+-- OERR: Overrun Error bit: 1 = Overrun error (can be cleared by clearing bit CREN), 0 = No overrun error
// |||| | +--- FERR: Framing Error bit: 1 = Framing error (can be updated by reading RCREG register and receive next valid byte), 0 = No framing error
// |||| +----- Unimplemented: Read as '0'
// |||+------- CREN: Continuous Receive Enable bit
// ||| Asynchronous mode: 1 = Enables continuous receive, 0 = Disables continuous receive
// ||| Synchronous mode: 1 = Enables continuous receive until enable bit CREN is cleared (CREN overrides SREN), 0 = Disables continuous receive
// ||+-------- SREN: Single Receive Enable bit:
// || Asynchronous mode: Don’t care
// || Synchronous mode - Master: 1 = Enables single receive, 0 = Disables single receive. This bit is cleared after reception is complete.
// || Synchronous mode - Slave: Don’t care
// |+--------- RX9: 9-bit Receive Enable bit
// +---------- SPEN: Serial Port Enable bit
#endif
#if DRAW_INTERRUPT
// bits 76543.210
INTCON = 0b.10100.000;
// ||||| ||+- RBIF
// ||||| |+-- INTF
// ||||| +--- T0IF
// ||||+----- RBIE
// |||+------ INTE
// ||+------- T0IE
// |+-------- PEIE
// +--------- GIE
#endif
strCount = 0;
lineCount = V_SYNC_PULSE+BACK_PORCH+1;
// if no loop, main is terminated by a SLEEP instruction
while (1){
#if !DRAW_INTERRUPT
if (T0IF){
static char highTable;
H_SYNC = 1; // end Horizontal Sync pulse - Back porch start
nop();
TMR0 = 108; // 108 for every 31,8us
T0IF = 0;
if (strCount){
PCLATH = highTable; // update PCLATH before Table Call
// Back porch end - start draw line at 1,8us after H_SYNC = 1
_drawLineSymbol // Line Symbol 1
_drawLineSymbol // Line Symbol 2
_drawLineSymbol // Line Symbol 3
_drawLineSymbol // Line Symbol 4
_drawLineSymbol // Line Symbol 5
_drawLineSymbol // Line Symbol 6
_drawLineSymbol // Line Symbol 7
_drawLineSymbol // Line Symbol 8
_drawLineSymbol // Line Symbol 9
_drawLineSymbol // Line Symbol 10
_drawLineSymbol // Line Symbol 11
#if USING_INTERFACE == SPI
SSPBUF = fontTable(INDF); // Line Symbol 12
#elif USING_INTERFACE == UART
TXREG = fontTable(INDF); // Line Symbol 12
#endif
// after ever visible line
FSR -= SYMBOLS_PER_STRING-1; // restore pointer to the first symbol of current string
PCLATH = 0; // restore PCLATH after all Table Calls
if (--lineCount == 0){ // every 5 visible lines
lineCount = LINES_PER_SYMBOL; // restore visible lines counter
if (++highTable == (FONT_TABLE_ADDR+FONT_TABLE_SIZE)/256){ // if highTable == 16
highTable = FONT_TABLE_ADDR >> 8; // restore high byte of fontTable pointer
FSR += SYMBOLS_PER_STRING; // update pointer to the first symbol of next string
if (--strCount == 0){
lineCount = FRONT_PORCH+V_SYNC_PULSE+BACK_PORCH;
goto Exit_T0IF;
}
}
}
}
//------------------------------------------------------------------------------------
else { // strCount == 0
if (--lineCount == 0){
lineCount = LINES_PER_SYMBOL;
highTable = FONT_TABLE_ADDR >> 8;
strCount = STRINGS;
FSR = videoRAM;
}
else if (lineCount == V_SYNC_PULSE+BACK_PORCH || lineCount == BACK_PORCH){
V_SYNC = !V_SYNC;
}
}
//------------------------------------------------------------------------------------
while (TMR0 < 242); // 242 for every 31,8us
Exit_T0IF:
H_SYNC = 0; // start Horizontal Sync pulse
}
#endif
}
// It is necessary to make a call to the 2 part of fontTable, so that the compiler includes it in the code
fontTable2(); // This function will never be executed
}
//====================================================================================
#if USING_INTERFACE == SPI
#include "fonts/font_8_12_full_ASCII_3072_bytes_return_tables_SPI.h"
#elif USING_INTERFACE == UART
#include "fonts/font_8_12_full_ASCII_3072_bytes_return_tables.h"
#endif
Code: Select all
// font_8_12_full_ASCII_3072_bytes_pragma_return_tables_for_SPI.h
//====================================================================================
// characters 8*12, full ASCII Table, size 3072 bytes (SPI version)
//====================================================================================
#pragma wideConstData 8192 // Set a new address for accessing data in 7-bit format (reading tables from large arrays across the entire Flash memory area).
#pragma origin FONT_TABLE_ADDR
// Шрифт 8*12 представлен по 1 линии в 12 массивах. То есть в каждом из 12 массивов находятся строки шрифта с 1 по 12.
// И так для каждого из 255 реализованых символов ASCII-таблицы. Это необходимо для максимально быстрой выборки строк символов.
// Можно для выбора следующей отображаемой строки просто инкрементировать PCLATH
//====================================================================================
char fontTable(char W)
{
PCL += W; // fontTable_1 - First line
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
PCL += W; // fontTable_2
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xE0,0x0E,0x3C,0x66,0xB7,0x60,0x00,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x38,0x22,0x44,0xC6,0x00,0x6C,0x30,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x04,\
0x7C,0x18,0x7C,0x7C,0x0E,0xFE,0x7C,0xFE,0x7C,0x7C,0x00,0x00,0x06,0x00,0x60,0xC6,\
0x7C,0x38,0xFC,0x7C,0xFC,0xFE,0xFE,0x7C,0xC6,0x3C,0x0E,0xC6,0xC0,0xC6,0xC6,0x7C,\
0xFC,0x7C,0xFC,0x7C,0xFC,0xC6,0xC6,0xC6,0xC6,0xCC,0xFE,0x3C,0x20,0x3C,0xC6,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0xC0,0x70,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x18,0xDC,0x00,\
0x00,0x00,0xFF,0x00,0x00,0x0F,0xF1,0xFF,0x8F,0x80,0x7C,0xE0,0x0F,0x00,0x3C,0x00,\
0x3F,0x00,0x78,0x00,0x01,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x24,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x42,0x00,0x00,0x55,0xFF,0x42,0xFF,\
0x00,0x00,0x10,0x10,0x00,0x10,0x10,0x10,0x28,0x00,0x10,0x00,0x10,0x00,0xF0,0x0F,\
0x36,0x62,0x66,0x62,0x36,0x66,0xD6,0xC6,0xC6,0xC6,0x66,0x36,0xEE,0xC6,0xC6,0xC6,\
0x66,0x66,0x5A,0xC6,0x7E,0xC6,0xCC,0xC6,0xB7,0xB7,0xB0,0xC3,0x60,0xC6,0xB7,0x66,\
0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
PCL += W; // fontTable_3
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xF0,0x1E,0x7E,0x66,0xB7,0x38,0x00,0x7E,0x7E,0x18,0x00,0x00,0x00,0x00,0x10,0xFE,\
0x00,0x38,0x44,0xFE,0xC2,0xC2,0x6C,0x60,0x30,0x0C,0x00,0x10,0x00,0x00,0x00,0x0C,\
0xFE,0x38,0xFE,0xFE,0x1E,0xFE,0xFE,0xFE,0xFE,0xFE,0x10,0x10,0x0C,0x00,0x30,0xC6,\
0xC6,0x38,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xC6,0x3C,0x0E,0xC6,0xC0,0xC6,0xC6,0xFE,\
0xFE,0xFE,0xFE,0xFE,0xFC,0xC6,0xC6,0xC6,0xC6,0xCC,0xFE,0x20,0x30,0x04,0x00,0x00,\
0x00,0x00,0xC0,0x00,0x0C,0x00,0x38,0x00,0xC0,0x30,0x0C,0xC0,0x70,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x18,0x00,0x10,\
0x00,0x03,0xFF,0xC0,0xC0,0x0F,0xF0,0xFF,0x87,0x80,0x7C,0xF0,0x07,0x80,0x3C,0x00,\
0x3F,0x80,0x7C,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x24,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x81,0x00,0x00,0xAA,0xFF,0x81,0xFF,\
0x00,0x00,0x10,0x10,0x00,0x10,0x10,0x10,0x00,0x00,0x10,0x00,0x10,0x00,0xF0,0x0F,\
0x66,0x62,0x66,0x62,0x66,0x62,0x54,0x06,0xCE,0xCE,0x6C,0x66,0xFE,0xC6,0xC6,0xC6,\
0x66,0xC2,0x18,0xC6,0xB7,0x6C,0xCC,0xC6,0xB7,0xB7,0x30,0xC3,0x60,0x06,0xB7,0x66,\
0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
PCL += W; // fontTable_4
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xF8,0x3E,0x18,0x66,0xB7,0x6C,0x00,0x18,0x18,0x18,0x18,0x30,0x00,0x28,0x38,0xFE,\
0x00,0x38,0x00,0xFE,0xC0,0xC6,0x38,0x00,0x30,0x0C,0x66,0x10,0x00,0x00,0x00,0x08,\
0xC6,0x78,0xC6,0xC6,0x36,0xC0,0xC6,0x0C,0xC6,0xC6,0x10,0x10,0x18,0x7E,0x18,0x0C,\
0xC6,0x6C,0xC6,0xC6,0x66,0xC0,0xC0,0xC6,0xC6,0x18,0x06,0xCC,0xC0,0xEE,0xE6,0xC6,\
0xC6,0xC6,0xC6,0xC6,0x30,0xC6,0xC6,0xC6,0x6C,0xCC,0x06,0x20,0x10,0x04,0x00,0x00,\
0x00,0x78,0xC0,0x78,0x0C,0x78,0x7C,0x00,0xC0,0x30,0x0C,0xCC,0x30,0x00,0x00,0x00,\
0x00,0x00,0x00,0x78,0x60,0x00,0x00,0x00,0xCC,0x00,0xFC,0x18,0x10,0x18,0x00,0x38,\
0x00,0x07,0xFF,0xE1,0x20,0x1F,0xE0,0xFF,0x87,0x80,0x7C,0xF0,0x07,0x80,0x3C,0x00,\
0x3F,0x80,0xFC,0x00,0x00,0x7F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x24,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x99,0x00,0x00,0xAA,0xFF,0xB9,0xFF,\
0x00,0x00,0x10,0x10,0x00,0x10,0x10,0x10,0x7C,0x00,0x10,0x00,0x10,0x00,0xF0,0x0F,\
0xC6,0x60,0x66,0x60,0x66,0x68,0x54,0x06,0xCE,0xCE,0x6C,0xC6,0xFE,0xC6,0xC6,0xC6,\
0x66,0xC0,0x18,0xC6,0xB7,0x7C,0xCC,0xC6,0xB7,0xB7,0x30,0xC3,0x60,0x26,0xB7,0x66,\
0x78,0x60,0xFC,0x7E,0x1E,0x7C,0xD6,0x3C,0xC6,0xC6,0xE6,0x1E,0xC6,0xC6,0x7C,0xFE,\
0xDC,0x7C,0x7E,0xC6,0x18,0xC6,0xCC,0xC6,0xD6,0xD6,0xF8,0xC6,0xF0,0x3C,0xCE
}
// fontTable must be split into two parts, as it exceeds 2048 bytes
// Add the page1 qualifier to the fontTable2 definition
char page1 fontTable2(void)
{
PCL += W; // fontTable_5
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xFC,0x7E,0x18,0x66,0x7B,0xC6,0x00,0x18,0x18,0x18,0x0C,0x60,0xC0,0x6C,0x38,0x7C,\
0x00,0x10,0x00,0x44,0x7C,0x0C,0x76,0x00,0x30,0x0C,0x3C,0x10,0x00,0x00,0x00,0x18,\
0xCE,0x18,0x06,0x06,0x66,0xC0,0xC0,0x0C,0xC6,0xC6,0x00,0x00,0x30,0x7E,0x0C,0x18,\
0xDE,0x6C,0xC6,0xC0,0x66,0xC0,0xC0,0xC0,0xC6,0x18,0x06,0xD8,0xC0,0xEE,0xF6,0xC6,\
0xC6,0xC6,0xC6,0xC0,0x30,0xC6,0xC6,0xC6,0x6C,0xCC,0x0C,0x20,0x18,0x04,0x00,0x00,\
0x00,0x7C,0xC0,0xFC,0x0C,0xFC,0x6C,0x7C,0xC0,0x00,0x00,0xD8,0x30,0xEC,0xF8,0x78,\
0xF8,0x7C,0xF8,0xFC,0xF0,0xCC,0xCC,0xC6,0xCC,0xCC,0xFC,0x70,0x00,0x0E,0x00,0x6C,\
0x00,0x0F,0xFF,0xF1,0xA0,0x1F,0xE0,0xFF,0x07,0xC0,0x78,0xF0,0x07,0x80,0x1E,0x00,\
0x7F,0x80,0xFC,0x00,0x00,0x3F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x3C,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xBD,0x00,0x33,0xAA,0xFF,0xBD,0xFF,\
0x00,0x00,0x10,0x10,0x00,0x10,0x10,0x10,0xC6,0x00,0x10,0xCC,0x10,0x00,0xF0,0x0F,\
0xC6,0x7C,0x7C,0x60,0x66,0x78,0x7C,0x3C,0xD6,0xD6,0x78,0xC6,0xD6,0xFE,0xC6,0xC6,\
0x7C,0xC0,0x18,0xC6,0xB7,0x38,0xCC,0xC6,0xB7,0xB7,0x3C,0xF3,0x7C,0x3E,0xFB,0x3E,\
0x0C,0x7C,0x66,0x32,0x36,0xC6,0xD6,0x66,0xC6,0xC6,0x6C,0x36,0xEE,0xC6,0xC6,0xC6,\
0x66,0xC6,0x5A,0xC6,0x7E,0x6C,0xCC,0xC6,0xD6,0xD6,0xB0,0xC6,0x60,0x66,0xB7
PCL += W; // fontTable_6
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xF8,0x3E,0x18,0x66,0x1B,0xC6,0x00,0x18,0x18,0x18,0xFE,0xFE,0xC0,0xFE,0x7C,0x7C,\
0x00,0x10,0x00,0x44,0x06,0x18,0xDC,0x00,0x30,0x0C,0xFF,0x7C,0x00,0x7C,0x00,0x10,\
0xD6,0x18,0x0C,0x1C,0xC6,0xFC,0xFC,0x18,0x7C,0xFE,0x00,0x00,0x60,0x00,0x06,0x18,\
0xDE,0xC6,0xFC,0xC0,0x66,0xFC,0xFC,0xC0,0xFE,0x18,0x06,0xF0,0xC0,0xFE,0xF6,0xC6,\
0xFE,0xC6,0xFE,0x78,0x30,0xC6,0x6C,0xC6,0x38,0xFC,0x18,0x20,0x08,0x04,0x00,0x00,\
0x00,0x0C,0xC0,0xCC,0x0C,0xCC,0x60,0xFC,0xF8,0x30,0x0C,0xF0,0x30,0xFE,0xFC,0xFC,\
0xFC,0xFC,0xFC,0xCC,0xF0,0xCC,0xCC,0xC6,0x78,0xCC,0x18,0x18,0x00,0x18,0x00,0xC6,\
0x00,0x1F,0xFF,0xF9,0xE0,0x1F,0xE0,0x7F,0x03,0xC0,0x78,0x78,0x03,0xC0,0x1E,0x00,\
0x7F,0xC0,0xFE,0x00,0x00,0x1F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xA1,0x00,0x66,0xAA,0xFF,0xA5,0xFF,\
0x1F,0xF0,0x1F,0xF0,0xFF,0x10,0x1F,0xF0,0xFE,0xFF,0xFF,0x66,0xFF,0x00,0xF0,0x0F,\
0xFE,0x66,0x66,0x60,0x66,0x68,0x7C,0x06,0xE6,0xE6,0x78,0xC6,0xC6,0xC6,0xC6,0xC6,\
0x60,0xC0,0x18,0x7E,0xB7,0x38,0xCC,0x7E,0xB7,0xB7,0x36,0xB7,0x66,0x26,0xB7,0x3E,\
0x7C,0x66,0x66,0x32,0x36,0xFE,0x54,0x06,0xCE,0xCE,0x78,0x66,0xFE,0xC6,0xC6,0xC6,\
0x66,0xC0,0x18,0xC6,0xB7,0x38,0xCC,0xC6,0xD6,0xD6,0x30,0xC6,0x60,0x06,0xB7
PCL += W; // fontTable_7
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xF0,0x1E,0x7E,0x66,0x1B,0x6C,0xFE,0x7E,0x18,0x18,0x0C,0x60,0xC0,0x6C,0x7C,0x38,\
0x00,0x10,0x00,0xFE,0x06,0x30,0xCC,0x00,0x30,0x0C,0x3C,0x7C,0x00,0x7C,0x00,0x30,\
0xD6,0x18,0x18,0x1C,0xFE,0xFE,0xFE,0x18,0x7C,0x7E,0x00,0x00,0x30,0x00,0x0C,0x18,\
0xDE,0xC6,0xFC,0xC0,0x66,0xFC,0xFC,0xCE,0xFE,0x18,0x06,0xF0,0xC0,0xD6,0xDE,0xC6,\
0xFC,0xC6,0xFC,0x3C,0x30,0xC6,0x6C,0xC6,0x38,0x78,0x30,0x20,0x0C,0x04,0x00,0x00,\
0x00,0x7C,0xF8,0xC0,0x7C,0xF8,0xF0,0xCC,0xFC,0x30,0x0C,0xE0,0x30,0xD6,0xCC,0xCC,\
0xCC,0xCC,0xCC,0x60,0x60,0xCC,0xCC,0xC6,0x30,0xCC,0x30,0x18,0x10,0x18,0x00,0xC6,\
0x00,0x3F,0xFF,0xF9,0xA0,0x3F,0xC0,0x7F,0x03,0xC0,0x78,0x78,0x03,0xC0,0x1E,0x00,\
0x7F,0xC1,0xFE,0x00,0x00,0x0F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xA1,0x00,0xCC,0xAA,0xFF,0xB9,0x00,\
0x1F,0xF0,0x1F,0xF0,0xFF,0x10,0x1F,0xF0,0xC0,0xFF,0xFF,0x33,0xFF,0xFF,0xF0,0x0F,\
0xC6,0x66,0x66,0x60,0x66,0x60,0x54,0x06,0xE6,0xE6,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,\
0x60,0xC0,0x18,0x06,0xB7,0x7C,0xCC,0x06,0xB7,0xB7,0x36,0xB7,0x66,0x06,0xB7,0x66,\
0xCC,0x66,0x7C,0x30,0x66,0xC0,0x7C,0x0C,0xD6,0xD6,0x78,0x66,0xFE,0xFE,0xC6,0xC6,\
0x66,0xC0,0x18,0xC6,0xB7,0x38,0xCC,0xC6,0xD6,0xD6,0x3E,0xF6,0x7C,0x1E,0xFB
PCL += W; // fontTable_8
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xE0,0x0E,0x3C,0x00,0x1B,0x38,0xFE,0x3C,0x18,0x7E,0x18,0x30,0xFE,0x28,0xFE,0x38,\
0x00,0x00,0x00,0xFE,0x86,0x60,0xCC,0x00,0x30,0x0C,0x66,0x10,0x18,0x00,0x18,0x20,\
0xE6,0x18,0x30,0x06,0xFE,0x06,0xC6,0x30,0xC6,0x06,0x10,0x10,0x18,0x7E,0x18,0x00,\
0xDC,0xFE,0xC6,0xC0,0x66,0xC0,0xC0,0xCE,0xC6,0x18,0xC6,0xD8,0xC0,0xD6,0xDE,0xC6,\
0xC0,0xC6,0xD8,0x06,0x30,0xC6,0x6C,0xD6,0x6C,0x30,0x60,0x20,0x04,0x04,0x00,0x00,\
0x00,0xFC,0xFC,0xC0,0xFC,0xC0,0xF0,0x7C,0xCC,0x30,0x0C,0xE0,0x30,0xD6,0xCC,0xCC,\
0xCC,0xCC,0xC0,0x18,0x60,0xCC,0xCC,0xC6,0x30,0xFC,0x30,0x18,0x10,0x18,0x00,0xC6,\
0x00,0x7F,0xFF,0xF9,0xE0,0x3F,0xC0,0x7E,0x03,0xE0,0x70,0x78,0x03,0xC0,0x1F,0x00,\
0xFF,0xC1,0xFE,0x00,0x00,0x07,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0xBD,0x00,0x66,0xAA,0xFF,0xBD,0x00,\
0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0xC0,0x10,0x00,0x66,0x10,0xFF,0xF0,0x0F,\
0xC6,0x66,0x66,0x60,0x66,0x62,0xD6,0x06,0xC6,0xC6,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,\
0x60,0xC2,0x18,0x06,0x7E,0x6C,0xCC,0x06,0xB7,0xB7,0x36,0xB7,0x66,0x06,0xB7,0x66,\
0xCC,0x66,0x66,0x30,0x66,0xC0,0x54,0x06,0xE6,0xE6,0x6C,0x66,0xD6,0xC6,0xC6,0xC6,\
0x66,0xC0,0x18,0xC6,0xB7,0x38,0xCC,0x7E,0xD6,0xD6,0x33,0xDE,0x66,0x06,0xB7
PCL += W; // fontTable_9
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xC0,0x06,0x18,0x66,0x1B,0x0C,0xFE,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,0xFE,0x10,\
0x00,0x10,0x00,0x44,0xC6,0xC6,0xCC,0x00,0x18,0x18,0x00,0x10,0x18,0x00,0x18,0x60,\
0xC6,0x18,0x60,0xC6,0x06,0xC6,0xC6,0x30,0xC6,0xC6,0x10,0x10,0x0C,0x7E,0x30,0x18,\
0xC0,0xFE,0xC6,0xC6,0x66,0xC0,0xC0,0xC6,0xC6,0x18,0xC6,0xCC,0xC6,0xC6,0xCE,0xC6,\
0xC0,0xC6,0xCC,0xC6,0x30,0xC6,0x38,0xFE,0x6C,0x30,0xC0,0x3C,0x06,0x3C,0x00,0x00,\
0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x60,0x0C,0xCC,0x30,0x0C,0xF0,0x30,0xD6,0xCC,0xCC,\
0xFC,0xFC,0xC0,0xCC,0x6C,0xCC,0xCC,0xD6,0x78,0x7C,0x60,0x18,0x10,0x18,0x00,0xFE,\
0x00,0xFF,0xFF,0xFD,0x20,0x3F,0xC0,0x3E,0x01,0xE0,0x70,0x3C,0x01,0xE0,0x0F,0x00,\
0xFF,0xE1,0xFF,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x99,0x00,0x33,0xAA,0xFF,0xA5,0x00,\
0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0xC6,0x10,0x00,0xCC,0x10,0xFF,0xF0,0x0F,\
0xC6,0x66,0x66,0x60,0x66,0x66,0xD6,0xC6,0xC6,0xC6,0x66,0xC6,0xC6,0xC6,0xC6,0xC6,\
0x60,0x66,0x18,0xC6,0x18,0xC6,0xCC,0x06,0xB7,0xB7,0x36,0xB7,0x66,0xC6,0xB7,0x66,\
0xCC,0x66,0x66,0x30,0x66,0xC6,0xD6,0x66,0xC6,0xC6,0x66,0x66,0xD6,0xC6,0xC6,0xC6,\
0x66,0xC6,0x18,0x7E,0xB7,0x6C,0xCC,0x06,0xD6,0xD6,0x33,0xDE,0x66,0x66,0xB7
PCL += W; // fontTable_10
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x80,0x02,0x00,0x66,0x1B,0xC6,0xFE,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x10,0x00,0x44,0x7C,0x86,0x76,0x00,0x0C,0x30,0x00,0x10,0x18,0x00,0x18,0x40,\
0xFE,0x3C,0xFE,0xFE,0x06,0xFE,0xFE,0x60,0xFE,0xFE,0x00,0x20,0x06,0x00,0x60,0x18,\
0x7C,0xC6,0xFE,0xFE,0xFE,0xFE,0xC0,0xFE,0xC6,0x3C,0xFE,0xC6,0xFE,0xC6,0xC6,0xFE,\
0xC0,0xFE,0xC6,0xFE,0x30,0xFE,0x38,0xEE,0xC6,0x30,0xFE,0x3C,0x02,0x3C,0x00,0x00,\
0x00,0xFC,0xFC,0xFC,0xFC,0xFC,0x60,0xCC,0xCC,0x30,0xCC,0xD8,0x78,0xD6,0xCC,0xFC,\
0xF8,0x7C,0xC0,0xFC,0x7C,0xFC,0x78,0xFE,0xCC,0x0C,0xFC,0x0E,0x10,0x70,0x00,0x00,\
0x00,0xFF,0xFF,0xFC,0xC0,0x3F,0x80,0x3E,0x01,0xE0,0x70,0x3C,0x01,0xE0,0x0F,0x00,\
0xFF,0xE3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0xAA,0xFF,0x81,0x00,\
0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0x7C,0x10,0x00,0x00,0x10,0xFF,0xF0,0x0F,\
0xC6,0xFC,0xFC,0xF0,0xFF,0xFE,0xD6,0x7C,0xC6,0xC6,0xE6,0xC6,0xC6,0xC6,0x7C,0xC6,\
0xF0,0x3C,0x3C,0x7C,0x3C,0xC6,0xFE,0x06,0xFF,0xFF,0x7C,0xF3,0xFC,0x7C,0xCE,0xE7,\
0x76,0x3C,0xFC,0x78,0xFF,0x7C,0xD6,0x3C,0xC6,0xC6,0xE6,0x66,0xC6,0xC6,0x7C,0xC6,\
0x7C,0x7C,0x3C,0x06,0x7E,0xC6,0xFE,0x06,0xFE,0xFE,0x7E,0xF6,0xFC,0x3C,0xCE
PCL += W; // fontTable_11
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,\
0x7C,0x3C,0xFE,0x7C,0x06,0x7C,0x7C,0x60,0x7C,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0xC6,0xFC,0x7C,0xFC,0xFE,0xC0,0x7C,0xC6,0x3C,0x7C,0xC6,0xFE,0xC6,0xC6,0x7C,\
0xC0,0x7C,0xC6,0x7C,0x30,0x7C,0x10,0x44,0xC6,0x30,0xFE,0x00,0x00,0x00,0x00,0x00,\
0x00,0x7A,0xF8,0x78,0x7C,0x78,0x60,0xFC,0xCC,0x30,0xFC,0xCC,0x78,0xC6,0xCC,0x78,\
0xC0,0x0C,0xC0,0x78,0x38,0x78,0x30,0x6C,0xCC,0xCC,0xFC,0x00,0x00,0x00,0x00,0x00,\
0x01,0xFF,0xFF,0xFC,0x00,0x3F,0x80,0x3C,0x01,0xF0,0x60,0x3C,0x01,0xE0,0x0F,0x01,\
0xFF,0xE3,0xFF,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x55,0xFF,0x42,0x00,\
0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0x00,0x10,0x00,0x00,0x10,0xFF,0xF0,0x0F,\
0x00,0x00,0x00,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x60,0x00,0x00,0xC6,0x18,0x00,0x06,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00
PCL += W; // fontTable_12 - Last line
#pragma return[] =\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,\
0xC0,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,\
0x01,0xFF,0xFF,0xFE,0x00,0x7F,0x80,0x1C,0x00,0xF0,0x60,0x1E,0x00,0xF0,0x07,0x01,\
0xFF,0xF3,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0xAA,0xFF,0x66,0x00,\
0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0x00,0x10,0x00,0x00,0x10,0xFF,0xF0,0x0F,\
0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0xF0,0x00,0x00,0x7C,0x3C,0x00,0x06,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00
}
//====================================================================================
// SPI передает старшим битом вперед, и линия данных повторяет последний бит еще 1 такт,
// поэтому прижимаем символы к левому краю, чтобы в самом правом (младшем) бите всегда получался 0
// 8*12 Symbols Example
//************************************************************************************
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . # # # . 0xCE
// 6| # # . # . # # . 0xD6
// 7| # # . # . # # . 0xD6
// 8| # # # . . # # . 0xE6
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . # # . . . 0x18
// 3| . . # # # . . . 0x38
// 4| . # # # # . . . 0x78
// 5| . . . # # . . . 0x18
// 6| . . . # # . . . 0x18
// 7| . . . # # . . . 0x18
// 8| . . . # # . . . 0x18
// 9| . . . # # . . . 0x18
//10| . . # # # # . . 0x3C
//11| . . # # # # . . 0x3C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| . . . . . # # . 0x06
// 6| . . . . # # . . 0x0C
// 7| . . . # # . . . 0x18
// 8| . . # # . . . . 0x30
// 9| . # # . . . . . 0x60
//10| # # # # # # # . 0xFE
//11| # # # # # # # . 0xFE
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| . . . . . # # . 0x06
// 6| . . .# # # . . 0x1C
// 7| . . .# # # . . 0x1C
// 8| . . . . . # # . 0x06
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . # # # . 0x0E
// 3| . . . # # # # . 0x1E
// 4| . . # # . # # . 0x36
// 5| . # # . . # # . 0x66
// 6| # # . . . # # . 0xC6
// 7| # # # # # # # . 0xFE
// 8| # # # # # # # . 0xFE
// 9| . . . . . # # . 0x06
//10| . . . . . # # . 0x06
//11| . . . . . # # . 0x06
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # # . 0xFE
// 3| # # # # # # # . 0xFE
// 4| # # . . . . . . 0xC0
// 5| # # . . . . . . 0xC0
// 6| # # # # # # . . 0xFC
// 7| # # # # # # # . 0xFE
// 8| . . . . . # # . 0x06
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . . . . 0xC0
// 6| # # # # # # . . 0xFC
// 7| # # # # # # # . 0xFE
// 8| # # . . . # # . 0xC6
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # # . 0xFE
// 3| # # # # # # # . 0xFE
// 4| . . . . # # . . 0x0C
// 5| . . . . # # . . 0x0C
// 6| . . . # # . . . 0x18
// 7| . . . # # . . . 0x18
// 8| . . # # . . . . 0x30
// 9| . . # # . . . . 0x30
//10| . # # . . . . . 0x60
//11| . # # . . . . . 0x60
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| . # # # # # . . 0x7C
// 7| . # # # # # . . 0x7C
// 8| # # . . . # # . 0xC6
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # # # # # # . 0xFE
// 7| . # # # # # # . 0x7E
// 8| . . . . . # # . 0x06
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
//************************************************************************************
// 1| . . . . . . . . 0x00
// 2| . . # # # . . . 0x10
// 3| . . # # # . . . 0x38
// 4| . # # . # # . . 0x6C
// 5| . # # . # # . . 0xC6
// 6| # # . . . # # . 0xC6
// 7| # # . . . # # . 0xC6
// 8| # # # # # # # . 0xFE
// 9| # # # # # # # . 0xFE
//10| # # . . . # # . 0xC6
//11| # # . . . # # . 0xC6
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # . . 0xFC
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # # # # # . . 0xFC
// 7| # # # # # # . . 0xFC
// 8| # # . . . # # . 0xC6
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| # # # # # # . . 0xFC
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . . . . 0xC0
// 6| # # . . . . . . 0xC0
// 7| # # . . . . . . 0xC0
// 8| # # . . . . . . 0xC0
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # . . 0xFC
// 3| # # # # # # # . 0xFE
// 4| . # # . . # # . 0x66
// 5| . # # . . # # . 0x66
// 6| . # # . . # # . 0x66
// 7| . # # . . # # . 0x66
// 8| . # # . . # # . 0x66
// 9| . # # . . # # . 0x66
//10| # # # # # # # . 0xFE
//11| # # # # # # . . 0xFC
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # # . 0xFE
// 3| # # # # # # # . 0xFE
// 4| # # . . . . . . 0xC0
// 5| # # . . . . . . 0xC0
// 6| # # # # # # . . 0xFC
// 7| # # # # # # . . 0xFC
// 8| # # . . . . . . 0xC0
// 9| # # . . . . . . 0xC0
//10| # # # # # # # . 0xFE
//11| # # # # # # # . 0xFE
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # # . 0xFE
// 3| # # # # # # # . 0xFE
// 4| # # . . . . . . 0xC0
// 5| # # . . . . . . 0xC0
// 6| # # # # # # . . 0xFC
// 7| # # # # # # . . 0xFC
// 8| # # . . . . . . 0xC0
// 9| # # . . . . . . 0xC0
//10| # # . . . . . . 0xC0
//11| # # . . . . . . 0xC0
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . . . . 0xC0
// 6| # # . . . . . . 0xC0
// 7| # # . . # # # . 0xCC
// 8| # # . . # # # . 0xCE
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . # # . 0xC6
// 3| # # . . . # # . 0xC6
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # # # # # # . 0xFE
// 7| # # # # # # # . 0xFE
// 8| # # . . . # # . 0xC6
// 9| # # . . . # # . 0xC6
//10| # # . . . # # . 0xC6
//11| # # . . . # # . 0xC6
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . # # # # . . 0x3C
// 3| . . # # # # . . 0x3C
// 4| . . . # # . . . 0x18
// 5| . . . # # . . . 0x18
// 6| . . . # # . . . 0x18
// 7| . . . # # . . . 0x18
// 8| . . . # # . . . 0x18
// 9| . . . # # . . . 0x18
//10| . . # # # # . . 0x3C
//11| . . # # # # . . 0x3C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . # # # . 0x0E
// 3| . . . . # # # . 0x0E
// 4| . . . . . # # . 0x06
// 5| . . . . . # # . 0x06
// 6| . . . . . # # . 0x06
// 7| . . . . . # # . 0x06
// 8| # # . . . # # . 0xC6
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . # # . 0xC6
// 3| # # . . . # # . 0xC6
// 4| # # . . # # . . 0xCC
// 5| # # . # # . . . 0xD8
// 6| # # # # . . . . 0xF0
// 7| # # # # . . . . 0xF0
// 8| # # . # # . . . 0xD8
// 9| # # . . # # . . 0xCC
//10| # # . . . # # . 0xC6
//11| # # . . . # # . 0xC6
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . . . . 0xC0
// 3| # # . . . . . . 0xC0
// 4| # # . . . . . . 0xC0
// 5| # # . . . . . . 0xC0
// 6| # # . . . . . . 0xC0
// 7| # # . . . . . . 0xC0
// 8| # # . . . . . . 0xC0
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| # # # # # # # . 0xFE
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . # # . 0xC6
// 3| # # . . . # # . 0xC6
// 4| # # # . # # # . 0xEE
// 5| # # # . # # # . 0xEE
// 6| # # # # # # # . 0xFE
// 7| # # . # . # # . 0xD6
// 8| # # . # . # # . 0xD6
// 9| # # . . . # # . 0xC6
//10| # # . . . # # . 0xC6
//11| # # . . . # # . 0xC6
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . # # . 0xC6
// 3| # # . . . # # . 0xC6
// 4| # # # . . # # . 0xE6
// 5| # # # # . # # . 0xF6
// 6| # # # # . # # . 0xF6
// 7| # # . # # # # . 0xDE
// 8| # # . # # # # . 0xDE
// 9| # # . . # # # . 0xCE
//10| # # . . . # # . 0xC6
//11| # # . . . # # . 0xC6
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # . . . # # . 0xC6
// 7| # # . . . # # . 0xC6
// 8| # # . . . # # . 0xC6
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # . . 0xFC
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # # # # # # . 0xFE
// 7| # # # # # # . . 0xFC
// 8| # # . . . . . . 0xC0
// 9| # # . . . . . . 0xC0
//10| # # . . . . . . 0xC0
//11| # # . . . . . . 0xC0
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # . . . # # . 0xC6
// 7| # # . . . # # . 0xC6
// 8| # # . . . # # . 0xC6
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . # # . 0x06
// 1| . . . . . . . . 0x00
// 2| # # # # # # . . 0xFC
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # # # # # # . 0xFE
// 7| # # # # # # . . 0xFC
// 8| # # . # # . . . 0xD8
// 9| # # . . # # . . 0xCC
//10| # # . . . # # . 0xC6
//11| # # . . . # # . 0xC6
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # # # . . 0x7C
// 3| # # # # # # # . 0xFE
// 4| # # . . . # # . 0xC6
// 5| # # . . . . . . 0xC0
// 6| . # # # # . . . 0x78
// 7| . . # # # # . . 0x3C
// 8| . . . . . # # . 0x06
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # . . 0xFC
// 3| # # # # # # . . 0xFC
// 4| . . # # . . . . 0x30
// 5| . . # # . . . . 0x30
// 6| . . # # . . . . 0x30
// 7| . . # # . . . . 0x30
// 8| . . # # . . . . 0x30
// 9| . . # # . . . . 0x30
//10| . . # # . . . . 0x30
//11| . . # # . . . . 0x30
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . # # . 0xC6
// 3| # # . . . # # . 0xC6
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # . . . # # . 0xC6
// 7| # # . . . # # . 0xC6
// 8| # # . . . # # . 0xC6
// 9| # # . . . # # . 0xC6
//10| # # # # # # # . 0xFE
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . # # . 0xC6
// 3| # # . . . # # . 0xC6
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| . # # . # # . . 0x6C
// 7| . # # . # # . . 0x6C
// 8| . # # . # # . . 0x6C
// 9| . . # # # . . . 0x38
//10| . . # # # . . . 0x38
//11| . . . # . . . . 0x10
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . # # . 0xC6
// 3| # # . . . # # . 0xC6
// 4| # # . . . # # . 0xC6
// 5| # # . . . # # . 0xC6
// 6| # # . . . # # . 0xC6
// 7| # # . . . # # . 0xC6
// 8| # # . # . # # . 0xD6
// 9| # # # # # # # . 0xFE
//10| # # # . # # # . 0xEE
//11| . # . . . # . . 0x44
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . . # # . 0xC6
// 3| # # . . . # # . 0xC6
// 4| . # # . # # . . 0x6C
// 5| . # # . # # . . 0x6C
// 6| . . # # # . . . 0x38
// 7| . . # # # . . . 0x38
// 8| . # # . # # . . 0x6C
// 9| . # # . # # . . 0x6C
//10| # # . . . # # . 0xC6
//11| # # . . . # # . 0xC6
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # . . # # . . 0xCC
// 3| # # . . # # . . 0xCC
// 4| # # . . # # . . 0xCC
// 5| # # . . # # . . 0xCC
// 6| # # # # # # . . 0xFC
// 7| . # # # # . . . 0x78
// 8| . . # # . . . . 0x30
// 9| . . # # . . . . 0x30
//10| . . # # . . . . 0x30
//11| . . # # . . . . 0x30
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| # # # # # # # . 0xFE
// 3| # # # # # # # . 0xFE
// 4| . . . . . # # . 0x06
// 5| . . . . # # . . 0x0C
// 6| . . . # # . . . 0x18
// 7| . . # # . . . . 0x30
// 8| . # # . . . . . 0x60
// 9| # # . . . . . . 0xC0
//10| # # # # # # # . 0xFE
//11| # # # # # # # . 0xFE
//12| . . . . . . . . 0x00
//************************************************************************************
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . # # # # . . . 0x78
// 5| . # # # # # . . 0x7C
// 6| . . . . # # . . 0x0C
// 7| . # # # # # . . 0x7C
// 8| # # # # # # . . 0xFC
// 9| # # . . # # . . 0xCC
//10| # # # # # # . . 0xFC
//11| . # # # # . # . 0x7A
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| # # . . . . . . 0xC0
// 4| # # . . . . . . 0xC0
// 5| # # . . . . . . 0xC0
// 6| # # . . . . . . 0xC0
// 7| # # # # # . . . 0xF8
// 8| # # # # # # . . 0xFC
// 9| # # . . # # . . 0xCC
//10| # # # # # # . . 0xFC
//11| # # # # # . . . 0xF8
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . # # # # . . . 0x78
// 5| # # # # # # . . 0xFC
// 6| # # . . # # . . 0xCC
// 7| # # . . . . . . 0xC0
// 8| # # . . . . . . 0xC0
// 9| # # . . # # . . 0xCC
//10| # # # # # # . . 0xFC
//11| . # # # # . . . 0x78
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . # # . . 0x0C
// 4| . . . . # # . . 0x0C
// 5| . . . . # # . . 0x0C
// 6| . . . . # # . . 0x0C
// 7| . # # # # # . . 0x7C
// 8| # # # # # # . . 0xFC
// 9| # # . . # # . . 0xCC
//10| # # # # # # . . 0xFC
//11| . # # # # # . . 0x7C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . # # # # . . . 0x78
// 5| # # # # # # . . 0xFC
// 6| # # . . # # . . 0xCC
// 7| # # # # # . . . 0xF8
// 8| # # . . . . . . 0xC0
// 9| # # . . # # . . 0xCC
//10| # # # # # # . . 0xFC
//11| . # # # # . . . 0x78
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . # # # . . . 0x38
// 4| . # # # # # . . 0x7C
// 5| . # # . # # . . 0x6C
// 6| . # # . . . . . 0x60
// 7| # # # # . . . . 0xF0
// 8| # # # # . . . . 0xF0
// 9| . # # . . . . . 0x60
//10| . # # . . . . . 0x60
//11| . # # . . . . . 0x60
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| . # # # # # . . 0x7C
// 6| # # # # # # . . 0xFC
// 7| # # . . # # . . 0xCC
// 8| . # # # # # . . 0x7C
// 9| . . . . # # . . 0x0C
//10| # # . . # # . . 0xCC
//11| # # # # # # . . 0xFC
//12| . # # # # . . . 0x78
// 1| . . . . . . . . 0x00
// 2| # # . . . . . . 0xC0
// 3| # # . . . . . . 0xC0
// 4| # # . . . . . . 0xC0
// 5| # # . . . . . . 0xC0
// 6| # # # # # . . . 0xF8
// 7| # # # # # # . . 0xFC
// 8| # # . . # # . . 0xCC
// 9| # # . . # # . . 0xCC
//10| # # . . # # . . 0xCC
//11| # # . . # # . . 0xCC
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . # # . . . . 0x30
// 4| . . # # . . . . 0x30
// 5| . . . . . . . . 0x00
// 6| . . # # . . . . 0x30
// 7| . . # # . . . . 0x30
// 8| . . # # . . . . 0x30
// 9| . . # # . . . . 0x30
//10| . . # # . . . . 0x30
//11| . . # # . . . . 0x30
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . # # . . 0x0C
// 4| . . . . # # . . 0x0C
// 5| . . . . . . . . 0x00
// 6| . . . . # # . . 0x0C
// 7| . . . . # # . . 0x0C
// 8| . . . . # # . . 0x0C
// 9| . . . . # # . . 0x0C
//10| # # . . # # . . 0xCC
//11| # # # # # # . . 0xFC
//12| . # # # # . . . 0x78
// 1| . . . . . . . . 0x00
// 2| # # . . . . . . 0xC0
// 3| # # . . . . . . 0xC0
// 4| # # . . # # . . 0xCC
// 5| # # . # # . . . 0xD8
// 6| # # # # . . . . 0xF0
// 7| # # # . . . . . 0xE0
// 8| # # # . . . . . 0xE0
// 9| # # # # . . . . 0xF0
//10| # # . # # . . . 0xD8
//11| # # . . # # . . 0xCC
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . # # # . . . . 0x70
// 3| . # # # . . . . 0x70
// 4| . . # # . . . . 0x30
// 5| . . # # . . . . 0x30
// 6| . . # # . . . . 0x30
// 7| . . # # . . . . 0x30
// 8| . . # # . . . . 0x30
// 9| . . # # . . . . 0x30
//10| . # # # # . . . 0x78
//11| . # # # # . . . 0x78
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| # # # . # # . . 0x00 // 0xEC
// 6| # # # # # # # . 0xEC // 0xFE
// 7| # # . # . # # . 0xFE // 0xD6
// 8| # # . # . # # . 0xD6
// 9| # # . # . # # . 0xD6
//10| # # . # . # # . 0xD6
//11| # # . . . # # . 0xC6
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| # # # # # . . . 0xF8
// 6| # # # # # # . . 0xFC
// 7| # # . . # # . . 0xCC
// 8| # # . . # # . . 0xCC
// 9| # # . . # # . . 0xCC
//10| # # . . # # . . 0xCC
//11| # # . . # # . . 0xCC
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| . # # # # . . . 0x78
// 6| # # # # # # . . 0xFC
// 7| # # . . # # . . 0xCC
// 8| # # . . # # . . 0xCC
// 9| # # . . # # . . 0xCC
//10| # # # # # # . . 0xFC
//11| . # # # # . . . 0x78
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| # # # # # . . . 0xF8
// 6| # # # # # # . . 0xFC
// 7| # # . . # # . . 0xCC
// 8| # # . . # # . . 0xCC
// 9| # # # # # # . . 0xFC
//10| # # # # # . . . 0xF8
//11| # # . . . . . . 0xC0
//12| # # . . . . . . 0xC0
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| . # # # # # . . 0x7C
// 6| # # # # # # . . 0xFC
// 7| # # . . # # . . 0xCC
// 8| # # . . # # . . 0xCC
// 9| # # # # # # . . 0xFC
//10| . # # # # # . . 0x7C
//11| . . . . # # . . 0x0C
//12| . . . . # # . . 0x0C
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| # # # # # . . . 0xF8
// 6| # # # # # # . . 0xFC
// 7| # # . . # # . . 0xCC
// 8| # # . . . . . . 0xC0
// 9| # # . . . . . . 0xC0
//10| # # . . . . . . 0xC0
//11| # # . . . . . . 0xC0
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . # # # # . . . 0x78
// 5| # # # # # # . . 0xFC
// 6| # # . . # # . . 0xCC
// 7| . # # . . . . . 0x60
// 8| . . . # # . . . 0x18
// 9| # # . . # # . . 0xCC
//10| # # # # # # . . 0xFC
//11| . # # # # . . . 0x78
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . # # . . . . . 0x60
// 4| . # # . . . . . 0x60
// 5| # # # # . . . . 0xF0
// 6| # # # # . . . . 0xF0
// 7| . # # . . . . . 0x60
// 8| . # # . . . . . 0x60
// 9| . # # . # # . . 0x6C
//10| . # # # # # . . 0x7C
//11| . . # # # . . . 0x38
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| # # . . # # . . 0xCC
// 6| # # . . # # . . 0xCC
// 7| # # . . # # . . 0xCC
// 8| # # . . # # . . 0xCC
// 9| # # . . # # . . 0xCC
//10| # # # # # # . . 0xFC
//11| . # # # # . . . 0x78
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| # # . . # # . . 0xCC
// 6| # # . . # # . . 0xCC
// 7| # # . . # # . . 0xCC
// 8| # # . . # # . . 0xCC
// 9| # # . . # # . . 0xCC
//10| . # # # # . . . 0x78
//11| . . # # . . . . 0x30
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| # # . . . # # . 0xC6
// 6| # # . . . # # . 0xC6
// 7| # # . . . # # . 0xC6
// 8| # # . . . # # . 0xC6
// 9| # # . # . # # . 0xD6
//10| # # # # # # # . 0xFE
//11| . # # . # # . . 0x6C
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| # # . . # # . . 0xCC
// 5| # # . . # # . . 0xCC
// 6| . # # # # . . . 0x78
// 7| . . # # . . . . 0x30
// 8| . . # # . . . . 0x30
// 9| . # # # # . . . 0x78
//10| # # . . # # . . 0xCC
//11| # # . . # # . . 0xCC
//12| . . . . . . . . 0x00
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| . . . . . . . . 0x00
// 5| # # . . # # . . 0xCC
// 6| # # . . # # . . 0xCC
// 7| # # . . # # . . 0xCC
// 8| # # # # # # . . 0xFC
// 9| . # # # # # . . 0x7C
//10| . . . . # # . . 0x0C
//11| # # . . # # . . 0xCC
//12| . # # # # . . . 0x78
// 1| . . . . . . . . 0x00
// 2| . . . . . . . . 0x00
// 3| . . . . . . . . 0x00
// 4| # # # # # # . . 0xFC
// 5| # # # # # # . . 0xFC
// 6| . . . # # . . . 0x18
// 7| . . # # . . . . 0x30
// 8| . . # # . . . . 0x30
// 9| . # # . . . . . 0x60
//10| # # # # # # . . 0xFC
//11| # # # # # # . . 0xFC
//12| . . . . . . . . 0x00
//************************************************************************************
