Commit 9a4c5ad3 authored by medlem's avatar medlem

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,79 +72,79 @@
<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.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>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
</AvrGcc>
<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>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<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>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
</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.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>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize most (-O3)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\Atmel\ATmega_DFP\1.2.272\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
<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>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<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>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<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>
</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
This diff is collapsed.
......@@ -12,8 +12,9 @@
#include <stdio.h>
#include <avr/interrupt.h>
#include "display.h"
#include "driv_OLED.h"
#include "oled.h"
#include "adc.h"
const uint8_t OV[512] PROGMEM =
{
......@@ -63,10 +64,11 @@ int main(void)
sei();
_delay_ms(500);
//DISP_init();
oled_init();
adc_init();
//DISP_write_bitmap(OV); //Printing Bitmap
//DISP_print("Hello World!"); //Printing text
oled_write_bitmap(OV); //Printing Bitmap
_delay_ms(2000);
oled_clear_screen();
LED0_PORT.DIRSET = LED0_bm;
SW0_PORT.DIRCLR = SW0_bm;
oled_pos(1,12);
......@@ -179,11 +181,11 @@ int main(void)
if (!(SW0_PORT.IN & (SW0_bm)))
{
oled_pos(0,0);
DISP_write_bitmap(OV);
oled_write_bitmap(OV);
while (!(SW0_PORT.IN & (SW0_bm)))
{
}
DISP_clear();
oled_clear_screen();
oled_pos(1,12);
oled_write_d(0xf8);
oled_pos(2,12);
......
......@@ -4,17 +4,27 @@
* Created: 17.09.2015 12:22:09
* Author: helgeanl
*/
#define F_CPU 3333333ul
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "driv_OLED.h"
#include <util/delay.h>
#include <stdbool.h>
#include "oled.h"
#include "fonts.h"
#include "display.h"
#include "spi.h"
//#include "display.h"
volatile uint8_t *oled_c = (uint8_t *) 0x1000; // Command
volatile uint8_t *oled_d = (uint8_t *) 0x1200; // Data
static uint8_t oled_current_line_num;
#define OLED_MODE_bm (1 << 3)
#define OLED_MODE_PORT PORTC
#define OLED_RESET_bm (1 << 7)
#define OLED_RESET_PORT PORTC
#define DATA_MODE 1
#define COMMAND_MODE 0
//------------------------------------------------------------
......@@ -24,43 +34,106 @@ uint8_t oled_get_current_line(){
void oled_init()
{
oled_write_c(0xae); // display off
oled_write_c(0xa1); // segment remap
oled_write_c(0xda); // common pads hardware: alternative
oled_write_c(0x12);
oled_write_c(0xc8); // common output scan direction:com63~com0
oled_write_c(0xa8); // multiplex ration mode:63
oled_write_c(0x3f);
oled_write_c(0xd5); // display divide ratio/osc. freq. mode
oled_write_c(0x80);
oled_write_c(0x81); // contrast control
oled_write_c(0x50);
oled_write_c(0xd9); // set pre-charge period
oled_write_c(0x21);
oled_write_c(0x20); // Set Memory Addressing Mode
oled_write_c(0x02);
oled_write_c(0xdb); // VCOM deselect level mode
oled_write_c(0x30);
oled_write_c(0xad); // master configuration
oled_write_c(0x00);
oled_write_c(0xa4); // out follows RAM content
oled_write_c(0xa6); // set normal display
oled_write_c(0xaf); // display on
OLED_RESET_PORT.DIRSET = OLED_RESET_bm;
OLED_MODE_PORT.DIRSET = OLED_MODE_bm;
SPI_MasterInit();
oled_set_mode(1);
oled_reset();
oled_write_c(0xAE); // display off
// p32
oled_write_c(0xD5); // clock
oled_write_c(0xF0); // upper nibble is rate, lower nibble is divisor
// p31
oled_write_c(0xA8); // mux ratio p31
oled_write_c(0x20); // rtfm
// p31
oled_write_c(0xD3); // display offset
oled_write_c(0x00); // rtfm
// p3 (appendix)
oled_write_c(0x8D); // charge pump
oled_write_c(0x14); // enable
// p30, p34
oled_write_c(0x20); // memory addr mode
oled_write_c(0x00); // horizontal
// p31
oled_write_c(0xA1); // segment remap
oled_write_c(0xA5); // display on
// p31
oled_write_c(0xC8); // com scan direction
// p31
oled_write_c(0x7F); // display start line
// p31
oled_write_c(0x22); // set page address
oled_write_c(0x00);
oled_write_c(0x03);
// p31, p40
oled_write_c(0xDA);