Вывод текста на TV или VGA с помощью PIC16

8-битные микроконтроллеры PICmicro (ПИКи) от Microchip и совместимые, а также 16-битные PIC24 и 32-битные PIC32

Moderator: Shaos

MCS51
Junior
Posts: 8
Joined: 22 Nov 2016 10:55

Вывод текста на TV или VGA с помощью PIC16

Post by MCS51 »

Решил сделать что-то подобное на каноничном 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, и мои шрифты будут просто уродски широкими.
User avatar
Shaos
Admin
Posts: 25308
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S

Post by Shaos »

На 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

Post by emax »

я больше к VGA склоняюсь, мониторов сейчас много остается и с цветами проще. На AVR получил 64х25, знакоместо 5х7, без внешних микросхем. Правда AVR китайский аналог 328, он на 32МГц работает.
User avatar
Shaos
Admin
Posts: 25308
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S

Post by Shaos »

Старых пиков на VGA не хватит - медленные они (20 МГц это только 5 миллионов операций в секунду)

P.S. Хотя есть PIC16 посовременнее аж на 48 МГц:
PIC16F1455-I/SL
IC MCU 8BIT 14KB FLASH 14SOIC
Там даже есть USB v2.0 и наряду с привычным АЦП имеется один 5-битный ЦАП :o

P.P.S. Предлагаю отделить беседу в новую тему "Вывод текста на VGA с помощью PIC16"
MCS51
Junior
Posts: 8
Joined: 22 Nov 2016 10:55

Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S

Post by MCS51 »

Shaos wrote:Старых пиков на VGA не хватит - медленные они...
P.S. Хотя есть PIC16 посовременнее аж на 48 МГц:
P.P.S. Предлагаю отделить беседу в новую тему "Вывод текста на VGA с помощью PIC16"
Да, медленные . Но именно поэтому захотелось реализовать это на PIC16. Не PIC18 (уже есть реализация от Тимофеева), не AVR (куча реализаций), а именно эти старички на 20МГц (можно под небольшим разгоном). Их есть у меня. Спортивный интерес - что смогу выжать из них?
Уже вижу, что в VGA очень уж скромно по разрешению получается. Может хоть ТВ юзабельно получится.
Тему пока создавать не надо. Даже макета рабочего ещё нет, все времянки отлаживаю в симуляторе MPLABa.
Как сделаю и запущу (очень надеюсь, что хватит силы воли и терпения), так создам отдельную тему. Просто по своему скромному опыту знаю, что если спаяю макет, то как правило довожу проект до стадии "оно что-то может", а если нет макета, то очень много идей остаётся в голове, так и не реализовавшись. А сейчас на службе, не до пайки макетов тут, максимум программировать пару часов в свободное время. Может хоть Протеус наконец освою. Как гляжу какие схемы в нем Lavr отлаживает, аж уважение пробирает...
User avatar
Shaos
Admin
Posts: 25308
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Вывод текста на TV или VGA с помощью PIC16

Post by Shaos »

Тему всё-таки отделил :roll:

Ради спортивного интереса я PIC12 заставил видео NTSC генерировать в 2016 году :)

viewtopic.php?f=67&t=16610

Правда до чего-то полезного типа текста так дело и не дошло...
MCS51
Junior
Posts: 8
Joined: 22 Nov 2016 10:55

Re: Вывод текста на TV или VGA с помощью PIC16

Post by MCS51 »

Вот только сейчас понял, что я не учел, как себя ведёт ножка 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 вообще нет. Он в пролете.
MCS51
Junior
Posts: 8
Joined: 22 Nov 2016 10:55

Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S

Post by MCS51 »

Shaos wrote: 28 Aug 2024 23:01 Старых пиков на VGA не хватит - медленные они (20 МГц это только 5 миллионов операций в секунду)...
Вот что удалось выжать для VGA из PIC16 на 20 МГЦ. Как и планировал, экран 12*8 (96 знакомест). Вывод оказалось проще сделать через SPI, не надо ставить инвертор (но в исходнике предусмотрел и сборку для вывода через UART с инвертором). Итого, текстовая nedoвидеокарта состоит из: микроконтроллер PIC16F73(74) -1 шт., резонатор 20 MHz -1 шт., резистор 100-200 Ohm -1 шт. (подал сигнал только на зеленый цвет, чтобы не нагружать вывод МК, и не применять буферы/повторители).
Исходник занял смешные 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.
User avatar
Shaos
Admin
Posts: 25308
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Вывод текста на TV или VGA с помощью PIC16

Post by Shaos »

хм, интересно
MCS51
Junior
Posts: 8
Joined: 22 Nov 2016 10:55

Re: Вывод текста на TV или VGA с помощью PIC16

Post by MCS51 »

Ну, раз хотя бы кому-то хоть чуть-чуть интересны мои нелепые потуги, то вот исходник. Может кто увидит, где можно улучшить.

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
//************************************************************************************