这里用到的设备是,STM32 开发板 + SSD1315屏幕一块
这一块屏幕驱动是SSD1315,查询了相关资料以及一些其他的内容,驱动程序和SSD1306一模一样。
找了很多资料,因为后面有别的功能,由于本人基础知识不够扎实,也比较以来CubaMX来实现这些功能,并且配置GPIO部分的工作对于我来讲太过复杂,所以我这里使用了硬件i2c来完成驱动屏幕的工作。
引荐i2c又遇到了新问题,网上的资料很少,但是找了一圈,还是找到了。(可能对于熟悉STM32的工程师来讲,也或者是对于现在在写帖子的我来讲,这都不是困难,但是刚开始也确实是有点复杂)。
打开CubaMX软件,这个软件真的很方便,随便点两下就设置好了。 去掉了繁琐的配置过程(我不想花太多的时间去学习了,所以才这么说)
简单的i2c就配置好了。
然后生成代码带KEIL里面,注意生成代码的时候
这里如果勾上了,出来的代码就是以功能展示的,如果没有,就是全部写在一起的。
当然这个看个人喜欢。
生成代码以后
i2c.c就被配置的很简单,只需要把驱动移植进来,就可以展示中文了
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file i2c.c * @brief This file provides code for the configuration * of the I2C instances. ****************************************************************************** * @attention * * Copyright (c) 2025 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 "i2c.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ I2C_HandleTypeDef hi2c1; /* I2C1 init function */ 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 = 400000; 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 */ } void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(i2cHandle->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspInit 0 */ /* USER CODE END I2C1_MspInit 0 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2C1 GPIO Configuration PB8 ------> I2C1_SCL PB9 ------> I2C1_SDA */ GPIO_InitStruct.Pin = i2c1_Pin|i2c1B9_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); __HAL_AFIO_REMAP_I2C1_ENABLE(); /* I2C1 clock enable */ __HAL_RCC_I2C1_CLK_ENABLE(); /* USER CODE BEGIN I2C1_MspInit 1 */ /* USER CODE END I2C1_MspInit 1 */ } } void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) { if(i2cHandle->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspDeInit 0 */ /* USER CODE END I2C1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_I2C1_CLK_DISABLE(); /**I2C1 GPIO Configuration PB8 ------> I2C1_SCL PB9 ------> I2C1_SDA */ HAL_GPIO_DeInit(i2c1_GPIO_Port, i2c1_Pin); HAL_GPIO_DeInit(i2c1B9_GPIO_Port, i2c1B9_Pin); /* USER CODE BEGIN I2C1_MspDeInit 1 */ /* USER CODE END I2C1_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */
这部分是直接生成的内容。所以说,这都不用自己写代码,有了CubaMX
下一步把oled.c的驱动程序放进来
在main函数种引用。
那么你就可以很容易的显示中文了。
比如我现在要显示的,你好EEPW
这里遇到一个中文取模的问题,需要使用到取模软件。 PCtoLCD2002
OLED_ShowCHinese(16,2,3,0); //反相显示汉字“你”
OLED_ShowCHinese(32,2,4,0); //反相显示汉字“好”
这里看一下
OLED_ShowCHinese这个方法
/** * @function: void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no, uint8_t Color_Turn) * @description: 在OLED特定位置开始显示16X16汉字 * @param {uint8_t} x待显示的汉字起始横坐标x: 0~112,两列汉字之间需要间隔16 * @param {uint8_t} y待显示的汉字起始纵坐标 y: 0~6 , 两行汉字之间需要间隔2 * @param {uint8_t} no待显示的汉字编号 * @param {uint8_t} Color_Turn是否反相显示(1反相、0不反相) * @return {*} */ void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no, uint8_t Color_Turn) { uint8_t t=0; OLED_Set_Pos(x,y); for(t=0;t<16;t++) { if (Color_Turn) OLED_WR_DATA(~Hzk[2*no][t]); //显示汉字的上半部分 else OLED_WR_DATA(Hzk[2*no][t]); //显示汉字的上半部分 } OLED_Set_Pos(x,y+1); for(t=0;t<16;t++) { if (Color_Turn) OLED_WR_DATA(~Hzk[2*no+1][t]); //显示汉字的上半部分 else OLED_WR_DATA(Hzk[2*no+1][t]);//显示汉字的上半部分 } }
主要是将字模进行绘制。
到这里硬件i2c就做完了。
我把oled.h oled.c oledfont.c oledfont.h 打包放在后面给大家参考