From 55f54a2d4ab915c299ea186f5456fbc8ba9471f5 Mon Sep 17 00:00:00 2001 From: bartool Date: Sat, 18 Jun 2022 11:22:32 +0200 Subject: [PATCH] Complete init sh1106 update cmkae file for test --- oled/sh1106/sh1106.c | 30 +++++++++++++++++++++++-- oled/sh1106/sh1106.h | 48 ++++++++++++++++++++++------------------ oled/ssd1306/ssd1306.c | 8 ++++--- oled/ssd1306/ssd1306.h | 2 ++ test/oled/CMakeLists.txt | 6 +++++ 5 files changed, 68 insertions(+), 26 deletions(-) diff --git a/oled/sh1106/sh1106.c b/oled/sh1106/sh1106.c index 8ddc31b..6573d59 100644 --- a/oled/sh1106/sh1106.c +++ b/oled/sh1106/sh1106.c @@ -3,5 +3,31 @@ void SH1106_Init(OLED_HandleTypeDef *hOled) { - -} \ No newline at end of file + uint8_t display = SH1106_DISPLAYOFF; + oled_SendCommand(hOled, &display, 1); + + uint8_t config[] = { + SH1106_LOWCOLADDR | 0x00, // 0x00h (0000 XXXX) + SH1106_HIGHCOLADDR | 0x00, // 0x10h (0001 XXXX) + SH1106_PUMPVOLTAGE | 0x02, // 0x32h (0011 00XX) + SH1106_LINEADDRESS | 0x00, // 0x40h (01XX XXXX) + SH1106_CONTRASTMODE, SH1106_CONTRASTVALUE, // (1000 0001) // 0x80h (0x00h - 0xFFh) (XXXX XXXX) + SH1106_SEGMENTREMAP | 0x00, // 0xA0h (1010 000X) right(0), left(1) + SH1106_ENTIREDISPALY | 0x00, // 0xA4h (1010 010X) normal(0), entire(1) + SH1106_NORMALORREVERS | 0x00, // 0xA6h (1010 011X) normal(0), reverse(1) + SH1106_MULTIPLEXMODE, SH1106_MILTIPLEXVALUE, // (1010 1000) // 0x3Fh (00XX XXXX) (0x00h - 0x3Fh) + SH1106_DCCONTROLMODE, SH1106_DCCONTROLVALON, // (1010 1101) // 0x8Bh (1000 101X) ON(1), OFF(0) + SH1106_PAGEADDRESS | 0x00, // 0xB0h (1011 XXXX) + SH1106_OUTPUTSCANDIR | 0x00, // 0xC0h (1100 X000) Scan from COM0 to COM [N- 1] (0x00) or Scan from COM [N-1] to COM0 (0x08) + SH1106_OFFSETMODE, SH1106_OFFSETVALUE, // (1101 0011) // 0x00h (00XX XXXX) COM0-63 + SH1106_DIVRATIOFREQM, SH1106_DIVRATIOFREQV, // (1101 0101) // 0x50h (FFFF DDDD) Frequency, Divide + SH1106_CHARGEMODE, SH1106_CHARGEVALUE, // (1101 1001) // 0x22h (DDDD PPPP) Dis-charge Period, Pre-charge Period + SH1106_COMPADSCONFMODE, SH1106_COMPADSCONFVAL, // (1101 1010) // 0x12h (000X 0010) + SH1106_VCOMDESMODE, SH1106_VCOMDESVALUE // (1101 1101) // 0x35h (XXXX XXXX) VCOM (Beta x Vref) + }; + oled_SendCommand(hOled, config, sizeof(config)); + + display = SH1106_DISPLAYON; + oled_SendCommand(hOled, &display, 1); +} + diff --git a/oled/sh1106/sh1106.h b/oled/sh1106/sh1106.h index 01a589f..0a2a3ef 100644 --- a/oled/sh1106/sh1106.h +++ b/oled/sh1106/sh1106.h @@ -1,23 +1,29 @@ #pragma once -#define LOWCOLADDR 0x00 // 0x00h (0000 XXXX) -#define HIGHCOLADDR 0x10 // 0x10h (0001 XXXX) -#define PUMPVOLTAGE 0x30 // 0x32h (0011 00XX) -#define LINEADDRESS 0x40 // 0x40h (01XX XXXX) -#define CONTRASTMODE 0x81 // (1000 0001) -#define CONTRASTVALUE 0x80 // 0x80h (0x00h - 0xFFh) (XXXX XXXX) -#define SEGMENTREMAP 0xA0 // 0xA0h (1010 000X) right(0), left(1) -#define ENTIREDISPALY 0xA4 // 0xA4h (1010 010X) normal(0), entire(1) -#define NORMALORREVERS 0xA6 // 0xA6h (1010 011X) normal(0), reverse(1) -#define MULTIPLEXMODE 0xA8 // (1010 1000) -#define MILTIPLEXVALUE 0x3F // 0x3Fh (00XX XXXX) (0x00h - 0x3Fh) -#define DCCONTROLMODE 0xAD // (1010 1101) -#define DCCONTROLVALUE 0x8B // 0x8Bh (1000 101X) ON(1), OFF(0) -#define DISPLAYOFF 0xAE -#define DISPLAYON 0xAF // 0xAEh (1010 111X) ON(1), OFF(0) -#define PAGEADDRESS 0xB0 // 0xB0h (1011 XXXX) -#define OUTPUTSCANDIR 0xC0 // 0xC0h (1100 X000) -#define OFFSETMODE 0xD3 // (1101 0011) -#define OFFSETVALUE 0x00 // 0x00h (00XX XXXX) COM0-63 -#define DIVRATIOFREQM 0xD5 // (1101 0101) -#define DIVRATIOFREQV 0x50 // 0x50h (FFFF DDDD) Frequency, Divide \ No newline at end of file +#define SH1106_LOWCOLADDR 0x00 // 0x00h (0000 XXXX) +#define SH1106_HIGHCOLADDR 0x10 // 0x10h (0001 XXXX) +#define SH1106_PUMPVOLTAGE 0x30 // 0x32h (0011 00XX) +#define SH1106_LINEADDRESS 0x40 // 0x40h (01XX XXXX) +#define SH1106_CONTRASTMODE 0x81 // (1000 0001) +#define SH1106_CONTRASTVALUE 0x80 // 0x80h (0x00h - 0xFFh) (XXXX XXXX) +#define SH1106_SEGMENTREMAP 0xA0 // 0xA0h (1010 000X) right(0), left(1) +#define SH1106_ENTIREDISPALY 0xA4 // 0xA4h (1010 010X) normal(0), entire(1) +#define SH1106_NORMALORREVERS 0xA6 // 0xA6h (1010 011X) normal(0), reverse(1) +#define SH1106_MULTIPLEXMODE 0xA8 // (1010 1000) +#define SH1106_MILTIPLEXVALUE 0x3F // 0x3Fh (00XX XXXX) (0x00h - 0x3Fh) +#define SH1106_DCCONTROLMODE 0xAD // (1010 1101) +#define SH1106_DCCONTROLVALON 0x8B // 0x8Bh (1000 101X) ON(1), OFF(0) +#define SH1106_DISPLAYOFF 0xAE // 0xAEh (1010 111X) ON(1), OFF(0) +#define SH1106_DISPLAYON 0xAF // 0xAEh (1010 111X) ON(1), OFF(0) +#define SH1106_PAGEADDRESS 0xB0 // 0xB0h (1011 XXXX) +#define SH1106_OUTPUTSCANDIR 0xC0 // 0xC0h (1100 X000) Scan from COM0 to COM [N- 1] (0) or Scan from COM [N-1] to COM0 (1). +#define SH1106_OFFSETMODE 0xD3 // (1101 0011) +#define SH1106_OFFSETVALUE 0x00 // 0x00h (00XX XXXX) COM0-63 +#define SH1106_DIVRATIOFREQM 0xD5 // (1101 0101) +#define SH1106_DIVRATIOFREQV 0x50 // 0x50h (FFFF DDDD) Frequency, Divide +#define SH1106_CHARGEMODE 0xD9 // (1101 1001) +#define SH1106_CHARGEVALUE 0x22 // 0x22h (DDDD PPPP) Dis-charge Period, Pre-charge Period +#define SH1106_COMPADSCONFMODE 0xDA // (1101 1010) +#define SH1106_COMPADSCONFVAL 0x12 // 0x12h (000X 0010) +#define SH1106_VCOMDESMODE 0xDD // (1101 1101) +#define SH1106_VCOMDESVALUE 0x35 // 0x35h (XXXX XXXX) VCOM (Beta x Vref) diff --git a/oled/ssd1306/ssd1306.c b/oled/ssd1306/ssd1306.c index 4722a3c..b46874b 100644 --- a/oled/ssd1306/ssd1306.c +++ b/oled/ssd1306/ssd1306.c @@ -18,9 +18,10 @@ void SSD1306_Init(OLED_HandleTypeDef *hOled) contrast = 0xAF; } - oled_SendCommand(hOled, SSD1306_DISPLAYOFF, 1); + uint8_t display = SSD1306_DISPLAYOFF; + oled_SendCommand(hOled, &display, 1); - const uint8_t config[] = { + uint8_t config[] = { SSD1306_SETMULTIPLEX, hOled->Height -1, SSD1306_SETDISPLAYOFFSET, 0x00, SSD1306_SETSTARTLINE | 0x00, @@ -40,7 +41,8 @@ void SSD1306_Init(OLED_HandleTypeDef *hOled) oled_SendCommand(hOled, config, sizeof(config)); - oled_SendCommand(hOled, SSD1306_DISPLAYON, 1); + display = SSD1306_DISPLAYOFF; + oled_SendCommand(hOled, &display, 1); } \ No newline at end of file diff --git a/oled/ssd1306/ssd1306.h b/oled/ssd1306/ssd1306.h index b424783..4102969 100644 --- a/oled/ssd1306/ssd1306.h +++ b/oled/ssd1306/ssd1306.h @@ -1,5 +1,7 @@ #pragma once +#include "oled.h" + #define SSD1306_MEMORYMODE 0x20 ///< See datasheet #define SSD1306_COLUMNADDR 0x21 ///< See datasheet #define SSD1306_PAGEADDR 0x22 ///< See datasheet diff --git a/test/oled/CMakeLists.txt b/test/oled/CMakeLists.txt index 3c0010f..368c2d2 100644 --- a/test/oled/CMakeLists.txt +++ b/test/oled/CMakeLists.txt @@ -4,11 +4,17 @@ set(TEST_NAME oled) set(INCLUDE_DIRS ../../oled + ../../oled/ssd1306 + ../../oled/sh1106 helpers/inc ) set(SRCS ../../oled/oled.c + ../../oled/connection.c + ../../oled/ssd1306/ssd1306.c + ../../oled/sh1106/sh1106.c + helpers/src/mock_i2c.c )