|
@@ -10,10 +10,237 @@
|
|
|
#include "freertos/queue.h"
|
|
|
#include "freertos/task.h"
|
|
|
|
|
|
+#include "stdlib.h"
|
|
|
+#include "string.h"
|
|
|
+
|
|
|
#include "config.h"
|
|
|
|
|
|
#ifdef ENABLE_SSD1306
|
|
|
|
|
|
+const uint8_t font_width = 8;
|
|
|
+
|
|
|
+static uint8_t SSD1306_Buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8];
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ uint16_t CurrentX;
|
|
|
+ uint16_t CurrentY;
|
|
|
+ uint8_t Inverted;
|
|
|
+ uint8_t Initialized;
|
|
|
+} SSD1306_t;
|
|
|
+
|
|
|
+/* Private variable */
|
|
|
+static SSD1306_t SSD1306;
|
|
|
+
|
|
|
+const uint16_t Font_data_7x10 [] = {
|
|
|
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // sp
|
|
|
+0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000, // !
|
|
|
+0x2800, 0x2800, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // "
|
|
|
+0x2400, 0x2400, 0x7C00, 0x2400, 0x4800, 0x7C00, 0x4800, 0x4800, 0x0000, 0x0000, // #
|
|
|
+0x0C00, 0x1200, 0x1200, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // Deg C
|
|
|
+0x2000, 0x5400, 0x5800, 0x3000, 0x2800, 0x5400, 0x1400, 0x0800, 0x0000, 0x0000, // %
|
|
|
+0x1000, 0x2800, 0x2800, 0x1000, 0x3400, 0x4800, 0x4800, 0x3400, 0x0000, 0x0000, // &
|
|
|
+0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // '
|
|
|
+0x0800, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x0800, // (
|
|
|
+0x2000, 0x1000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x1000, 0x2000, // )
|
|
|
+0x1000, 0x3800, 0x1000, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // *
|
|
|
+0x0000, 0x0000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, // +
|
|
|
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, // ,
|
|
|
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0x0000, 0x0000, 0x0000, 0x0000, // -
|
|
|
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, // .
|
|
|
+0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, // /
|
|
|
+0x3800, 0x4400, 0x4400, 0x5400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 0
|
|
|
+0x1000, 0x3000, 0x5000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // 1
|
|
|
+0x3800, 0x4400, 0x4400, 0x0400, 0x0800, 0x1000, 0x2000, 0x7C00, 0x0000, 0x0000, // 2
|
|
|
+0x3800, 0x4400, 0x0400, 0x1800, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 3
|
|
|
+0x0800, 0x1800, 0x2800, 0x2800, 0x4800, 0x7C00, 0x0800, 0x0800, 0x0000, 0x0000, // 4
|
|
|
+0x7C00, 0x4000, 0x4000, 0x7800, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 5
|
|
|
+0x3800, 0x4400, 0x4000, 0x7800, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 6
|
|
|
+0x7C00, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, // 7
|
|
|
+0x3800, 0x4400, 0x4400, 0x3800, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 8
|
|
|
+0x3800, 0x4400, 0x4400, 0x4400, 0x3C00, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 9
|
|
|
+0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, // :
|
|
|
+0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, // ;
|
|
|
+0x0000, 0x0000, 0x0C00, 0x3000, 0x4000, 0x3000, 0x0C00, 0x0000, 0x0000, 0x0000, // <
|
|
|
+0x0000, 0x0000, 0x0000, 0x7C00, 0x0000, 0x7C00, 0x0000, 0x0000, 0x0000, 0x0000, // =
|
|
|
+0x0000, 0x0000, 0x6000, 0x1800, 0x0400, 0x1800, 0x6000, 0x0000, 0x0000, 0x0000, // >
|
|
|
+0x3800, 0x4400, 0x0400, 0x0800, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000, // ?
|
|
|
+0x3800, 0x4400, 0x4C00, 0x5400, 0x5C00, 0x4000, 0x4000, 0x3800, 0x0000, 0x0000, // @
|
|
|
+0x1000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7C00, 0x4400, 0x4400, 0x0000, 0x0000, // A
|
|
|
+0x7800, 0x4400, 0x4400, 0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x0000, 0x0000, // B
|
|
|
+0x3800, 0x4400, 0x4000, 0x4000, 0x4000, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // C
|
|
|
+0x7000, 0x4800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4800, 0x7000, 0x0000, 0x0000, // D
|
|
|
+0x7C00, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0000, 0x0000, // E
|
|
|
+0x7C00, 0x4000, 0x4000, 0x7800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // F
|
|
|
+0x3800, 0x4400, 0x4000, 0x4000, 0x5C00, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // G
|
|
|
+0x4400, 0x4400, 0x4400, 0x7C00, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // H
|
|
|
+0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3800, 0x0000, 0x0000, // I
|
|
|
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // J
|
|
|
+0x4400, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4800, 0x4400, 0x0000, 0x0000, // K
|
|
|
+0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0000, 0x0000, // L
|
|
|
+0x4400, 0x6C00, 0x6C00, 0x5400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // M
|
|
|
+0x4400, 0x6400, 0x6400, 0x5400, 0x5400, 0x4C00, 0x4C00, 0x4400, 0x0000, 0x0000, // N
|
|
|
+0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // O
|
|
|
+0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // P
|
|
|
+0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x5400, 0x3800, 0x0400, 0x0000, // Q
|
|
|
+0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x4800, 0x4800, 0x4400, 0x0000, 0x0000, // R
|
|
|
+0x3800, 0x4400, 0x4000, 0x3000, 0x0800, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // S
|
|
|
+0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // T
|
|
|
+0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // U
|
|
|
+0x4400, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x0000, 0x0000, // V
|
|
|
+0x4400, 0x4400, 0x5400, 0x5400, 0x5400, 0x6C00, 0x2800, 0x2800, 0x0000, 0x0000, // W
|
|
|
+0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, // X
|
|
|
+0x4400, 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // Y
|
|
|
+0x7C00, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x4000, 0x7C00, 0x0000, 0x0000, // Z
|
|
|
+0x1800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1800, // [
|
|
|
+0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000, /* \ */
|
|
|
+0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3000, // ]
|
|
|
+0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ^
|
|
|
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, // _
|
|
|
+0x2000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // `
|
|
|
+0x0000, 0x0000, 0x3800, 0x4400, 0x3C00, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // a
|
|
|
+0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x6400, 0x5800, 0x0000, 0x0000, // b
|
|
|
+0x0000, 0x0000, 0x3800, 0x4400, 0x4000, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // c
|
|
|
+0x0400, 0x0400, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // d
|
|
|
+0x0000, 0x0000, 0x3800, 0x4400, 0x7C00, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // e
|
|
|
+0x0C00, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // f
|
|
|
+0x0000, 0x0000, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0400, 0x7800, // g
|
|
|
+0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // h
|
|
|
+0x1000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // i
|
|
|
+0x1000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0xE000, // j
|
|
|
+0x4000, 0x4000, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x0000, 0x0000, // k
|
|
|
+0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // l
|
|
|
+0x0000, 0x0000, 0x7800, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x0000, 0x0000, // m
|
|
|
+0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // n
|
|
|
+0x0000, 0x0000, 0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // o
|
|
|
+0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x6400, 0x5800, 0x4000, 0x4000, // p
|
|
|
+0x0000, 0x0000, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0400, 0x0400, // q
|
|
|
+0x0000, 0x0000, 0x5800, 0x6400, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // r
|
|
|
+0x0000, 0x0000, 0x3800, 0x4400, 0x3000, 0x0800, 0x4400, 0x3800, 0x0000, 0x0000, // s
|
|
|
+0x2000, 0x2000, 0x7800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x0000, 0x0000, // t
|
|
|
+0x0000, 0x0000, 0x4400, 0x4400, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // u
|
|
|
+0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x0000, 0x0000, // v
|
|
|
+0x0000, 0x0000, 0x5400, 0x5400, 0x5400, 0x6C00, 0x2800, 0x2800, 0x0000, 0x0000, // w
|
|
|
+0x0000, 0x0000, 0x4400, 0x2800, 0x1000, 0x1000, 0x2800, 0x4400, 0x0000, 0x0000, // x
|
|
|
+0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x6000, // y
|
|
|
+0x0000, 0x0000, 0x7C00, 0x0800, 0x1000, 0x2000, 0x4000, 0x7C00, 0x0000, 0x0000, // z
|
|
|
+0x1800, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1800, // {
|
|
|
+0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, // |
|
|
|
+0x3000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x3000, // }
|
|
|
+0x0000, 0x0000, 0x0000, 0x7400, 0x4C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ~
|
|
|
+};
|
|
|
+
|
|
|
+FontDef_t Font_7x10 = {
|
|
|
+ 7,
|
|
|
+ 10,
|
|
|
+ Font_data_7x10
|
|
|
+};
|
|
|
+
|
|
|
+esp_err_t i2c_tx_cmd(const uint8_t *data, const uint8_t length) {
|
|
|
+ i2c_cmd_handle_t handle = i2c_cmd_link_create();
|
|
|
+ i2c_master_start(handle);
|
|
|
+ i2c_master_write_byte(handle, (SSD1306_OLED_ADDR << 1) | WRITE_BIT, ACK_CHECK_EN);
|
|
|
+ i2c_master_write_byte(handle, COMMAND_MODE, ACK_CHECK_EN);
|
|
|
+ i2c_master_write(handle, data, length, ACK_CHECK_EN);
|
|
|
+ i2c_master_stop(handle);
|
|
|
+ esp_err_t retVal = i2c_master_cmd_begin(I2C_MASTER_NUM, handle, 1000 / portTICK_RATE_MS);
|
|
|
+ i2c_cmd_link_delete(handle);
|
|
|
+ return retVal;
|
|
|
+}
|
|
|
+
|
|
|
+esp_err_t i2c_tx_data(const uint8_t *data, const uint8_t length) {
|
|
|
+ i2c_cmd_handle_t handle = i2c_cmd_link_create();
|
|
|
+ i2c_master_start(handle);
|
|
|
+ i2c_master_write_byte(handle, (SSD1306_OLED_ADDR << 1) | WRITE_BIT, ACK_CHECK_EN);
|
|
|
+ i2c_master_write_byte(handle, DATA_MODE, ACK_CHECK_EN);
|
|
|
+ i2c_master_write(handle, data, length, ACK_CHECK_EN);
|
|
|
+ i2c_master_stop(handle);
|
|
|
+ esp_err_t retVal = i2c_master_cmd_begin(I2C_MASTER_NUM, handle, 1000 / portTICK_RATE_MS);
|
|
|
+ i2c_cmd_link_delete(handle);
|
|
|
+ return retVal;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void SSD1306_DrawPixel(uint16_t x, uint16_t y, SSD1306_COLOR_t color) {
|
|
|
+ if (
|
|
|
+ x >= SSD1306_WIDTH ||
|
|
|
+ y >= SSD1306_HEIGHT
|
|
|
+ ) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (color == SSD1306_COLOR_WHITE) {
|
|
|
+ SSD1306_Buffer[x + (y / 8) * SSD1306_WIDTH] |= 1 << (y % 8);
|
|
|
+ } else {
|
|
|
+ SSD1306_Buffer[x + (y / 8) * SSD1306_WIDTH] &= ~(1 << (y % 8));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+char SSD1306_Putc(char ch, const FontDef_t* Font, SSD1306_COLOR_t color) {
|
|
|
+ uint32_t i, b, j;
|
|
|
+
|
|
|
+ /* Check available space in LCD */
|
|
|
+ if (
|
|
|
+ SSD1306_WIDTH <= (SSD1306.CurrentX + Font->FontWidth) ||
|
|
|
+ SSD1306_HEIGHT <= (SSD1306.CurrentY + Font->FontHeight)
|
|
|
+ ) {
|
|
|
+ /* Error */
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Go through font */
|
|
|
+ for (i = 0; i < Font->FontHeight; i++) {
|
|
|
+ b = Font->data[(ch - 32) * Font->FontHeight + i];
|
|
|
+ for (j = 0; j < Font->FontWidth; j++) {
|
|
|
+ if ((b << j) & 0x8000) {
|
|
|
+ SSD1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR_t) color);
|
|
|
+ } else {
|
|
|
+ SSD1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR_t)!color);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Increase pointer */
|
|
|
+ SSD1306.CurrentX += Font->FontWidth;
|
|
|
+
|
|
|
+ /* Return character written */
|
|
|
+ return ch;
|
|
|
+}
|
|
|
+
|
|
|
+char SSD1306_Puts(char* str, FontDef_t* Font, SSD1306_COLOR_t color) {
|
|
|
+ /* Write characters */
|
|
|
+ while (*str) {
|
|
|
+ /* Write character by character */
|
|
|
+ if (SSD1306_Putc(*str, Font, color) != *str) {
|
|
|
+ /* Return error */
|
|
|
+ return *str;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Increase string pointer */
|
|
|
+ str++;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Everything OK, zero should be returned */
|
|
|
+ return *str;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void SSD1306_UpdateScreen(void) {
|
|
|
+ uint8_t m;
|
|
|
+
|
|
|
+ for (m = 0; m < 8; m++) {
|
|
|
+ uint8_t configMsg[] = {
|
|
|
+ PAGE_START_ADDR+m, // set page range:
|
|
|
+ 0x00, // y / 8
|
|
|
+ 0x10, // y / 8
|
|
|
+ };
|
|
|
+ i2c_tx_cmd(configMsg, sizeof configMsg);
|
|
|
+ i2c_tx_data(&SSD1306_Buffer[SSD1306_WIDTH * m], SSD1306_WIDTH);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
esp_err_t oled_ssd1306_init() {
|
|
|
|
|
@@ -53,6 +280,8 @@ esp_err_t oled_ssd1306_init() {
|
|
|
i2c_master_write_byte(cmd, CONTRAST_CONTROL, ACK_CHECK_EN);
|
|
|
i2c_master_write_byte(cmd, 0x7F, ACK_CHECK_EN);
|
|
|
|
|
|
+ i2c_master_write_byte(cmd, DEACTIVATE_SCROLL, ACK_CHECK_EN);
|
|
|
+
|
|
|
// Disable entire display ON
|
|
|
i2c_master_write_byte(cmd, DISABLE_ENTIRE_DISPLAY, ACK_CHECK_EN);
|
|
|
|
|
@@ -76,6 +305,17 @@ esp_err_t oled_ssd1306_init() {
|
|
|
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
|
|
|
i2c_cmd_link_delete(cmd);
|
|
|
|
|
|
+ SSD1306.CurrentX = 30;
|
|
|
+ SSD1306.CurrentY = 10;
|
|
|
+
|
|
|
+ SSD1306.Initialized = 1;
|
|
|
+
|
|
|
+ SSD1306_Putc('A',&Font_7x10,SSD1306_COLOR_WHITE);
|
|
|
+ SSD1306_DrawPixel(50,40, SSD1306_COLOR_WHITE);
|
|
|
+ SSD1306_Putc('X',&Font_7x10,SSD1306_COLOR_WHITE);
|
|
|
+ SSD1306_Puts(" THOMAS WAS\nHERE", &Font_7x10,SSD1306_COLOR_WHITE);
|
|
|
+ SSD1306_UpdateScreen();
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|