From 53de825c4c4d8325c02341177f62ab84897eb5ee Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Sat, 25 Jul 2026 22:09:43 +0800
Subject: [PATCH] update vscode task.json and add stm32flash tools
---
ex2.i2c-bitbang/Board/oled_drv.h | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 163 insertions(+), 0 deletions(-)
diff --git a/ex2.i2c-bitbang/Board/oled_drv.h b/ex2.i2c-bitbang/Board/oled_drv.h
new file mode 100644
index 0000000..a152b21
--- /dev/null
+++ b/ex2.i2c-bitbang/Board/oled_drv.h
@@ -0,0 +1,163 @@
+/**********************************************************************
+ * 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) SSD1306 driver
+ *
+ * ChangeLog:
+ * Version Date Author Description
+ * V1.0.0 2021.08.10 GuoWenxue Release initial version
+ * V2.0.0 2026.04.29 Optimized GRAM buffered rendering
+ ***********************************************************************/
+
+/* SSD1306 OLED显示器内部按页(Page)组织数据:
+
+ 屏幕布局(128x32):
+ +------------------+
+ | Page 0 (0~7) | ← 8像素
+ +------------------+
+ | Page 1 (8~15) | ← 8像素
+ +------------------+
+ | Page 2 (16~23) | ← 8像素
+ +------------------+
+ | Page 3 (24~31) | ← 8像素
+ +------------------+
+
+ 字体大小说明:
+ +---------------+---------+-------+----------+-------------+
+ | FONT | 宽度 | 高度 | 占用页数 | Y坐标类型 |
+ +---------------+---------+-------+----------+-------------+
+ | FONT8(6x8) | 6像素 | 8像素 | 1页 | 页码(0~3) |
+ +---------------+---------+-------+----------+-------------+
+ | FONT16(8x16) | 8像素 | 16像素| 2页 | 页码(0~2) |
+ +---------------+---------+-------+----------+-------------+
+ | Chinese(16x16)| 16像素 | 16像素| 2页 | 页码(0~2) |
+ +---------------+---------+-------+----------+-------------+
+ */
+
+#ifndef __OLED_DRV_H
+#define __OLED_DRV_H
+
+#include "stm32l4xx_hal.h"
+#include "i2c_bitbang.h"
+
+/* OLED I2C 从设备地址 */
+#define OLED_I2C_ADDR 0x3C
+
+/* 屏幕物理尺寸 */
+#define X_WIDTH 128
+#define Y_WIDTH 32
+
+/* 字体大小选项 */
+#define OLED_FONT16 16 /* 8×16 像素字体 */
+#define OLED_FONT8 8 /* 6×8 像素字体 */
+
+/* SSD1306 页数(128×32 屏共 4 页,每页 8 行像素) */
+enum
+{
+ OLED_PAGE0, /* 第0个页,控制纵坐标从 0 开始 */
+ OLED_PAGE1, /* 第1个页,控制纵坐标从 8 开始 */
+ OLED_PAGE2, /* 第2个页,控制纵坐标从 16 开始 */
+ OLED_PAGE3, /* 第3个页,控制纵坐标从 24 开始 */
+ OLED_PAGES, /* 总共 4 个页 */
+};
+
+/* 根据 SSD1306 芯片 datasheet 说明定义控制流标记 */
+typedef enum
+{
+ OLED_CMD = 0x00, /* Co=0, D/C#=0 -> 后面跟着命令 */
+ OLED_DATA = 0x40, /* Co=0, D/C#=1 -> 后面跟着全数据流 */
+} oled_ctrl_t;
+
+/*
+ * =========================================================================
+ * 显示控制 API
+ * =========================================================================
+ */
+
+/**
+ * @brief 初始化 OLED 显示屏(包含寄存器流配置、本地 GRAM 格式化、以及首次总线强刷)
+ * @param bus: 绑定的 i2c-bitbang 物理总线句柄
+ */
+int OLED_Init(i2c_bus_t *bus);
+
+/**
+ * @brief 清空软件 GRAM 缓冲区(全黑), 需配合 OLED_Refresh() 使用。
+ */
+void OLED_Clear(void);
+
+/**
+ * @brief 点亮软件 GRAM 缓冲区中所有像素(全白), 需配合 OLED_Refresh() 使用。
+ */
+void OLED_On(void);
+
+/**
+ * @brief 开启 OLED 显示(打开内建 Charge Pump 倍压器 + 开启显示面板)
+ */
+void OLED_Display_On(void);
+
+/**
+ * @brief 关闭 OLED 显示(进入超低功耗硬件待机模式,显存内容保持不动)
+ */
+void OLED_Display_Off(void);
+
+/**
+ * @brief 将软件 GRAM 缓冲区一次性突发刷新到 OLED 硬件显存中
+ * 每页采用单次加锁机制,极大幅度压缩总线事务开销,给其他设备留足带宽。
+ */
+void OLED_Refresh(void);
+
+/*
+ * =========================================================================
+ * 绘制 API(写缓冲区,需配合 OLED_Refresh() 显示)
+ * =========================================================================
+ */
+
+/**
+ * @brief 在本地 GRAM 缓冲区中写入单个可打印 ASCII 字符
+ *
+ * @param x 列坐标 (0 ~ X_WIDTH-1)
+ * @param page 页坐标 (0 ~ OLED_PAGES-1)
+ * @param chr ASCII 可打印字符
+ * @param char_size OLED_FONT16 (占 2 页) 或 OLED_FONT8 (占 1 页)
+ */
+void OLED_ShowChar(uint8_t x, uint8_t page, char chr, uint8_t char_size);
+
+/**
+ * @brief 在本地 GRAM 缓冲区中写入 ASCII 字符串(到行尾自动换行)
+ *
+ * @param x 起始列 (0 ~ X_WIDTH-1)
+ * @param page 起始页 (0 ~ OLED_PAGES-1)
+ * @param str 以 '\0' 结尾的字符串指针(支持 const 静态字面量)
+ * @param font_size OLED_FONT16 或 OLED_FONT8
+ */
+void OLED_ShowString(uint8_t x, uint8_t page, const char *str, uint8_t font_size);
+
+/**
+ * @brief 在本地 GRAM 缓冲区中写入一个 16×16 的标准汉字
+ *
+ * @param Hzk 汉字字模二维数组只读指针(每个汉字 32 字节,分立上下两页)
+ * @param x 起始列 (0 ~ X_WIDTH-1)
+ * @param page 起始页 (0 ~ OLED_PAGES-1)
+ * @param index 目标汉字在点阵数组中的索引序号
+ */
+void OLED_ShowChinese(const uint8_t (*Hzk)[32], uint8_t x, uint8_t page, uint8_t index);
+
+/**
+ * @brief 在本地 GRAM 缓冲区中绘制单色二进制 BMP 图像
+ *
+ * @param x0 起始列 (0 ~ X_WIDTH-1)
+ * @param page0 起始页 (0 ~ OLED_PAGES-1)
+ * @param x_width 图像像素宽度
+ * @param y_width 图像像素高度(工程规范:必须为 8 的整数倍)
+ * @param bmp 单色点阵数组指针(列行式,逆向取模)
+ */
+void OLED_DrawBMP(uint8_t x0, uint8_t page0,
+ uint8_t x_width, uint8_t y_width,
+ const uint8_t *bmp);
+
+/**
+ * @brief OLED 驱动功能及综合演示函数(包含动态打字机、混排、全图爆破等)
+ */
+void oled_test_example(void);
+
+#endif /* __OLED_DRV_H */
--
Gitblit v1.10.0