这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第四期-液体流量检测仪DIY】-点亮OLED显示中文

共2条 1/1 1 跳转至

【Let'sdo第四期-液体流量检测仪DIY】-点亮OLED显示中文

菜鸟
2025-01-21 00:23:38     打赏

这里用到的设备是,STM32 开发板 + SSD1315屏幕一块

image.png

image.png

这一块屏幕驱动是SSD1315,查询了相关资料以及一些其他的内容,驱动程序和SSD1306一模一样。

找了很多资料,因为后面有别的功能,由于本人基础知识不够扎实,也比较以来CubaMX来实现这些功能,并且配置GPIO部分的工作对于我来讲太过复杂,所以我这里使用了硬件i2c来完成驱动屏幕的工作。

引荐i2c又遇到了新问题,网上的资料很少,但是找了一圈,还是找到了。(可能对于熟悉STM32的工程师来讲,也或者是对于现在在写帖子的我来讲,这都不是困难,但是刚开始也确实是有点复杂)。

打开CubaMX软件,这个软件真的很方便,随便点两下就设置好了。 去掉了繁琐的配置过程(我不想花太多的时间去学习了,所以才这么说)

image.png

简单的i2c就配置好了。 

然后生成代码带KEIL里面,注意生成代码的时候

image.png

这里如果勾上了,出来的代码就是以功能展示的,如果没有,就是全部写在一起的。

当然这个看个人喜欢。

生成代码以后

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的驱动程序放进来

image.png

image.png

在main函数种引用。

那么你就可以很容易的显示中文了。 

比如我现在要显示的,你好EEPW

这里遇到一个中文取模的问题,需要使用到取模软件。 PCtoLCD2002

image.png

 

OLED_ShowCHinese(16,2,3,0); //反相显示汉字“你”

OLED_ShowCHinese(32,2,4,0); //反相显示汉字“好”

image.png

这里看一下

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 打包放在后面给大家参考

oled.zip






关键词: 第四     液体     流量     检测仪     点亮     板载     中文     ssd    

院士
2025-01-21 09:29:22     打赏
2楼

这个小屏看上去还是蛮精致的嘛


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]