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 @@ ...@@ -15,7 +15,7 @@
<Description></Description> <Description></Description>
<Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> <Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d4p1:anyType i:type="FileInfo"> <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> <Attribute></Attribute>
<Category>include</Category> <Category>include</Category>
<Condition>C</Condition> <Condition>C</Condition>
...@@ -26,18 +26,18 @@ ...@@ -26,18 +26,18 @@
<SourcePath></SourcePath> <SourcePath></SourcePath>
</d4p1:anyType> </d4p1:anyType>
<d4p1:anyType i:type="FileInfo"> <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> <Attribute></Attribute>
<Category>header</Category> <Category>header</Category>
<Condition>C</Condition> <Condition>C</Condition>
<FileContentHash>fQaG1DJ4X5qUUwRvErAbNQ==</FileContentHash> <FileContentHash>mWiFIOAGwUPlW0rYsXcjkg==</FileContentHash>
<FileVersion></FileVersion> <FileVersion></FileVersion>
<Name>include/avr/iom4809.h</Name> <Name>include/avr/iom4809.h</Name>
<SelectString></SelectString> <SelectString></SelectString>
<SourcePath></SourcePath> <SourcePath></SourcePath>
</d4p1:anyType> </d4p1:anyType>
<d4p1:anyType i:type="FileInfo"> <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> <Attribute>template</Attribute>
<Category>source</Category> <Category>source</Category>
<Condition>C Exe</Condition> <Condition>C Exe</Condition>
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
<SourcePath></SourcePath> <SourcePath></SourcePath>
</d4p1:anyType> </d4p1:anyType>
<d4p1:anyType i:type="FileInfo"> <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> <Attribute>template</Attribute>
<Category>source</Category> <Category>source</Category>
<Condition>C Exe</Condition> <Condition>C Exe</Condition>
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
<SourcePath></SourcePath> <SourcePath></SourcePath>
</d4p1:anyType> </d4p1:anyType>
<d4p1:anyType i:type="FileInfo"> <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> <Attribute></Attribute>
<Category>libraryPrefix</Category> <Category>libraryPrefix</Category>
<Condition>GCC</Condition> <Condition>GCC</Condition>
...@@ -71,8 +71,8 @@ ...@@ -71,8 +71,8 @@
</d4p1:anyType> </d4p1:anyType>
</Files> </Files>
<PackName>ATmega_DFP</PackName> <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> <PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.2.209/Atmel.ATmega_DFP.pdsc</PackPath>
<PackVersion>1.2.272</PackVersion> <PackVersion>1.2.209</PackVersion>
<PresentInProject>true</PresentInProject> <PresentInProject>true</PresentInProject>
<ReferenceConditionId>ATmega4809</ReferenceConditionId> <ReferenceConditionId>ATmega4809</ReferenceConditionId>
<RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> <RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
......
...@@ -72,79 +72,79 @@ ...@@ -72,79 +72,79 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<ToolchainSettings> <ToolchainSettings>
<AvrGcc> <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.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols> <avrgcc.compiler.symbols.DefSymbols>
<ListValues> <ListValues>
<Value>NDEBUG</Value> <Value>NDEBUG</Value>
</ListValues> </ListValues>
</avrgcc.compiler.symbols.DefSymbols> </avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths> <avrgcc.compiler.directories.IncludePaths>
<ListValues> <ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value> <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues> </ListValues>
</avrgcc.compiler.directories.IncludePaths> </avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level> <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries> <avrgcc.linker.libraries.Libraries>
<ListValues> <ListValues>
<Value>libm</Value> <Value>libm</Value>
</ListValues> </ListValues>
</avrgcc.linker.libraries.Libraries> </avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths> <avrgcc.assembler.general.IncludePaths>
<ListValues> <ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value> <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues> </ListValues>
</avrgcc.assembler.general.IncludePaths> </avrgcc.assembler.general.IncludePaths>
</AvrGcc> </AvrGcc>
</ToolchainSettings> </ToolchainSettings>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings> <ToolchainSettings>
<AvrGcc> <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.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols> <avrgcc.compiler.symbols.DefSymbols>
<ListValues> <ListValues>
<Value>DEBUG</Value> <Value>DEBUG</Value>
</ListValues> </ListValues>
</avrgcc.compiler.symbols.DefSymbols> </avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths> <avrgcc.compiler.directories.IncludePaths>
<ListValues> <ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value> <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues> </ListValues>
</avrgcc.compiler.directories.IncludePaths> </avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize most (-O3)</avrgcc.compiler.optimization.level> <avrgcc.compiler.optimization.level>Optimize most (-O3)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel> <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries> <avrgcc.linker.libraries.Libraries>
<ListValues> <ListValues>
<Value>libm</Value> <Value>libm</Value>
</ListValues> </ListValues>
</avrgcc.linker.libraries.Libraries> </avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths> <avrgcc.assembler.general.IncludePaths>
<ListValues> <ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value> <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues> </ListValues>
</avrgcc.assembler.general.IncludePaths> </avrgcc.assembler.general.IncludePaths>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel> <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc> </AvrGcc>
</ToolchainSettings> </ToolchainSettings>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
...@@ -154,19 +154,10 @@ ...@@ -154,19 +154,10 @@
<Compile Include="adc.h"> <Compile Include="adc.h">
<SubType>compile</SubType> <SubType>compile</SubType>
</Compile> </Compile>
<Compile Include="display.c"> <Compile Include="oled.c">
<SubType>compile</SubType> <SubType>compile</SubType>
</Compile> </Compile>
<Compile Include="display.h"> <Compile Include="oled.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">
<SubType>compile</SubType> <SubType>compile</SubType>
</Compile> </Compile>
<Compile Include="fonts.h"> <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);