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

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

Moderator: Shaos

Post Reply
MCS51
Junior
Posts: 8
Joined: 22 Nov 2016 17: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: 25346
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

На PIC16 я 20 лет назад делал 32x24 на NTSC и PAL - см. viewtopic.php?f=67&t=7533
Но там снаружи были кое-какие микросхемы в помощь...
emax
Novelist
Posts: 49
Joined: 16 Sep 2014 05:32
Location: Пермь

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

Post by emax »

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

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 17: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: 25346
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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 17: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 17:55

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

Post by MCS51 »

Shaos wrote: 29 Aug 2024 06: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
Я просто упростил концепцию до минимума (и взял самый слабый МК, пригодный для этого).
Attachments

6db11bef-2f9e-4c83-b066-681f5858e894.jpg
6db11bef-2f9e-4c83-b066-681f5858e894.jpg (189.63 KiB) Viewed 970 times

User avatar
Shaos
Admin
Posts: 25346
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

хм, интересно
MCS51
Junior
Posts: 8
Joined: 22 Nov 2016 17: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
//************************************************************************************
Post Reply