From d517a825c688a35bb0d4441726fc42a2cef118ae Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Thu, 09 Oct 2025 00:25:54 +0800
Subject: [PATCH] OLED显示屏示例程序

---
 Core/Src/board/font_oled.h   |  334 +++++++++++++++++++++++++++
 Core/Src/main.c              |   32 +-
 Core/Src/board/i2c_bitbang.c |    4 
 Core/Src/board/hal_oled.h    |   52 ++++
 Core/Src/board/hal_oled.c    |  280 +++++++++++++++++++++++
 5 files changed, 685 insertions(+), 17 deletions(-)

diff --git a/Core/Src/board/font_oled.h b/Core/Src/board/font_oled.h
new file mode 100644
index 0000000..144b348
--- /dev/null
+++ b/Core/Src/board/font_oled.h
@@ -0,0 +1,334 @@
+/**********************************************************************
+*   Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com>
+*      Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292
+* Description: ISKBoard OLED font generated by PCtoLCD.exe
+*
+*   ChangeLog:
+*        Version    Date       Author            Description
+*        V1.0.0  2021.08.10  GuoWenxue      Release initial version
+***********************************************************************/
+#ifndef __FONT_OLED_H
+#define __FONT_OLED_H
+
+#include <stdint.h>
+
+/*+--------------------------------+
+ *|      ASCII font size 6x8       |
+ *+--------------------------------+*/
+
+static const uint8_t F6x8[][6] =
+{
+    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},// sp
+    {0x00, 0x00, 0x00, 0x2f, 0x00, 0x00},// !
+    {0x00, 0x00, 0x07, 0x00, 0x07, 0x00},// "
+    {0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14},// #
+    {0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12},// $
+    {0x00, 0x62, 0x64, 0x08, 0x13, 0x23},// %
+    {0x00, 0x36, 0x49, 0x55, 0x22, 0x50},// &
+    {0x00, 0x00, 0x05, 0x03, 0x00, 0x00},// '
+    {0x00, 0x00, 0x1c, 0x22, 0x41, 0x00},// (
+    {0x00, 0x00, 0x41, 0x22, 0x1c, 0x00},// )
+    {0x00, 0x14, 0x08, 0x3E, 0x08, 0x14},// *
+    {0x00, 0x08, 0x08, 0x3E, 0x08, 0x08},// +
+    {0x00, 0x00, 0x00, 0xA0, 0x60, 0x00},// ,
+    {0x00, 0x08, 0x08, 0x08, 0x08, 0x08},// -
+    {0x00, 0x00, 0x60, 0x60, 0x00, 0x00},// .
+    {0x00, 0x20, 0x10, 0x08, 0x04, 0x02},// /
+    {0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
+    {0x00, 0x00, 0x42, 0x7F, 0x40, 0x00},// 1
+    {0x00, 0x42, 0x61, 0x51, 0x49, 0x46},// 2
+    {0x00, 0x21, 0x41, 0x45, 0x4B, 0x31},// 3
+    {0x00, 0x18, 0x14, 0x12, 0x7F, 0x10},// 4
+    {0x00, 0x27, 0x45, 0x45, 0x45, 0x39},// 5
+    {0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
+    {0x00, 0x01, 0x71, 0x09, 0x05, 0x03},// 7
+    {0x00, 0x36, 0x49, 0x49, 0x49, 0x36},// 8
+    {0x00, 0x06, 0x49, 0x49, 0x29, 0x1E},// 9
+    {0x00, 0x00, 0x36, 0x36, 0x00, 0x00},// :
+    {0x00, 0x00, 0x56, 0x36, 0x00, 0x00},// ;
+    {0x00, 0x08, 0x14, 0x22, 0x41, 0x00},// <
+    {0x00, 0x14, 0x14, 0x14, 0x14, 0x14},// =
+    {0x00, 0x00, 0x41, 0x22, 0x14, 0x08},// >
+    {0x00, 0x02, 0x01, 0x51, 0x09, 0x06},// ?
+    {0x00, 0x32, 0x49, 0x59, 0x51, 0x3E},// @
+    {0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C},// A
+    {0x00, 0x7F, 0x49, 0x49, 0x49, 0x36},// B
+    {0x00, 0x3E, 0x41, 0x41, 0x41, 0x22},// C
+    {0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C},// D
+    {0x00, 0x7F, 0x49, 0x49, 0x49, 0x41},// E
+    {0x00, 0x7F, 0x09, 0x09, 0x09, 0x01},// F
+    {0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A},// G
+    {0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F},// H
+    {0x00, 0x00, 0x41, 0x7F, 0x41, 0x00},// I
+    {0x00, 0x20, 0x40, 0x41, 0x3F, 0x01},// J
+    {0x00, 0x7F, 0x08, 0x14, 0x22, 0x41},// K
+    {0x00, 0x7F, 0x40, 0x40, 0x40, 0x40},// L
+    {0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F},// M
+    {0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F},// N
+    {0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E},// O
+    {0x00, 0x7F, 0x09, 0x09, 0x09, 0x06},// P
+    {0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
+    {0x00, 0x7F, 0x09, 0x19, 0x29, 0x46},// R
+    {0x00, 0x46, 0x49, 0x49, 0x49, 0x31},// S
+    {0x00, 0x01, 0x01, 0x7F, 0x01, 0x01},// T
+    {0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F},// U
+    {0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F},// V
+    {0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F},// W
+    {0x00, 0x63, 0x14, 0x08, 0x14, 0x63},// X
+    {0x00, 0x07, 0x08, 0x70, 0x08, 0x07},// Y
+    {0x00, 0x61, 0x51, 0x49, 0x45, 0x43},// Z
+    {0x00, 0x00, 0x7F, 0x41, 0x41, 0x00},// [
+    {0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55},// 55
+    {0x00, 0x00, 0x41, 0x41, 0x7F, 0x00},// ]
+    {0x00, 0x04, 0x02, 0x01, 0x02, 0x04},// ^
+    {0x00, 0x40, 0x40, 0x40, 0x40, 0x40},// _
+    {0x00, 0x00, 0x01, 0x02, 0x04, 0x00},// '
+    {0x00, 0x20, 0x54, 0x54, 0x54, 0x78},// a
+    {0x00, 0x7F, 0x48, 0x44, 0x44, 0x38},// b
+    {0x00, 0x38, 0x44, 0x44, 0x44, 0x20},// c
+    {0x00, 0x38, 0x44, 0x44, 0x48, 0x7F},// d
+    {0x00, 0x38, 0x54, 0x54, 0x54, 0x18},// e
+    {0x00, 0x08, 0x7E, 0x09, 0x01, 0x02},// f
+    {0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C},// g
+    {0x00, 0x7F, 0x08, 0x04, 0x04, 0x78},// h
+    {0x00, 0x00, 0x44, 0x7D, 0x40, 0x00},// i
+    {0x00, 0x40, 0x80, 0x84, 0x7D, 0x00},// j
+    {0x00, 0x7F, 0x10, 0x28, 0x44, 0x00},// k
+    {0x00, 0x00, 0x41, 0x7F, 0x40, 0x00},// l
+    {0x00, 0x7C, 0x04, 0x18, 0x04, 0x78},// m
+    {0x00, 0x7C, 0x08, 0x04, 0x04, 0x78},// n
+    {0x00, 0x38, 0x44, 0x44, 0x44, 0x38},// o
+    {0x00, 0xFC, 0x24, 0x24, 0x24, 0x18},// p
+    {0x00, 0x18, 0x24, 0x24, 0x18, 0xFC},// q
+    {0x00, 0x7C, 0x08, 0x04, 0x04, 0x08},// r
+    {0x00, 0x48, 0x54, 0x54, 0x54, 0x20},// s
+    {0x00, 0x04, 0x3F, 0x44, 0x40, 0x20},// t
+    {0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C},// u
+    {0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C},// v
+    {0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C},// w
+    {0x00, 0x44, 0x28, 0x10, 0x28, 0x44},// x
+    {0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C},// y
+    {0x00, 0x44, 0x64, 0x54, 0x4C, 0x44},// z
+    {0x14, 0x14, 0x14, 0x14, 0x14, 0x14},// horiz lines
+};
+
+/*+--------------------------------+
+ *|      ASCII font size 8x16      |
+ *+--------------------------------+*/
+
+static const uint8_t F8X16[]=
+{
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//  0
+    0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
+    0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
+    0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
+    0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
+    0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
+    0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
+    0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
+    0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
+    0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
+    0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
+    0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
+    0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
+    0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
+    0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
+    0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
+    0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
+    0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
+    0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
+    0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
+    0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
+    0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
+    0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
+    0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
+    0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
+    0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
+    0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
+    0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
+    0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
+    0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
+    0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
+    0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
+    0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
+    0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
+    0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
+    0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
+    0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
+    0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
+    0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
+    0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
+    0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
+    0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
+    0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
+    0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
+    0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
+    0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
+    0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
+    0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
+    0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
+    0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
+    0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
+    0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
+    0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
+    0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
+    0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
+    0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
+    0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
+    0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
+    0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
+    0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
+    0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
+    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
+    0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
+    0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
+    0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
+    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
+    0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
+    0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
+    0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
+    0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
+    0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
+    0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
+    0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
+    0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
+    0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
+    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
+    0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
+    0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
+    0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
+    0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
+    0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
+    0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
+    0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
+    0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
+    0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
+    0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
+    0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
+    0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
+    0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
+    0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
+    0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
+};
+
+
+
+/*+--------------------------------+
+ *|      BMP Logo for 128x32       |
+ *+--------------------------------+*/
+
+/* lingyun-128x32.bmp 使用 PCtoLCD.exe 取模软件生成配置(图形模式): 阴码、列行式、逆向、十六进制数、C51格式  */
+
+static const uint8_t bmp_logo[] = {
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0xFF,0xFF,0x03,0x03,0x00,0x00,
+    0x00,0xFC,0xFE,0x87,0x03,0x03,0x87,0xFE,0xFC,0x00,0x03,0x03,0xFF,0xFF,0x03,0x03,
+    0x00,0x00,0xF8,0xF8,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x78,0x78,0x78,0x78,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0x78,0x78,0x78,
+    0xF8,0xF8,0xF8,0xF0,0xE0,0x80,0x00,0x00,0x00,0x80,0x80,0xE0,0xE0,0xF0,0xF0,0x78,
+    0x78,0x78,0x78,0x78,0x78,0xF0,0xF0,0xE0,0xE0,0xC0,0x80,0x00,0x00,0xF0,0xF0,0xF0,
+    0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0xF0,0xF0,
+    0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,
+    0xC0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF8,0xF8,0xFB,0xFB,0xF3,0xF3,0xE3,0xC3,0x00,0x03,
+    0x03,0x00,0x01,0x03,0x03,0x03,0x03,0x01,0x00,0x03,0x03,0x00,0x03,0x03,0x00,0x00,
+    0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,
+    0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x07,0x03,0x00,0x00,
+    0x00,0x00,0xE0,0xE0,0xE0,0xE0,0xE1,0xE3,0xE3,0xE3,0xE3,0xE0,0x00,0x1F,0x3F,0x7F,
+    0xFF,0xFC,0xF0,0xE0,0xF0,0xF0,0xF8,0xFF,0xFF,0xFF,0x3F,0x1F,0x00,0x00,0xFF,0xFF,
+    0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
+    0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x00,0x00,
+    0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x03,0x0F,0x1F,0x3F,0x7E,0x7C,0x78,0x70,
+    0x70,0x60,0x61,0x71,0x71,0x7F,0x7F,0x7F,0x3F,0x1F,0x07,0x03,0x00,0x00,0x00,0x00,
+    0x00,0x01,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,
+    0x3F,0x7F,0x7F,0x78,0x70,0x70,0x70,0x70,0x78,0x7F,0x3F,0x1F,0x0F,0x00,0x00,0x00,
+    0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+
+/*+--------------------------------+
+ *|    Chines Font 16x16 SongTi    |
+ *+--------------------------------+*/
+
+/* 汉字生成使用 PCtoLCD.exe(字符模式):宋体、16x16、阴码、列行式、逆向、十六进制数、C51格式  */
+
+/*  宋体 16X16:  凌云实验室 */
+
+#define HZK_LEN_LINGYUN         5
+static const uint8_t Hzk_LingYun[][32]=
+{
+    {0x00,0x02,0x0C,0xC0,0x00,0x20,0xA4,0x64,0xA4,0x3F,0x24,0x64,0xA4,0x20,0x20,0x00},
+    {0x02,0x02,0x7F,0x00,0x80,0x89,0x44,0x46,0x2B,0x12,0x2A,0x46,0x80,0x81,0x00,0x00},/*"凌",0*/
+
+    {0x40,0x40,0x42,0x42,0x42,0x42,0xC2,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x40,0x00},
+    {0x00,0x20,0x70,0x28,0x24,0x23,0x20,0x20,0x20,0x24,0x28,0x30,0xE0,0x00,0x00,0x00},/*"云",1*/
+
+    {0x10,0x0C,0x04,0x84,0x14,0x64,0x05,0x06,0xF4,0x04,0x04,0x04,0x04,0x14,0x0C,0x00},
+    {0x04,0x84,0x84,0x44,0x47,0x24,0x14,0x0C,0x07,0x0C,0x14,0x24,0x44,0x84,0x04,0x00},/*"实",2*/
+
+    {0x02,0xFA,0x82,0x82,0xFE,0x80,0x40,0x20,0x50,0x4C,0x43,0x4C,0x50,0x20,0x40,0x00},
+    {0x08,0x18,0x48,0x84,0x44,0x3F,0x40,0x44,0x58,0x41,0x4E,0x60,0x58,0x47,0x40,0x00},/*"验",3*/
+
+    {0x10,0x0C,0x24,0x24,0xA4,0x64,0x25,0x26,0x24,0x24,0xA4,0x24,0x24,0x14,0x0C,0x00},
+    {0x40,0x40,0x48,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x4B,0x48,0x40,0x40,0x00},/*"室",4*/
+};
+
+/* 宋体 16x16: 温度 */
+#define HZK_LEN_TEMP            2
+static const uint8_t Hzk_Temp[][32]=
+{
+    {0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},
+    {0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00},/*"温",0*/
+
+    {0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00},
+    {0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00},/*"度",1*/
+};
+
+/* 宋体 16x16: 湿度 */
+#define HZK_LEN_HUMD            2
+static const uint8_t Hzk_Humd[][32]=
+{
+    {0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},
+    {0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00},/*"湿",0*/
+
+    {0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00},
+    {0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00},/*"度",1*/
+};
+
+/* 宋体 16X16: 光强 */
+#define HZK_LEN_LIGHT            2
+static const uint8_t Hzk_Light[][32]=
+{
+    {0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,0x40,0xC0,0x50,0x48,0x46,0x40,0x40,0x00},
+    {0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00},/*"光",0*/
+
+    {0x02,0xE2,0x22,0x22,0x3E,0x00,0x80,0x9E,0x92,0x92,0xF2,0x92,0x92,0x9E,0x80,0x00},
+    {0x00,0x43,0x82,0x42,0x3E,0x40,0x47,0x44,0x44,0x44,0x7F,0x44,0x44,0x54,0xE7,0x00},/*"强",1*/
+};
+
+
+/* 宋体 16X16:  声音 */
+#define HZK_LEN_NOISY            2
+static const uint8_t Hzk_Noisy[][32]=
+{
+    {0x04,0x14,0xD4,0x54,0x54,0x54,0x54,0xDF,0x54,0x54,0x54,0x54,0xD4,0x14,0x04,0x00},
+    {0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x03,0x00,0x00,0x00},/*"声",0*/
+
+    {0x40,0x40,0x44,0x44,0x54,0x64,0x45,0x46,0x44,0x64,0x54,0x44,0x44,0x40,0x40,0x00},
+    {0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00},/*"音",1*/
+};
+
+#endif
diff --git a/Core/Src/board/hal_oled.c b/Core/Src/board/hal_oled.c
new file mode 100644
index 0000000..8f666d0
--- /dev/null
+++ b/Core/Src/board/hal_oled.c
@@ -0,0 +1,280 @@
+/**********************************************************************
+*   Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com>
+*      Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292
+* Description: ISKBoard OLED(N091-2832TSWFG02-H14, 128x32) driver
+*
+*   ChangeLog:
+*        Version    Date       Author            Description
+*        V1.0.0  2021.08.10  GuoWenxue      Release initial version
+***********************************************************************/
+
+#include "hal_oled.h"
+
+#define mdelay(ms) HAL_Delay(ms)
+
+enum
+{
+    OLED_CMD = 0,
+    OLED_DATA,
+};
+
+static void IIC_Write_Command(uint8_t command)
+{
+    /* Send I2C start signal */
+    I2C_StartCondition();
+
+    /* Send OLED I2C slave write address */
+    I2C_SendAddress(I2C_WR);
+
+    /* send command value */
+    I2C_WriteByte(0x00);
+    I2C_WriteByte(command);
+
+    /* Send I2C stop signal */
+    I2C_StopCondition();
+}
+
+static void IIC_Write_Data(uint8_t data)
+{
+    /* Send I2C start signal */
+    I2C_StartCondition();
+
+    /* Send OLED I2C slave write address */
+    I2C_SendAddress(I2C_WR);
+
+    /* send data value */
+    I2C_WriteByte(0x40);
+    I2C_WriteByte(data);
+
+    /* Send I2C stop signal */
+    I2C_StopCondition();
+}
+
+
+ /* OLED write a byte command data or command */
+void OLED_WR_Byte(uint8_t data, uint8_t type)
+{
+    if( OLED_CMD==type )
+    {
+        IIC_Write_Command(data);
+    }
+    else
+    {
+        IIC_Write_Data(data);
+    }
+}
+
+/*
+ *+-------------------------------------------------+
+ *|        OLED initial/control function API        |
+ *+-------------------------------------------------+
+ */
+
+/* Turn OLED display onʾ */
+void OLED_Display_On(void)
+{
+    OLED_WR_Byte(0X8D, OLED_CMD);  //SET DCDC command
+    OLED_WR_Byte(0X14, OLED_CMD);  //DCDC ON
+    OLED_WR_Byte(0XAF, OLED_CMD);  //DISPLAY ON
+}
+
+/* Turn OLED display off */
+void OLED_Display_Off(void)
+{
+    OLED_WR_Byte(0X8D, OLED_CMD);  //SET DCDC command
+    OLED_WR_Byte(0X10, OLED_CMD);  //DCDC OFF
+    OLED_WR_Byte(0XAE, OLED_CMD);  //DISPLAY OFF
+}
+
+/* Clear OLED, it will be black */
+void OLED_Clear(void)
+{
+    uint8_t   i, j;
+
+    /* update display */
+    for(i=0;i<8;i++)
+    {
+        OLED_WR_Byte (0xb0+i, OLED_CMD);    // set page address: 0~7
+        OLED_WR_Byte (0x00, OLED_CMD);      // set display address, column address lower bytes;ַ
+        OLED_WR_Byte (0x10, OLED_CMD);      // set display address, column address higher bytes;
+
+        for(j=0; j<128; j++)
+            OLED_WR_Byte(0, OLED_DATA);
+    }
+
+    OLED_Set_Pos(0, 0);
+}
+
+void OLED_On(void)
+{
+    uint8_t   i, j;
+
+    /* update display */
+    for(i=0; i<8; i++)
+    {
+        OLED_WR_Byte (0xb0+i, OLED_CMD);    // set page address: 0~7
+        OLED_WR_Byte (0x00, OLED_CMD);      // set display address, row address lower bytes;ַ
+        OLED_WR_Byte (0x10, OLED_CMD);      // set display address, row address higher bytes;
+
+        for(j=0; j<128; j++)
+            OLED_WR_Byte(1, OLED_DATA);
+    }
+}
+
+void OLED_Init(void)
+{
+    if( i2c_lock(OLED_CHIPADDR) )
+    {
+        return ;
+    }
+
+    mdelay(10);
+
+    OLED_WR_Byte(0xAE,OLED_CMD); // Disable
+
+    OLED_WR_Byte(0x40,OLED_CMD); //---set low column address
+    OLED_WR_Byte(0xB0,OLED_CMD); //---set high column address
+
+    OLED_WR_Byte(0xC8,OLED_CMD);
+
+    OLED_WR_Byte(0x81,OLED_CMD);
+    OLED_WR_Byte(0xff,OLED_CMD);
+
+    OLED_WR_Byte(0xa1,OLED_CMD);
+
+    OLED_WR_Byte(0xa6,OLED_CMD);
+
+    OLED_WR_Byte(0xa8,OLED_CMD);
+    OLED_WR_Byte(0x1f,OLED_CMD);
+
+    OLED_WR_Byte(0xd3,OLED_CMD);
+    OLED_WR_Byte(0x00,OLED_CMD);
+
+    OLED_WR_Byte(0xd5,OLED_CMD);
+    OLED_WR_Byte(0xf0,OLED_CMD);
+
+    OLED_WR_Byte(0xd9,OLED_CMD);
+    OLED_WR_Byte(0x22,OLED_CMD);
+
+    OLED_WR_Byte(0xda,OLED_CMD);
+    OLED_WR_Byte(0x02,OLED_CMD);
+
+    OLED_WR_Byte(0xdb,OLED_CMD);
+    OLED_WR_Byte(0x49,OLED_CMD);
+
+    OLED_WR_Byte(0x8d,OLED_CMD);
+    OLED_WR_Byte(0x14,OLED_CMD);
+
+    OLED_WR_Byte(0xaf,OLED_CMD);
+
+    OLED_Clear();
+}
+
+/*
+ *+-------------------------------------------------+
+ *|          OLED display function API              |
+ *+-------------------------------------------------+
+ */
+
+/* set OLED display position */
+void OLED_Set_Pos(uint8_t x, uint8_t y)
+{
+    OLED_WR_Byte(0xb0+y, OLED_CMD);
+    OLED_WR_Byte(((x&0xf0)>>4)|0x10, OLED_CMD);
+    OLED_WR_Byte((x&0x0f), OLED_CMD);
+}
+
+/* show a character on OLED as $Char_Size */
+void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t char_Size)
+{
+    uint8_t c=0,i=0;
+
+    c=chr-' ';  // get offset value
+
+    if( x>X_WIDTH-1 )
+    {
+        x=0;
+        y=y+2;
+    }
+
+    if(char_Size ==16)
+    {
+        OLED_Set_Pos(x,y);
+
+        for(i=0; i<8; i++)
+            OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
+
+        OLED_Set_Pos(x,y+1);
+
+        for(i=0;i<8;i++)
+            OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
+    }
+    else
+    {
+        OLED_Set_Pos(x,y);
+        for(i=0;i<6;i++)
+            OLED_WR_Byte(F6x8[c][i],OLED_DATA);
+    }
+}
+
+/* show a string on OLED  */
+void OLED_ShowString(uint8_t x, uint8_t y, char *chr, uint8_t font_size)
+{
+    uint8_t     j=0;
+
+    while( chr[j]!='\0' )
+    {
+        OLED_ShowChar(x, y, chr[j], font_size);
+
+        x+=8;
+
+        if(x>120)
+        {
+            x=0;
+            y+=2;
+        }
+
+        j++;
+    }
+}
+
+/* Show Chinese on OLED */
+void OLED_ShowChinese(const uint8_t (*Hzk)[32], uint8_t x, uint8_t y, uint8_t number)
+{
+    uint8_t         t,adder=0;
+
+    OLED_Set_Pos(x, y);
+    for(t=0;t<16;t++)
+    {
+        OLED_WR_Byte(Hzk[2*number][t],OLED_DATA);
+        adder+=1;
+    }
+
+    OLED_Set_Pos(x,y+1);
+    for(t=0;t<16;t++)
+    {
+        OLED_WR_Byte(Hzk[2*number+1][t],OLED_DATA);
+        adder+=1;
+    }
+}
+
+/* Show BMP images(32) on OLED, x: 0~127  y:0~7 */
+void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x_width, uint8_t y_width, const uint8_t *bmp)
+{
+    uint32_t        j=0;
+    uint8_t         x,y;
+
+    if( y_width%8==0 )
+        y = y_width/8;
+    else
+        y = y_width/8+1;
+
+    for(y=y0; y<y_width; y++)
+    {
+        OLED_Set_Pos(x0, y);
+        for(x=x0; x<x_width; x++)
+        {
+            OLED_WR_Byte(bmp[j++],OLED_DATA);
+        }
+    }
+}
diff --git a/Core/Src/board/hal_oled.h b/Core/Src/board/hal_oled.h
new file mode 100644
index 0000000..274260e
--- /dev/null
+++ b/Core/Src/board/hal_oled.h
@@ -0,0 +1,52 @@
+/**********************************************************************
+*   Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com>
+*      Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292
+* Description: ISKBoard OLED(N091-2832TSWFG02-H14, 128x32) driver
+*
+*   ChangeLog:
+*        Version    Date       Author            Description
+*        V1.0.0  2021.08.10  GuoWenxue      Release initial version
+***********************************************************************/
+
+#ifndef INC_HAL_OLED_H_
+#define INC_HAL_OLED_H_
+
+#include "stm32l4xx_hal.h"
+#include "i2c_bitbang.h"
+#include "font_oled.h"
+
+#define OLED_CHIPADDR              0x3C      /* OLED chip address */
+
+#define X_WIDTH                    128
+#define Y_WIDTH                    32
+
+#define OLED_FONT16                16
+#define OLED_FONT8                 8
+
+/*
+ *+-------------------------------------------------+
+ *|        OLED initial/control function API        |
+ *+-------------------------------------------------+
+ */
+void OLED_Init(void);
+void OLED_On(void);
+void OLED_Clear(void);
+void OLED_Display_On(void);
+void OLED_Display_Off(void);
+
+/*
+ *+-------------------------------------------------+
+ *|          OLED display function API              |
+ *+-------------------------------------------------+
+ */
+void OLED_Set_Pos(uint8_t x, uint8_t y);
+void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size);
+void OLED_ShowString(uint8_t x,uint8_t y, char *p,uint8_t font_size);
+
+/* Show Chinese on OLED */
+void OLED_ShowChinese(const uint8_t (*Hzk)[32], uint8_t x, uint8_t y, uint8_t number);
+
+/* Show BMP images(128x64) on OLED, x: 0~127  y:0~7 */
+void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, const uint8_t * bmp);
+
+#endif /* INC_HAL_OLED_H_ */
diff --git a/Core/Src/board/i2c_bitbang.c b/Core/Src/board/i2c_bitbang.c
index b2040cd..769eec6 100644
--- a/Core/Src/board/i2c_bitbang.c
+++ b/Core/Src/board/i2c_bitbang.c
@@ -21,7 +21,7 @@
  *+---------------------------------+
  */
 
-#define mdelay(x)       HAL_Delay(x)
+#define mdelay(ms) HAL_Delay(ms)
 
 enum
 {
@@ -32,7 +32,7 @@
 i2c_bus_t i2c_bus =
 {
  /* Addr        SCL_Pin               SDA_Pin      */
-    0x00,  {GPIOB, GPIO_PIN_6 }, {GPIOB, GPIO_PIN_7 },
+    0x00,  {GPIOB, GPIO_PIN_6 }, {GPIOB, GPIO_PIN_7 }, /* SHT20, RTC, OLED */
 };
 
 static inline void SDA_IN(void)
diff --git a/Core/Src/main.c b/Core/Src/main.c
index 3344439..5f8f55a 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -29,6 +29,7 @@
 #include "miscdev.h"
 #include "sht20.h"
 #include "w25q.h"
+#include "hal_oled.h"
 /* USER CODE END Includes */
 
 /* Private typedef -----------------------------------------------------------*/
@@ -71,8 +72,8 @@
 {
 
   /* USER CODE BEGIN 1 */
-  int      rv;
-  float    temperature, humidity;
+  int pos_x = 25;
+  int pos_y = 1;
   /* USER CODE END 1 */
 
   /* MCU Configuration--------------------------------------------------------*/
@@ -99,27 +100,28 @@
   MX_TIM1_Init();
   MX_SPI1_Init();
   /* USER CODE BEGIN 2 */
+
   beep_start(2, 300);
+  OLED_Init();
 
-  spinor_test();
-
-  do {} while(1);
   /* USER CODE END 2 */
 
   /* Infinite loop */
   /* USER CODE BEGIN WHILE */
   while (1)
   {
-	rv = sht20_sample_TrH(&temperature, &humidity);
-	if( rv )
-	{
-		printf("ERROR: SHT20 sample data failure, rv=%d\r\n", rv);
-	}
-	else
-	{
-		printf("SHT20 sample temperature: %.2f relative humidity: %.1f%%\r\n", temperature, humidity);
-	}
-	HAL_Delay(1000);
+    OLED_Clear();
+    OLED_ShowString(pos_x, pos_y, "ISKBoard", OLED_FONT16);
+    HAL_Delay(1000);
+
+    OLED_Clear();
+    for(int i=0; i<HZK_LEN_LINGYUN; i++)
+        OLED_ShowChinese(Hzk_LingYun, pos_x+i*16, pos_y, i);
+    HAL_Delay(1000);
+
+    OLED_Clear();
+    OLED_DrawBMP(0,0, X_WIDTH,Y_WIDTH/2, bmp_logo);
+    HAL_Delay(1000);
 
     /* USER CODE END WHILE */
 

--
Gitblit v1.9.1