一、前言

作为土木专业的本科生,在 STM32 的探索路上,我们已经完成了串口控制 LED、触摸按键点灯、按键交互等基础实战。这次我们将更进一步,解锁SSD1306 驱动 OLED 屏幕的核心技能 —— 这是嵌入式开发中最常用的显示方案,也是后续做数据可视化、人机交互的基础。

由于是非专业出身,我会尽量从硬件原理、代码实现到效果调试,全程手把手带你从零点亮 128×64 分辨率的 SSD1306 OLED 屏幕,哪怕是零基础也能跟着完成。

我担心我讲的不好,或者原理性的理解有问题,为了大家方便,特此在下方提供了其他专业博主的视频链接,若是有问题或者疑问的地方,也可以查看哦。链接如下:

keysking:【STM32入门教程-2025】第14集 如何在OLED屏幕上挥毫_哔哩哔哩_bilibili

高博士:[10-03]OLED屏工作原理简介_哔哩哔哩_bilibili

对上述两个视频链接中原理的讲解,我听的有点云里雾里的,哈哈,oled屏幕点亮是可以点亮的,毕竟有大佬做好了基础,我们把模块化的东西搬过来组合成我们自己的东西就好。

二、核心原理:SSD1306 OLED 屏幕是什么?

1. 核心参数与特性

  • 驱动芯片:SSD1306(OLED 屏幕的 “大脑”,负责控制每一个像素的亮灭)

  • 分辨率:主流为 128×64(128 列、64 行像素,总像素数 8192 个)

图片来自keysking的视频

  • 通信接口:支持I2C、SPI、并行,其中I2C 接口是最常用的方案(仅需 2 根信号线,接线简单)

  • 供电:3.3V(部分模块支持 5V,STM32 开发板直接用 3.3V 供电即可)

  • 优势:自发光、对比度高、视角广、功耗低,适合嵌入式低功耗场景

2. 工作原理

SSD1306 芯片内部自带显存(GRAM),我们只需要通过 I2C/SPI 向芯片发送指令和数据,芯片就会自动将显存内容刷新到屏幕上。

  • 指令:用于配置屏幕(初始化、开关显示、设置显示区域、对比度等)

  • 数据:对应屏幕上的像素点(1 个字节控制 8 个垂直像素,1 点亮,0 熄灭)

对于原理性的内容,可能有一些枯燥,甚至是不是很理解,大家只要知道到这个屏幕是由一个个点组成,那要实现屏幕出现我们想要的文字,是不是只要一些点组成文字就好了?那要怎么实现这些点亮起,组成这个文字的全部坐标,如下图蓝色的字母A,就是由一个个点组成。

图片来自高博士的视频

说了这么多,原理可能还是不理解,没有基础的确是有点难理解,哈哈,没关系,我在下面的实战中,会带领大家把大佬们已做好的驱动程序代码拿来拼装,不要害怕。

三、直接动手实战(硬核高能内容)

我们使用 STM32CubeIDE + HAL 库开发,全程用 HAL 库函数实现,避免了寄存器操作,降低上手难度。

1、打开STM32CubeIDE软件,选择stm32f103vet6芯片,新建项目:OLED_TEST

2、为防止f103芯片被锁芯片,修改sys的debug模式,如下图所示

3、通信方式选择i2c,为了可能数据量大,反应能够快一些,更改了速度为高速模式

4、rcc选择外部晶振的时钟,时钟树那里设置为72mhz,并单独生成i2c相应的.h和.c文件,如下图所示

5、点击菜单栏的齿轮,生成代码

生成代码以后的情况

6、利用大佬们已经编写好的驱动代码,将其移至到我们的项目中(重点)

可利用的驱动资源有两个,一个是keysking,另外一个是高博士的代码仓库。链接和截图如下:

keysking:波特律动LED字模生成器

高博士:3 例程_hal库_cubeide/1001I2C_OLED.zip · gaoyanzeng/drg_st_2_f103vet6 - 码云 - 开源中国

有挑战意愿或者兴趣的同学,可以尝试一些利用keysking的资料包,试一试看能不能让屏幕亮起来。我这里为了节约时间,我后续的操作采用了高博士的资料。

下载高博士的oled程序,将其中的三个文件导入或者复制粘贴到我们的项目文件中去。

在这里大家根据截图中的路径,看一下怎么找到这个三个驱动文件。

打开以后的oled_i2c.c代码如下:

/*
 * oled_i2c.c
 *
 *  Created on: May 16, 2024
 *      Author: QH
 */

/***
 ************************************************************************************************
 * 下面这一部分是注释代码是高博士的广告内容,大家复制使用的时候可以省略
 * @description
 *	实验平台:DRG GD-1 GD32F103C8T6
 *	Q群:366182133,Q群答疑团队随时为您提供技术支持
 *	B站:https://space.bilibili.com/486637340
 *	开发板购买:https://genbotter.taobao.com
 *	微信公众号:GenBotter

************************************************************************************************
 ***/
//从下面这里开始复制,复制以下的全部内容👇

#include "oled_i2c.h"
#include "oled_font.h"

I2C_HandleTypeDef *oled_i2c_handle = NULL; // oled的i2c句柄

/**
 * 初始化oled i2c句柄的函数
 */
void oled_set_i2c_handle(I2C_HandleTypeDef *hi2c_handle) {
	oled_i2c_handle = hi2c_handle;
}

/**
 * @brief i2c写指令
 * @unsigned char i2c_command 要写的指令内容
 */
void oled_write_command(unsigned char i2c_command) {
	if (oled_i2c_handle == NULL) {
		return;
	}
	uint8_t *pData;
	pData = &i2c_command;
	HAL_I2C_Mem_Write(oled_i2c_handle, OLED_I2C_ADDR, 0x00, I2C_MEMADD_SIZE_8BIT,
			pData, 1, 100);
}

/**
 * @brief i2c写数据
 * @unsigned char i2c_data 要写的数据内容
 */
void oled_write_data(unsigned char i2c_data) {
	if (oled_i2c_handle == NULL) {
		return;
	}
	uint8_t *pData;
	pData = &i2c_data;
	HAL_I2C_Mem_Write(oled_i2c_handle, OLED_I2C_ADDR, 0x40, I2C_MEMADD_SIZE_8BIT,
			pData, 1, 100);
}

/**
* 功能:
* 输入:无
**/
void oled_init(void){
	oled_write_command(0xAE);// 0xAE:关显示,0xAF:开显示

	oled_write_command(0x00);// 设置开始地址的低字节
	oled_write_command(0x10);// 设置开始地址的高字节

	oled_write_command(0xd5);// 命令头,设置显示时钟分频比/振荡器频率
	oled_write_command(0x80);// 设置分割比率,设置时钟为100帧/秒

	oled_write_command(0xa8);// 命令头,设置多路复用率(1 to 64)
	oled_write_command(0x3f);// --1/64 duty

	oled_write_command(0xd3);// 命令头,设置显示偏移移位映射RAM计数器(0x00~0x3F)
	oled_write_command(0x00);// 不偏移

	oled_write_command(0x00);// 写入页位置(0xB0~7)
	oled_write_command(0x40);// 显示开始线

	oled_write_command(0x8d);// VCC电源
	oled_write_command(0x14);// --set(0x10) disable

	oled_write_command(0xa1);// 设置段重新映射
	oled_write_command(0xc8);// 设置Y轴扫描方向,0xc0上下反置 ,0xc8正常(上边为0行)

	oled_write_command(0xda);// 命令头,--set com pins hardware configuration
	oled_write_command(0x12);

	oled_write_command(0x81);// 对比度,指令:0x81,数据:0~255(255最高)
	oled_write_command(0xff);

	oled_write_command(0xd9);// 命令头,--set pre-charge period
	oled_write_command(0xf1);// Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

	oled_write_command(0xdb);// 命令头,--set vcomh
	oled_write_command(0x30);// Set VCOM Deselect Level

	oled_write_command(0x20);// 水平寻址设置
	oled_write_command(0x00);

	oled_write_command(0xa4);// 0xa4:正常显示,0xa5:整体点亮
	oled_write_command(0xa6);// 0xa6:正常显示,0xa7:反色显示

	oled_write_command(0xAF);// 0xAE:关显示,0xAF:开显示
}

// OLED显示单一色度
void oled_fill(uint8_t fill_data){
	uint8_t i=0, n;
	for(i = 0; i < 8; i++){
		oled_write_command (0xB0+i);    //设置页地址(0~7)
		oled_write_command (0x00);      //设置显示位置—列低地址
		oled_write_command (0x10);      //设置显示位置—列高地址
		for(n = 0; n < 132; n++){
			oled_write_data(fill_data);
		}
	}
}

// OLED 白屏显示
void oled_display_white(void){
	oled_fill(0xFF);
}

// OLED 清屏显示
void oled_clear_all(void){

	oled_fill(0x00);
}

// OLED打开
void oled_on(){
	oled_write_command(0xAF);  // 开启显示
	oled_write_command(0x8D);  // 设置电荷泵
	oled_write_command(0x14);  // 开启电荷泵
}

// OLED关闭
void oled_off(){
	oled_write_command(0xAF);  // 开启显示
	oled_write_command(0x8D);  // 设置电荷泵
	oled_write_command(0x10);  // 关闭电荷泵
}

// OLED设置显示位置
void oled_set_pos(uint8_t x, uint8_t y){
	oled_write_command(0xB0 + y);
	oled_write_command((x & 0xf0) >> 4 | 0x10 );
	oled_write_command((x & 0x0f) | 0x01 );
}

// 显示中文汉字
void oled_show_chinese(uint8_t x, uint8_t y, uint8_t index){
	uint8_t i;
	oled_set_pos(x, y);
	for(i = 0; i < 16; i++){
		oled_write_data(Hzk[2*index][i]);
	}
	oled_set_pos(x, y+1);
	for(i = 0; i < 16; i++){
		oled_write_data(Hzk[2*index + 1][i]);
	}
}

// 显示char字符
void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t char_size){
	uint8_t c_index = 0, i = 0;

	c_index = chr - ' ';  // 获取chr在字模数组中的序号
	if(char_size == 16){
		if(x > MAX_COLUMN - 8){ //如果超出了屏幕的显示宽度,则换到下一行重新开始
			x = 0;
			y += 2;
		}
		oled_set_pos(x, y);
		for(i = 0; i < 8; i++){
			oled_write_data(F8X16[c_index*16 + i]);
		}
		oled_set_pos(x, y+1);
		for(i = 0; i < 8; i++){
			oled_write_data(F8X16[c_index*16 + i + 8]);
		}
	}else if(char_size == 8){
		if(x > MAX_COLUMN - 6){ //如果超出了屏幕的显示宽度,则换到下一行重新开始
			x = 0;
			y += 1;
		}
		oled_set_pos(x, y);
		for(i = 0; i < 6; i++){
			oled_write_data(F6x8[c_index][i]);
		}
	}else{
		oled_show_error(x, y, (uint8_t *)"wrong char_size setted.");
	}
}

// 显示字符串
void oled_show_string(uint8_t x, uint8_t y, uint8_t *str, uint8_t char_size){
	uint8_t i = 0;
	while(str[i] != '\0'){
		oled_show_char(x, y, str[i], char_size);
		if(char_size == 16){
			x += 8;
			if(x > MAX_COLUMN - 8){
				x = 0;
				y += 2;
			}
		}else if(char_size == 8){
			x += 6;
			if(x > MAX_COLUMN - 8){
				x = 0;
				y += 1;
			}
		}
		i++;
	}
}

// 在(x,y)处显示“error!”信息
void oled_show_error(uint8_t x, uint16_t y, uint8_t *err){
	oled_show_string(x, y, err, 16);
}

main.c代码如下:

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file           : main.c
 * @brief          : Main program body
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2024 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled_i2c.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
 * @brief  The application entry point.
 * @retval int
 */
int main(void) {

	/* USER CODE BEGIN 1 */

	/* USER CODE END 1 */

	/* MCU Configuration--------------------------------------------------------*/

	/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
	HAL_Init();

	/* USER CODE BEGIN Init */

	/* USER CODE END Init */

	/* Configure the system clock */
	SystemClock_Config();

	/* USER CODE BEGIN SysInit */

	/* USER CODE END SysInit */

	/* Initialize all configured peripherals */
	MX_GPIO_Init();
	MX_I2C1_Init();
/* USER CODE BEGIN 2 */
oled_set_i2c_handle(&hi2c1); //初始化OLED对应的I2C外设句柄
oled_init();
oled_clear_all();
oled_show_chinese(5, 0, 3); //显示汉字库中的第4个汉字,“嵌”
oled_show_chinese(22, 0, 4);//显示汉字库中的第5个汉字,“入”
oled_show_chinese(39, 0, 5);//显示汉字库中的第4个汉字,“式”
oled_show_string(5, 2, (uint8_t*) "NO KEY pressed.", 16);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1) {
	if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
		oled_show_string(5, 2, (uint8_t*) "Key A pressed.    ", 16);
	}
	if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET) {
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
		oled_show_string(5, 2, (uint8_t*) "Touch key pressed.", 16);
	}
	/* USER CODE END WHILE */

	/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}

/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void) {
	RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
	RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };

	/** Initializes the RCC Oscillators according to the specified parameters
	 * in the RCC_OscInitTypeDef structure.
	 */
	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
	RCC_OscInitStruct.HSIState = RCC_HSI_ON;
	RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
	if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
		Error_Handler();
	}

	/** Initializes the CPU, AHB and APB buses clocks
	 */
	RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
			| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
	RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
	RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
	RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
	RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

	if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
		Error_Handler();
	}
}

/**
 * @brief I2C1 Initialization Function
 * @param None
 * @retval None
 */
static void MX_I2C1_Init(void) {

	/* USER CODE BEGIN I2C1_Init 0 */

	/* USER CODE END I2C1_Init 0 */

	/* USER CODE BEGIN I2C1_Init 1 */

	/* USER CODE END I2C1_Init 1 */
	hi2c1.Instance = I2C1;
	hi2c1.Init.ClockSpeed = 100000;
	hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
	hi2c1.Init.OwnAddress1 = 0;
	hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
	hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
	hi2c1.Init.OwnAddress2 = 0;
	hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
	hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
	if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
		Error_Handler();
	}
	/* USER CODE BEGIN I2C1_Init 2 */

	/* USER CODE END I2C1_Init 2 */

}

/**
 * @brief GPIO Initialization Function
 * @param None
 * @retval None
 */
static void MX_GPIO_Init(void) {
	GPIO_InitTypeDef GPIO_InitStruct = { 0 };
	/* USER CODE BEGIN MX_GPIO_Init_1 */
	/* USER CODE END MX_GPIO_Init_1 */

	/* GPIO Ports Clock Enable */
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();

	/*Configure GPIO pin Output Level */
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_SET);

	/*Configure GPIO pins : PA0 PA1 */
	GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

	/*Configure GPIO pins : PB0 PB1 */
	GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

	/* USER CODE BEGIN MX_GPIO_Init_2 */
	/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
 * @brief  This function is executed in case of error occurrence.
 * @retval None
 */
void Error_Handler(void) {
	/* USER CODE BEGIN Error_Handler_Debug */
	/* User can add his own implementation to report the HAL error return state */
	__disable_irq();
	while (1) {
	}
	/* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

oled_font.h代码如下:

/*
 * oled_font.h
 *
 *  Created on: May 16, 2024
 *      Author: QH
 */

#ifndef BSP_INC_OLED_FONT_H_
#define BSP_INC_OLED_FONT_H_

//常用ASCII表中字符的显示点阵
//偏移量32
/************************************6*8的点阵************************************/
const unsigned char 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,// '\'
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
};

/****************************************8*16的点阵************************************/
const unsigned char 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
};

/*汉字库,16 X 16 , 宋体*/
//这一块代码是高博士板子给自己板子打广告使用时候的汉字,大家可以试着看看,后续可以再修改它

char Hzk[][16]={
{0x04,0x04,0x04,0x04,0xF4,0x94,0x95,0x96,0x94,0x94,0xF4,0x04,0x04,0x04,0x04,0x00},
{0x00,0xFE,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x82,0xFE,0x00,0x00},/*"高",0*/

{0x20,0x20,0xFF,0x20,0x24,0xF4,0x54,0x54,0x54,0xFF,0x54,0x55,0x56,0xF4,0x04,0x00},
{0x00,0x00,0xFF,0x00,0x08,0x0B,0x19,0x69,0x09,0x0B,0x49,0x89,0x7D,0x0B,0x08,0x00},/*"博",1*/

{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00},
{0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00},/*"士",2*/

{0x80,0x80,0xEE,0x88,0x88,0x88,0xE8,0x8F,0x08,0x88,0x78,0x48,0x4E,0x40,0xC0,0x00},
{0x00,0x00,0x7F,0x24,0x24,0x24,0x7F,0x00,0x81,0x40,0x30,0x0F,0x30,0x41,0x80,0x00},/*"嵌",3*/

{0x00,0x00,0x00,0x00,0x00,0x01,0xE2,0x1C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x80,0x00},/*"入",4*/

{0x10,0x10,0x90,0x90,0x90,0x90,0x90,0x10,0x10,0xFF,0x10,0x10,0x11,0x16,0x10,0x00},
{0x00,0x20,0x60,0x20,0x3F,0x10,0x10,0x10,0x00,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00},/*"式",5*/
};
#endif /* BSP_INC_OLED_FONT_H_ */

oled_i2c.h代码如下:

/*
 * oled.h
 *
 *  Created on: May 16, 2024
 *      Author: genbotter
 */
#ifndef BSP_INC_OLED_I2C_H_
#define BSP_INC_OLED_I2C_H_

#include "main.h"

#define OLED_I2C_ADDR      0x78
#define OLED_I2C_CMD_ADDR  0x00
#define OLED_I2C_DATA_ADDR 0x40

#define MAX_COLUMN 132

void oled_set_i2c_handle(I2C_HandleTypeDef *hi2c_handle);

void oled_write_command(uint8_t oled_cmd);  //写命令
void oled_write_data(uint8_t oled_data);    //写数据

void oled_init(void);

void oled_display_white(void);							// 白屏显示OLED
void oled_clear_all(void);								// 清屏显示OLED
void oled_fill(uint8_t fill_data);                      // 单一色度填充OLED

void oled_set_pos(uint8_t x, uint8_t y);                // 设置坐标
void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t char_size);    // 显示字符
void oled_show_string(uint8_t x, uint8_t y, uint8_t *str, uint8_t char_size); // 显示字符串

void oled_show_chinese(uint8_t x, uint8_t y, uint8_t index);                  // 显示中文

void oled_show_error(uint8_t x, uint16_t y, uint8_t *err);                    // 显示错误提示

#endif /* BSP_INC_OLED_I2C_H_ */

几个可以copy的内容拿到了,我们可以先试试,直接不修改他的代码,先成功让oled屏幕显示广告词,后续再修改内容,让它显示我们想要出现的汉字英文或者数字等等内容。

我这里是利用记事本打开main.c、oled_i2c.c、oled_font.h、oled_i2c.h

软件的设置还是和之前是一样的,在三、直接动手实战(硬核高能内容)这里的第5步,已经生成了初始的代码。

下面可以直接把下载过的驱动代码,直接拖入inc、src中去,下面中的图片是已经拖如了的。

另外的一个方法就是自己新建.c和.h文件。由于电脑按键截屏存在一定问题,我就用手机拍了一下怎么新建后文件。

同样的,可以新建.c文件

建完以后,如果不用拖入或者导入文件的方式,大家可以用记事本打开几个代码内容,复制粘贴代码也行。高博士的是在driver文件夹新建了(需要修改一下路径),我们也可以在core中新建,这样可以不用修改路径。

代码粘贴进去以后的情况

由于这部分有点多,也比较烦,我这个帖子结束以后,会陆续更新实验的视频,请大家静待哔哩哔哩作品更新。

不会c的小谢的个人空间-不会c的小谢个人主页-哔哩哔哩视频

7、点击小锤子编译代码无误后,烧录代码进单片机。

这个是下载高博士代码,复制它的东西显示的东西,那我们要怎么修改其中的内容,变成我们自己的呢?

8、利用取字模软件工具或者其他工具,修改代码,替换我们自己的东西。

比如我想在屏幕上面显示:hello 小谢 2026.4.6

在文章的前部分内容我们已经看到了相关取字模工具,大家需要把它下载过来,并且解压。

6 板上器件手册 · gaoyanzeng/drg_st_2_f103vet6 - 码云 - 开源中国

双击打开取字模软件pctolcd2002

这里需要对字模选项进行设置,不然中文会出现一定的问题

将取字模后的代码复制过来,替换掉原来的高博

重新烧录代码,便可以看到以下的情况。

有条件的同学可以尝试一下keysking的取字模工具,大佬可以在屏幕上将ikun展示出来哦

显示中文的这一部分内容略有点难度哦,大家可以好好地利用下ai工具辅助一下。

由于本人非科班出身,原理解释和理解上可能存在一定问题,请大家谅解哈。

有问题的小伙伴可以在评论区留言,或者是在后续的实践视频下留言评论。

学无止境,大家一块加油哦!!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐