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

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

parent 2b902f90
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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">
+70 −79
Original line number Diff line number Diff line
@@ -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,7 +101,7 @@
  </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>
@@ -110,7 +110,7 @@
  <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,7 +140,7 @@
  </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>
@@ -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">
+0 −317
Original line number Diff line number Diff line
//
// 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);
}
+0 −28
Original line number Diff line number Diff line
//
// 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
+0 −181
Original line number Diff line number Diff line
//
// 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, 0x36, 0x00 },   // U+0077 (w)
	{ 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00 },   // U+0078 (x)
	{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F },   // U+0079 (y)
	{ 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00 },   // U+007A (z)
	{ 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00 },   // U+007B ({)
	{ 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00 },   // U+007C (|)
	{ 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00 },   // U+007D (})
	{ 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // U+007E (~)
	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }    // U+007F
};

const char font8x8_ext_latin[64][8] PROGMEM = {
	{ 0x07, 0x00, 0x1C, 0x36, 0x63, 0x7F, 0x63, 0x00 },   // U+00C0 (A grave)
	{ 0x70, 0x00, 0x1C, 0x36, 0x63, 0x7F, 0x63, 0x00 },   // U+00C1 (A aigu)
	{ 0x1C, 0x36, 0x00, 0x3E, 0x63, 0x7F, 0x63, 0x00 },   // U+00C2 (A circumflex)
	{ 0x6E, 0x3B, 0x00, 0x3E, 0x63, 0x7F, 0x63, 0x00 },   // U+00C3 (A ~)
	{ 0x63, 0x1C, 0x36, 0x63, 0x7F, 0x63, 0x63, 0x00 },   // U+00C4 (A umlaut)
	{ 0x0C, 0x0C, 0x00, 0x1E, 0x33, 0x3F, 0x33, 0x00 },   // U+00C5 (A ring)
	{ 0x7C, 0x36, 0x33, 0x7F, 0x33, 0x33, 0x73, 0x00 },   // U+00C6 (AE)
	{ 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x18, 0x30, 0x1E },   // U+00C7 (C cedille)
	{ 0x07, 0x00, 0x3F, 0x06, 0x1E, 0x06, 0x3F, 0x00 },   // U+00C8 (E grave)
	{ 0x38, 0x00, 0x3F, 0x06, 0x1E, 0x06, 0x3F, 0x00 },   // U+00C9 (E aigu)
	{ 0x0C, 0x12, 0x3F, 0x06, 0x1E, 0x06, 0x3F, 0x00 },   // U+00CA (E circumflex)
	{ 0x36, 0x00, 0x3F, 0x06, 0x1E, 0x06, 0x3F, 0x00 },   // U+00CB (E umlaut)
	{ 0x07, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },   // U+00CC (I grave)
	{ 0x38, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },   // U+00CD (I aigu)
	{ 0x0C, 0x12, 0x00, 0x1E, 0x0C, 0x0C, 0x1E, 0x00 },   // U+00CE (I circumflex)
	{ 0x33, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },   // U+00CF (I umlaut)
	{ 0x3F, 0x66, 0x6F, 0x6F, 0x66, 0x66, 0x3F, 0x00 },   // U+00D0 (Eth)
	{ 0x3F, 0x00, 0x33, 0x37, 0x3F, 0x3B, 0x33, 0x00 },   // U+00D1 (N ~)
	{ 0x0E, 0x00, 0x18, 0x3C, 0x66, 0x3C, 0x18, 0x00 },   // U+00D2 (O grave)
	{ 0x70, 0x00, 0x18, 0x3C, 0x66, 0x3C, 0x18, 0x00 },   // U+00D3 (O aigu)
	{ 0x3C, 0x66, 0x18, 0x3C, 0x66, 0x3C, 0x18, 0x00 },   // U+00D4 (O circumflex)
	{ 0x6E, 0x3B, 0x00, 0x3E, 0x63, 0x63, 0x3E, 0x00 },   // U+00D5 (O ~)
	{ 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00 },   // U+00D6 (O umlaut)
	{ 0x00, 0x36, 0x1C, 0x08, 0x1C, 0x36, 0x00, 0x00 },   // U+00D7 (multiplicative x)
	{ 0x5C, 0x36, 0x73, 0x7B, 0x6F, 0x36, 0x1D, 0x00 },   // U+00D8 (O stroke)
	{ 0x0E, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00 },   // U+00D9 (U grave)
	{ 0x70, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00 },   // U+00DA (U aigu)
	{ 0x3C, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x00 },   // U+00DB (U circumflex)
	{ 0x33, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00 },   // U+00DC (U umlaut)
	{ 0x70, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x00 },   // U+00DD (Y aigu)
	{ 0x0F, 0x06, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x0F },   // U+00DE (Thorn)
	{ 0x00, 0x1E, 0x33, 0x1F, 0x33, 0x1F, 0x03, 0x03 },   // U+00DF (beta)
	{ 0x07, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00 },   // U+00E0 (a grave)
	{ 0x38, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00 },   // U+00E1 (a aigu)
	{ 0x7E, 0xC3, 0x3C, 0x60, 0x7C, 0x66, 0xFC, 0x00 },   // U+00E2 (a circumflex)
	{ 0x6E, 0x3B, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00 },   // U+00E3 (a ~)
	{ 0x33, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00 },   // U+00E4 (a umlaut)
	{ 0x0C, 0x0C, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00 },   // U+00E5 (a ring)
	{ 0x00, 0x00, 0xFE, 0x30, 0xFE, 0x33, 0xFE, 0x00 },   // U+00E6 (ae)
	{ 0x00, 0x00, 0x1E, 0x03, 0x03, 0x1E, 0x30, 0x1C },   // U+00E7 (c cedille)
	{ 0x07, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00 },   // U+00E8 (e grave)
	{ 0x38, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00 },   // U+00E9 (e aigu)
	{ 0x7E, 0xC3, 0x3C, 0x66, 0x7E, 0x06, 0x3C, 0x00 },   // U+00EA (e circumflex)
	{ 0x33, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00 },   // U+00EB (e umlaut)
	{ 0x07, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },   // U+00EC (i grave)
	{ 0x1C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },   // U+00ED (i augu)
	{ 0x3E, 0x63, 0x1C, 0x18, 0x18, 0x18, 0x3C, 0x00 },   // U+00EE (i circumflex)
	{ 0x33, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },   // U+00EF (i umlaut)
	{ 0x1B, 0x0E, 0x1B, 0x30, 0x3E, 0x33, 0x1E, 0x00 },   // U+00F0 (eth)
	{ 0x00, 0x1F, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x00 },   // U+00F1 (n ~)
	{ 0x00, 0x07, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00 },   // U+00F2 (o grave)
	{ 0x00, 0x38, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00 },   // U+00F3 (o aigu)
	{ 0x1E, 0x33, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00 },   // U+00F4 (o circumflex)
	{ 0x6E, 0x3B, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00 },   // U+00F5 (o ~)
	{ 0x00, 0x33, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00 },   // U+00F6 (o umlaut)
	{ 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00 },   // U+00F7 (division)
	{ 0x00, 0x60, 0x3C, 0x76, 0x7E, 0x6E, 0x3C, 0x06 },   // U+00F8 (o stroke)
	{ 0x00, 0x07, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00 },   // U+00F9 (u grave)
	{ 0x00, 0x38, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00 },   // U+00FA (u aigu)
	{ 0x1E, 0x33, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00 },   // U+00FB (u circumflex)
	{ 0x00, 0x33, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00 },   // U+00FC (u umlaut)
	{ 0x00, 0x38, 0x00, 0x33, 0x33, 0x3E, 0x30, 0x1F },   // U+00FD (y aigu)
	{ 0x00, 0x00, 0x06, 0x3E, 0x66, 0x3E, 0x06, 0x00 },   // U+00FE (thorn)
	{ 0x00, 0x33, 0x00, 0x33, 0x33, 0x3E, 0x30, 0x1F }    // U+00FF (y umlaut)
};




#endif /* FONT8X8_H_ */
 No newline at end of file
Loading