Commit 9a4c5ad3 authored by medlem's avatar medlem
Browse files

converted to cleaner oled code, working version still in 'Copy'

parent 2b902f90
......@@ -15,7 +15,7 @@
<Description></Description>
<Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\ATmega_DFP\1.2.272\include</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include</AbsolutePath>
<Attribute></Attribute>
<Category>include</Category>
<Condition>C</Condition>
......@@ -26,18 +26,18 @@
<SourcePath></SourcePath>
</d4p1:anyType>
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\ATmega_DFP\1.2.272\include\avr\iom4809.h</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include\avr\iom4809.h</AbsolutePath>
<Attribute></Attribute>
<Category>header</Category>
<Condition>C</Condition>
<FileContentHash>fQaG1DJ4X5qUUwRvErAbNQ==</FileContentHash>
<FileContentHash>mWiFIOAGwUPlW0rYsXcjkg==</FileContentHash>
<FileVersion></FileVersion>
<Name>include/avr/iom4809.h</Name>
<SelectString></SelectString>
<SourcePath></SourcePath>
</d4p1:anyType>
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\ATmega_DFP\1.2.272\templates\main.c</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\templates\main.c</AbsolutePath>
<Attribute>template</Attribute>
<Category>source</Category>
<Condition>C Exe</Condition>
......@@ -48,7 +48,7 @@
<SourcePath></SourcePath>
</d4p1:anyType>
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\ATmega_DFP\1.2.272\templates\main.cpp</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\templates\main.cpp</AbsolutePath>
<Attribute>template</Attribute>
<Category>source</Category>
<Condition>C Exe</Condition>
......@@ -59,7 +59,7 @@
<SourcePath></SourcePath>
</d4p1:anyType>
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\ATmega_DFP\1.2.272\gcc\dev\atmega4809</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega4809</AbsolutePath>
<Attribute></Attribute>
<Category>libraryPrefix</Category>
<Condition>GCC</Condition>
......@@ -71,8 +71,8 @@
</d4p1:anyType>
</Files>
<PackName>ATmega_DFP</PackName>
<PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/Atmel/ATmega_DFP/1.2.272/Atmel.ATmega_DFP.pdsc</PackPath>
<PackVersion>1.2.272</PackVersion>
<PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.2.209/Atmel.ATmega_DFP.pdsc</PackPath>
<PackVersion>1.2.209</PackVersion>
<PresentInProject>true</PresentInProject>
<ReferenceConditionId>ATmega4809</ReferenceConditionId>
<RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
......
......@@ -72,7 +72,7 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.Device>-mmcu=atmega4809 -B "%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\gcc\dev\atmega4809"</avrgcc.common.Device>
<avrgcc.common.Device>-mmcu=atmega4809 -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega4809"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
......@@ -87,7 +87,7 @@
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
......@@ -101,16 +101,16 @@
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
</AvrGcc>
</AvrGcc>
</ToolchainSettings>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.Device>-mmcu=atmega4809 -B "%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\gcc\dev\atmega4809"</avrgcc.common.Device>
<avrgcc.common.Device>-mmcu=atmega4809 -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega4809"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
......@@ -125,7 +125,7 @@
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize most (-O3)</avrgcc.compiler.optimization.level>
......@@ -140,11 +140,11 @@
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</AvrGcc>
</ToolchainSettings>
</PropertyGroup>
<ItemGroup>
......@@ -154,19 +154,10 @@
<Compile Include="adc.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="display.c">
<Compile Include="oled.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="display.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="driv_OLED.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="driv_OLED.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="font8x8.h">
<Compile Include="oled.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="fonts.h">
......
//
// display.c
//
#define F_CPU 3333333UL
// System headers
#include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h>
// Project headers
#include "display.h"
#include "spi.h"
#include "font8x8.h"
#define DSP_MODE_bm (1 << 3)
#define DSP_MODE_PORT PORTC
#define DSP_RST_bm (1 << 7)
#define DSP_RST_PORT PORTC
// This file contains a simple driver for the display so that one can print characters and strings.
// You shouldn't need to do anything in this file for things to work.
// Of course, you're welcome to check it out if you want to see how things work under the hood.
void DISP_rst();
void DISP_transmit_cmd(uint8_t cmd);
void DISP_transmit_data(uint8_t data);
void DISP_set_mode(bool mode);
int cursor_row = 0;
int cursor_col = 0;
void DISP_print(const char* str)
{
while(*str != '\0')
{
DISP_putc(*str);
str++;
}
}
void DISP_putc(char c)
{
if(c == '\n')
{
if(cursor_col == 0)
{
DISP_putc(' ');
}
while(cursor_col != 0)
{
DISP_putc(' ');
}
return;
}
else if(c == '\t')
{
int count = 3 - (cursor_col % 4);
for(int i = 0; i < count; i++)
{
DISP_putc(' ');
}
return;
}
else if(c < 0x20)
{
return;
}
else if(c < 0x7F)
{
uint8_t d[8] = {
pgm_read_byte(&(font8x8_basic[(int)c - 0x20][0])),
pgm_read_byte(&(font8x8_basic[(int)c - 0x20][1])),
pgm_read_byte(&(font8x8_basic[(int)c - 0x20][2])),
pgm_read_byte(&(font8x8_basic[(int)c - 0x20][3])),
pgm_read_byte(&(font8x8_basic[(int)c - 0x20][4])),
pgm_read_byte(&(font8x8_basic[(int)c - 0x20][5])),
pgm_read_byte(&(font8x8_basic[(int)c - 0x20][6])),
pgm_read_byte(&(font8x8_basic[(int)c - 0x20][7]))
};
for(uint8_t b = 0; b < 8; b++)
{
uint8_t db = 0;
db |= (((d[0] >> b) & 0x1) << 0);
db |= (((d[1] >> b) & 0x1) << 1);
db |= (((d[2] >> b) & 0x1) << 2);
db |= (((d[3] >> b) & 0x1) << 3);
db |= (((d[4] >> b) & 0x1) << 4);
db |= (((d[5] >> b) & 0x1) << 5);
db |= (((d[6] >> b) & 0x1) << 6);
db |= (((d[7] >> b) & 0x1) << 7);
DISP_transmit_data(db);
}
}
else if(c < 0xA0)
{
return;
}
else if(c > 0xC0)
{
uint8_t d[8] = {
pgm_read_byte(&(font8x8_ext_latin[(int)c - 0xc0][0])),
pgm_read_byte(&(font8x8_ext_latin[(int)c - 0xc0][1])),
pgm_read_byte(&(font8x8_ext_latin[(int)c - 0xc0][2])),
pgm_read_byte(&(font8x8_ext_latin[(int)c - 0xc0][3])),
pgm_read_byte(&(font8x8_ext_latin[(int)c - 0xc0][4])),
pgm_read_byte(&(font8x8_ext_latin[(int)c - 0xc0][5])),
pgm_read_byte(&(font8x8_ext_latin[(int)c - 0xc0][6])),
pgm_read_byte(&(font8x8_ext_latin[(int)c - 0xc0][7]))
};
for(uint8_t b = 0; b < 8; b++)
{
uint8_t db = 0;
db |= (((d[0] >> b) & 0x1) << 0);
db |= (((d[1] >> b) & 0x1) << 1);
db |= (((d[2] >> b) & 0x1) << 2);
db |= (((d[3] >> b) & 0x1) << 3);
db |= (((d[4] >> b) & 0x1) << 4);
db |= (((d[5] >> b) & 0x1) << 5);
db |= (((d[6] >> b) & 0x1) << 6);
db |= (((d[7] >> b) & 0x1) << 7);
DISP_transmit_data(db);
}
}
cursor_col++;
cursor_col %= 16;
if(cursor_col == 0)
{
cursor_row++;
cursor_row %= 4;
}
}
void DISP_clear()
{
if(cursor_row == 0)
{
DISP_print("\n");
}
while(cursor_row != 0)
{
DISP_print("\n");
}
for(int i = 0; i < 4 * 16; i++)
{
DISP_putc(' ');
}
}
void DISP_write_bitmap(const uint8_t* bm)
{
for(uint8_t y = 0; y < 4; y++)
{
for(uint8_t x = 0; x < 16; x++)
{
uint8_t d[8] = {
pgm_read_byte(&(bm[(8 * y + 0) * 16 + x])),
pgm_read_byte(&(bm[(8 * y + 1) * 16 + x])),
pgm_read_byte(&(bm[(8 * y + 2) * 16 + x])),
pgm_read_byte(&(bm[(8 * y + 3) * 16 + x])),
pgm_read_byte(&(bm[(8 * y + 4) * 16 + x])),
pgm_read_byte(&(bm[(8 * y + 5) * 16 + x])),
pgm_read_byte(&(bm[(8 * y + 6) * 16 + x])),
pgm_read_byte(&(bm[(8 * y + 7) * 16 + x]))
};
for(uint8_t b = 0; b < 8; b++)
{
uint8_t db = 0;
db |= (((d[0] >> b) & 0x1) << 0);
db |= (((d[1] >> b) & 0x1) << 1);
db |= (((d[2] >> b) & 0x1) << 2);
db |= (((d[3] >> b) & 0x1) << 3);
db |= (((d[4] >> b) & 0x1) << 4);
db |= (((d[5] >> b) & 0x1) << 5);
db |= (((d[6] >> b) & 0x1) << 6);
db |= (((d[7] >> b) & 0x1) << 7);
DISP_transmit_data(db);
}
}
}
}
void DISP_transmit_cmd(uint8_t cmd)
{
DISP_set_mode(0);
SPI_MasterTransmit(cmd);
}
void DISP_transmit_data(uint8_t data)
{
DISP_set_mode(1);
SPI_MasterTransmit(data);
}
// mode: 1 = data, 0 = cmd
void DISP_set_mode(bool mode)
{
if(mode)
{
DSP_MODE_PORT.OUTSET = DSP_MODE_bm;
}
else
{
DSP_MODE_PORT.OUTCLR = DSP_MODE_bm;
}
}
void DISP_init()
{
DSP_RST_PORT.DIRSET = DSP_RST_bm;
DSP_MODE_PORT.DIRSET = DSP_MODE_bm;
SPI_MasterInit();
DISP_set_mode(1);
DISP_rst();
DISP_transmit_cmd(0xAE); // display off
// p32
DISP_transmit_cmd(0xD5); // clock
DISP_transmit_cmd(0xF0); // upper nibble is rate, lower nibble is divisor
// p31
DISP_transmit_cmd(0xA8); // mux ratio p31
DISP_transmit_cmd(0x20); // rtfm
// p31
DISP_transmit_cmd(0xD3); // display offset
DISP_transmit_cmd(0x00); // rtfm
// p3 (appendix)
DISP_transmit_cmd(0x8D); // charge pump
DISP_transmit_cmd(0x14); // enable
// p30, p34
DISP_transmit_cmd(0x20); // memory addr mode
DISP_transmit_cmd(0x00); // horizontal
// p31
DISP_transmit_cmd(0xA1); // segment remap
DISP_transmit_cmd(0xA5); // display on
// p31
DISP_transmit_cmd(0xC8); // com scan direction
// p31
DISP_transmit_cmd(0x7F); // display start line
// p31
DISP_transmit_cmd(0x22); // set page address
DISP_transmit_cmd(0x00);
DISP_transmit_cmd(0x03);
// p31, p40
DISP_transmit_cmd(0xDA); // com hardware cfg
DISP_transmit_cmd(0x02); // com cfg
// p28
DISP_transmit_cmd(0x81); // contrast aka current
DISP_transmit_cmd(0xFF); // 128 is midpoint
// p32
DISP_transmit_cmd(0xD9); // precharge
DISP_transmit_cmd(0x11); // rtfm
// p32
DISP_transmit_cmd(0xDB); // vcomh deselect level
DISP_transmit_cmd(0x20); // rtfm
DISP_transmit_cmd(0xA6); // non-inverted
DISP_transmit_cmd(0xA4); // display scan on
DISP_transmit_cmd(0xAF); // drivers on
DISP_clear();
}
void DISP_rst()
{
DSP_RST_PORT.OUTCLR = DSP_RST_bm;
_delay_ms(10);
DSP_RST_PORT.OUTSET = DSP_RST_bm;
_delay_ms(10);
}
//
// display.h
//
#ifndef DISPLAY_H_
#define DISPLAY_H_
// Below are the public functions that you can use to play with the screen
// Call this method to initialize the screen. This must be done before using any other functions
void DISP_init();
// Call this method to write a bitmap to the screen. The bitmap must be a 32x16(512) array of bytes
// where each row of 16 bytes (128 bits) is one row of monochrome pixels on the screen.
// Black = 0, White = 1
void DISP_write_bitmap(const uint8_t* bitmap);
// This clears the display
void DISP_clear();
// Print a single character to the screen
void DISP_putc(char c);
// Print a string literal to the screen
void DISP_print(const char* str);
#endif /* DISPLAY_H_ */
\ No newline at end of file
//
// font8x8.h
//
#include <avr/pgmspace.h>
#ifndef FONT8X8_H_
#define FONT8X8_H_
const char font8x8_basic[96][8] PROGMEM = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0020 (space)
{ 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00 }, // U+0021 (!)
{ 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0022 (")
{ 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00 }, // U+0023 (#)
{ 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00 }, // U+0024 ($)
{ 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00 }, // U+0025 (%)
{ 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00 }, // U+0026 (&)
{ 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0027 (')
{ 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00 }, // U+0028 (()
{ 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00 }, // U+0029 ())
{ 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00 }, // U+002A (*)
{ 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00 }, // U+002B (+)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06 }, // U+002C (,)
{ 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00 }, // U+002D (-)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00 }, // U+002E (.)
{ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00 }, // U+002F (/)
{ 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00 }, // U+0030 (0)
{ 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00 }, // U+0031 (1)
{ 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00 }, // U+0032 (2)
{ 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00 }, // U+0033 (3)
{ 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00 }, // U+0034 (4)
{ 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00 }, // U+0035 (5)
{ 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00 }, // U+0036 (6)
{ 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00 }, // U+0037 (7)
{ 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00 }, // U+0038 (8)
{ 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00 }, // U+0039 (9)
{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00 }, // U+003A (:)
{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06 }, // U+003B (//)
{ 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00 }, // U+003C (<)
{ 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00 }, // U+003D (=)
{ 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00 }, // U+003E (>)
{ 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00 }, // U+003F (?)
{ 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00 }, // U+0040 (@)
{ 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00 }, // U+0041 (A)
{ 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00 }, // U+0042 (B)
{ 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00 }, // U+0043 (C)
{ 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00 }, // U+0044 (D)
{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00 }, // U+0045 (E)
{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00 }, // U+0046 (F)
{ 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00 }, // U+0047 (G)
{ 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00 }, // U+0048 (H)
{ 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 }, // U+0049 (I)
{ 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00 }, // U+004A (J)
{ 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00 }, // U+004B (K)
{ 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00 }, // U+004C (L)
{ 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00 }, // U+004D (M)
{ 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00 }, // U+004E (N)
{ 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00 }, // U+004F (O)
{ 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00 }, // U+0050 (P)
{ 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00 }, // U+0051 (Q)
{ 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00 }, // U+0052 (R)
{ 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00 }, // U+0053 (S)
{ 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 }, // U+0054 (T)
{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00 }, // U+0055 (U)
{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00 }, // U+0056 (V)
{ 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00 }, // U+0057 (W)
{ 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00 }, // U+0058 (X)
{ 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00 }, // U+0059 (Y)
{ 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00 }, // U+005A (Z)
{ 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00 }, // U+005B ([)
{ 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00 }, // U+005C (\)
{ 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00 }, // U+005D (])
{ 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00 }, // U+005E (^)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF }, // U+005F (_)
{ 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0060 (`)
{ 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00 }, // U+0061 (a)
{ 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00 }, // U+0062 (b)
{ 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00 }, // U+0063 (c)
{ 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00 }, // U+0064 (d)
{ 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00 }, // U+0065 (e)
{ 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00 }, // U+0066 (f)
{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F }, // U+0067 (g)
{ 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00 }, // U+0068 (h)
{ 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 }, // U+0069 (i)
{ 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E }, // U+006A (j)
{ 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00 }, // U+006B (k)
{ 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 }, // U+006C (l)
{ 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00 }, // U+006D (m)
{ 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00 }, // U+006E (n)
{ 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00 }, // U+006F (o)
{ 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F }, // U+0070 (p)
{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78 }, // U+0071 (q)
{ 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00 }, // U+0072 (r)
{ 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00 }, // U+0073 (s)
{ 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00 }, // U+0074 (t)
{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00 }, // U+0075 (u)
{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00 }, // U+0076 (v)
{ 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F,