首页 > 其他分享 >stm32笔记[11]-驱动SSD1306屏幕

stm32笔记[11]-驱动SSD1306屏幕

时间:2024-01-15 20:35:20浏览次数:33  
标签:11 Write char Init stm32 OLED hi2c3 TYPE SSD1306

摘要

在蓝桥杯物联网的CT127C开发板上驱动SSD1306的0.91寸显示屏.

平台信息

  • Keil MDK-ARM (μVision) V5.35.0.0
  • STM32CubeMX 6.2.1

原理简介

CT127C开发板简介

蓝桥物联网竞赛实训装置省赛训练套装,适用于蓝桥杯大赛(电子类)物联网设 计与开发科目竞赛训练及高校日常教学实训环节。
省赛训练套装产品核心微控制器为 ST 公司的 STM32L071KBU,LoRa 收发器解决方案 为Semtech 公司SX1278芯片,硬件的设计意在帮助用户学习和评估STM32L0系列 微控制器的性能、微控制周边典型外设的驱动程序设计方法和 LoRa 无线通信解决 方案,硬件配置了简单的外设资源用于功能验证,设计了一个通用扩展接口,方便 扩展各类传感器和执行器。省赛训练套装板载 CMSIS-DAP Link 调试器和 USB 虚拟 串口,支持程序在线下载、仿真调试功能。

蓝桥杯(电子类)物联网设计与开发科目省赛训练套装由 2 个 LoRa 终端和 5 个传 感器模块(温度传感器、矩阵键盘、模拟电压输出、脉冲输出、光敏与红外热释电) 组成。各传感器模块可以直接安装在 LoRa 终端的通用接口上,用于学习和训练。

  • LoRa 终端
  • 设计基于 ARM Cortex M0+ 微控制器 STM32L071KBU,具有 128Kbytes Flash 存储器、6Kbyte EEPROM 存储器和 20Kbyte RAM 存储器,QFPN32 封装
  • 5V 电源供电,支持通过供电探针或 CMSIS DAP Link USB 接口供电
  • 0.91 寸 OLED 显示器
  • User & Reset 按键
  • 继电器: 2 路
  • 通用接口: 1 个
  • 大电流驱动接口: 2 个
  • User LED: 1 个
  • LoRa 单元: 1 个
  • 板载 USB 转串口功能,与微控制器 USART2 连接
  • 集成开发环境支持: Keil、IAR 和各类基于 GCC 的集成开发环境
  • 传感器模块
  • 温度传感器模块: I2C 接口,传感器型号: STS30-DIS-B
  • 模拟电压输出模块: 2 路连续可调电压输出,4 个 LED 指示灯
  • 矩阵键盘模块: 2 x 3 矩阵按键
  • 脉冲输出模块: 1 路模拟电压输出、1 路脉冲信号输出、2 个 LED 指示灯
  • 光敏与红外热释电模块: 1 路光敏电阻分压输出、1 路热释电传感器输出信号。
CT127C外观
CT127C原理图1 CT127C原理图2 CT127C原理图3

stm32l071简介

The ultra-low-power STM32L071xx are offered in 9 different package types from 32 pins to 100 pins. Depending on the device chosen, different sets of peripherals are included.

ARM Cortex M0+微控制器 STM32L071KBU,具有 128Kbytes Flash 存储器、6Kbyte EEPROM 存储器和 20Kbyte RAM 存储器,QFPN32 封装.

驱动显示屏

  • 芯片:SSD1306
  • 分辨率:128x32
  • 通信:I2C

实现

配置引脚

单个LoRa节点:

  • OLED_SCL:PA8(I2C3_SCL)
  • OLED_SDA:PB4(I2C3_SDA)
  • OLED_PWR:PB5(低电平有效)
配置引脚 配置时钟

核心代码

主要修改main.c,i2c.h,i2c.c和oled.c文件;
提示:i2c.c中的延时不能漏;

i2c.h

/* USER CODE BEGIN Prototypes */
extern I2C_HandleTypeDef hi2c3;
void OLED_Write(uint8_t ucType, uint8_t ucData);
/* USER CODE END Prototypes */

i2c.c

I2C_HandleTypeDef hi2c3;

/* I2C3 init function */
void MX_I2C3_Init(void)
{

  /* USER CODE BEGIN I2C3_Init 0 */

  /* USER CODE END I2C3_Init 0 */

  /* USER CODE BEGIN I2C3_Init 1 */

  /* USER CODE END I2C3_Init 1 */
  hi2c3.Instance = I2C3;
  hi2c3.Init.Timing = 0x00707CBB;
  hi2c3.Init.OwnAddress1 = 0;
  hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c3.Init.OwnAddress2 = 0;
  hi2c3.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c3) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Analogue filter
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Digital filter
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C3_Init 2 */
  HAL_Delay(100); // 延时以初始化完成
  /* USER CODE END I2C3_Init 2 */

}

oled.c

/*************************************************
Copyright (c)Guoxinchangtian Technologies Co., Ltd. 2008-2019. All rights reserved.
File name: oled.c
Author:      Version:   Date:2019.10.10
Description: 实现对LoRa模块的OLED显示屏的读写操作。
Others:
History:

1. Date:
Author:
Modification:
*************************************************/
#include "i2c.h"
#include "oled.h"
#include "font.h"
void OLED_Write(uint8_t type,uint8_t data)
{
	uint8_t pTx[2]={type,data};
	HAL_I2C_Master_Transmit(&hi2c3,0x78,pTx,2,10);
}
/* 设置位置(参考表3.6) */
void OLED_SetPos(unsigned char x, unsigned char y)
{
	OLED_Write(TYPE_COMMAND, x & 0x0f);
	OLED_Write(TYPE_COMMAND, 0x10 + ((x & 0xf0) >> 4));
	OLED_Write(TYPE_COMMAND, 0xB0 + y);
}
/* 清除屏幕 */
void OLED_Clear(void)
{
	unsigned char i, j;

	for(i = 0; i < 4; i++)
	{
		OLED_SetPos(0, i);
		for(j = 0; j < 128; j++)
			OLED_Write(TYPE_DATA, 0);
	}
}
/**
  * @brief OLED屏幕初始化。
  * @param None
  * @retval None
  */
void OLED_Init(void)
{
	OLED_Write(TYPE_COMMAND, 0xA1);	/* 段重映射, b0:0,0->0(复位值);1,0->127 */

	OLED_Write(TYPE_COMMAND, 0xA8);	/* 复用比 */
	OLED_Write(TYPE_COMMAND, 0x1F);	/* 0F~3F,16MUX~64MUX(复位值) */

	OLED_Write(TYPE_COMMAND, 0xC8);	/* COM扫描方向, b3:0,正常模式(复位值);b3:1,反转模式 */

	OLED_Write(TYPE_COMMAND, 0xDA);	/* COM引脚配置 */
	OLED_Write(TYPE_COMMAND, 0x00);	/* D4:0,顺序;1,交替(复位值) */

	OLED_Write(TYPE_COMMAND, 0x8D);	/* 充电泵 */
	OLED_Write(TYPE_COMMAND, 0x14);	/* D2:0,禁止(复位值);1,允许 */

	OLED_Clear();										/* 清除屏幕 */
	OLED_Write(TYPE_COMMAND, 0xAF);	/* 开启显示 */
}

/**
  * @brief OLED屏幕显示一个字符。
  * @param x 横向选择位置;
					 y 纵向选择位置;
					 chr 需要显示的字符;
					 size 需要显示的字符大小;
					 @arg 16,选择8*16点阵大小字符。其他均选择6*8点阵字符
  * @retval None
  */
void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char chr, unsigned char size)
{
    unsigned char  c, i;

  	c = chr - ' ';
    if(x > Max_Column - 1)
    {
        x = 0;
        y = y + 2;
    }
    if(size == 16)
    {
        OLED_SetPos(x, y);
        for(i = 0; i < 8; i++)
            OLED_Write(TYPE_DATA, g_F8X16[c * 16 + i]);
        OLED_SetPos(x, y + 1);
        for(i = 0; i < 8; i++)
            OLED_Write(TYPE_DATA, g_F8X16[c * 16 + i + 8]);
    }
    else
    {
        OLED_SetPos(x, y);
        for(i = 0; i < 6; i++)
        {
            OLED_Write(TYPE_DATA, g_F6x8[c][i]);
        }
    }
}

/**
  * @brief OLED屏幕显示一个字符串。
  * @param x 横向选择位置;
					 y 纵向选择位置;
					 chr 需要显示的字符串;
					 size 需要显示的字符大小;

  * @retval None
  */
void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *chr, unsigned char size)
{
    unsigned char j = 0;
	
    while(chr[j] != '\0')
    {
        OLED_ShowChar(x, y, chr[j], size);
        x += 8;
        if(x > 120)
        {
            x = 0;
            y += 2;
        }
				j++;
    }
}

main.c

#include "oled.h"
struct Time{
	uint8_t Hours;
	uint8_t Mins;
	uint8_t secs;
	uint8_t Subsecs;
}g_time={23,59,55}; // 时间
uint8_t g_oled_buf[17]; // 显示屏缓存
OLED_Init();
sprintf((char*)g_oled_buf,"%02d:%02d:%02d",g_time.Hours,g_time.Mins,g_time.secs);
OLED_ShowString(24,0,g_oled_buf,16);

编译&烧录后需要按一下RST键才能看到显示屏画面

效果

效果图

附录

第十四届蓝桥杯物联网选择题 第十四届蓝桥杯物联网编程题 第十四届蓝桥杯物联网编程题

标签:11,Write,char,Init,stm32,OLED,hi2c3,TYPE,SSD1306
From: https://www.cnblogs.com/qsbye/p/17966230

相关文章

  • 2024省选联测11
    A.Giao徽的烤鸭给定一棵树,边权为\(1\)。在第\(i\)家店办卡花费\(w_i\)元。对于任意一家店,如果Giao徽在到\(i\)的距离小于等于\(p\)的所有店办了卡,可得到\(v_p\)元的代金券。求最大利润。\(f_{u,i}\)表示在以\(u\)为根的子树中,到\(u\)距离小于等于\(i\)......
  • webpack,babel配置项目适配IE11
    package.json"browserslist":["ie11"] webpack.config.jsconstpath=require('path')consthtmlWebpackPlugin=require('html-webpack-plugin')const{CleanWebpackPlugin}=require('clean-webpack-......
  • STM32学习Day1
    一.所用型号二.STM32上所拥有的外设三.各个引脚的定义(查表)颜色引脚类型蓝色最小相关系统的引脚绿色I/O口和功能口的引脚红色电源相关的引脚类型:①S表示电源②I表示输入③O表示输出I/O口电平:I/O口能容忍的电压FT表示容忍5V,无FT则为3.3V主......
  • 独立开发者碎碎念 1115
    关于心态❤在巨大焦虑的心态下,人都来不及生病。我记忆中,高考前神经高度紧张,高考后一场大病如期而至。人啊,真复杂。心态啊,真正能做到面对任何事客观平常心的,有几个呢因此尽可能保持客观平常心面对,想到最糟糕的结局和处理方式吧关于目标......
  • 吴师兄学算法day07 11. 盛最多水的容器
    题目:11. 盛最多水的容器难点:如何确定,每次只移动最短边,因为无论移动哪边的柱子,下面的底部一定是缩短的,剩下的就是取决于高度。如果移动的是,两侧高的那个,整体的面积一定是缩小的。如果移动的是,两侧底的那个,后面的柱子有可能是遇到高的,也有可能是低的,所以,整体面积可能大,也可......
  • STM32CubeMX教程14 ADC - 多通道DMA转换
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)ST-LINK/V2驱动STM32CubeMX软件(Version6.10.0)keilµVision5IDE(MDK-Arm)CH340GWindows系统驱动程序(CH341SER.EXE)XCOMV2.6串口助手3个滑动变阻器2、实验目标使用STM32CubeMX软件配置STM32F407开发板的ADC实现ADC多......
  • P1145 约瑟夫
    题目链接:考虑使用循环链表来维护该环形数据结构。但下列代码只能通过70/100#include<bits/stdc++.h>usingnamespacestd;intne[50];intmain(){ intk,n,m; boolflag=true; cin>>k; n=2*k,m=k+1; for(inti=1;i<n;i++)ne[i]=i+1;......
  • 11.10
    《程序员的修炼之道:从小工到专家》的第三章节主要探讨了“技术深度与广度”的问题。这一章节强调了技术深度和广度对于程序员的重要性,以及如何在这两个方面取得平衡。首先,作者指出技术深度是程序员的核心竞争力。只有深入理解某个领域的技术,才能更好地解决相关问题。因此,程序员需......
  • 11.8
    《代码大全2》是一本非常经典的软件开发书籍。在书中,强调了比较优秀的代码结构和命名规范的重要性。书中注释的部分帮助我理解怎么去编写有意义的注释,合适的注释可以提供代码理解上的便利,但是过多或者无关的注释会干扰代码的可读性。还有书中关于代码复用和模块化的内容帮助学习......
  • 11.15
    语法说明如下:1)过程名存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即db_name.sp_name。需要注意的是,名称应当尽量避免选取与MySQL内置函数相同的名称,否则会发生错误。2)过程参数存储过程的参数列表。其中,<参数名......