oled使用 f4软件iic 数字 汉字 小图片 HAL库

基于江科大的oled标准库进行移植 到Hal库上

本人参考了许多大佬的源码 进行更改
由于F4和F1主频不一样 由于F4主频太高 在进行软件iic时需要延时一下 才可驱动oled 本人在网上找了一个开源的us延时函数 已经添加进入

文件分享
通过百度网盘分享的文件:delay,oled等2个文件
链接:https://pan.baidu.com/s/17W0AlXyCT9Zx64YfZzSLMg
提取码:30jg

1.移植全过程

先使用cubeMX创建一个HAL库的f4工程
f4zgt6 在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完成后生成工程
在cubemx生成的工程文件目录下面 在这里插入图片描述
Drivers 中新建一个文件夹 oled 和delay
在这里插入图片描述
把文件全部复制粘贴到对应的文件夹进去
在这里插入图片描述

在这里插入图片描述
打开keil
在这里插入图片描述

在这里插入图片描述
小方框新建目录 添加两个对应的文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
添加头文件的路径
将oled和delay的头文件路径添加进去
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
每个文件需要包含的文件如图所示
myiic中

//IIC软初始化
void iic_init(void)
{//GPIO结构体GPIO_InitTypeDef GPIO_InitType;//使能GPIOB__HAL_RCC_GPIOB_CLK_ENABLE();//配置GPIO(PB6对应SCL,配置成推挽输出)GPIO_InitType.Pin = GPIO_PIN_4;GPIO_InitType.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */GPIO_InitType.Pull = GPIO_PULLUP;    GPIO_InitType.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */HAL_GPIO_Init(GPIOB, &GPIO_InitType);    /* SCL *///配置GPIO(PB7对应SDA,配置成开漏输出)GPIO_InitType.Pin = GPIO_PIN_5;GPIO_InitType.Mode = GPIO_MODE_OUTPUT_OD;            /* 开漏输出 */GPIO_InitType.Pull = GPIO_PULLUP;    GPIO_InitType.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */HAL_GPIO_Init(GPIOB, &GPIO_InitType);    /* SDA */}
这里的iic引脚是PB4和PB5 如果需要修改可以进行引脚修改 改时钟 改引脚 

delay.h中

#ifndef __DELAY_H
#define __DELAY_H#include "main.h"
#define CPU_FREQUENCY_MHZ    168	// STM32时钟主频
void delay_us1(__IO uint32_t delay);#endif
对应着自己系列的主频进行修改 

主函数

#include "main.h"
#include "gpio.h"
#include "oled.h"记得添加这个头文件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();/* USER CODE BEGIN 2 */OLED_Init(); 初始化OLED_ShowChar(0,0,'B',OLED_8X16); 显示字符OLED_ShowChinese(0,16,"世界");显示汉字OLED_Update(); 更新oled/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

oled即可正常使用
注意 OLED_ShowChar(0,0,‘B’,OLED_8X16); 最后一个参数是oled 显示汉字数字的大小 字体的大小

2.显示中文

在红线上添加 --no-multibyte-chars在这里插入图片描述

首先需要在添加需要的汉字字模
取模软件的设置如图所示
在这里插入图片描述
注意对照
得到对应的字模后到 OLED_Data.c文件中的
const ChineseCell_t OLED_CF16x16[] 这个数组中添加字模

const ChineseCell_t OLED_CF16x16[] = {",",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,"。",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x24,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,"你",0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,"好",0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,"世",0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00,"界",0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00,"啊",0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00,"哈",0x00,0xFC,0x04,0x04,0xFC,0x20,0x50,0x48,0x44,0x43,0x44,0x48,0x50,0x20,0x20,0x00,0x00,0x0F,0x04,0x04,0x0F,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,/*0*//* (16 X 16 , 宋体 )*/"喽",0x00,0xFC,0x04,0x04,0xFC,0x00,0x90,0x52,0x34,0x10,0x7F,0x10,0x34,0x52,0x90,0x00,0x00,0x0F,0x04,0x04,0x0F,0x82,0x82,0x5A,0x56,0x23,0x22,0x52,0x4E,0x82,0x02,0x00,/*1*//* (16 X 16 , 宋体 )*/"大",0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00,/*2*//* (16 X 16 , 宋体 )*/"家",0x10,0x2C,0x24,0x24,0xA4,0xA4,0x65,0xA6,0x24,0x24,0x24,0x24,0xA4,0x34,0x0C,0x00,0x40,0x49,0x49,0x29,0x24,0x14,0x52,0x89,0x7F,0x04,0x0A,0x11,0x10,0x20,0x20,0x00,/*3*//* (16 X 16 , 宋体 )*/"不",0x00,0x02,0x02,0x02,0x02,0x82,0x42,0xF2,0x0E,0x42,0x82,0x02,0x02,0x02,0x00,0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x01,0x02,0x0C,0x00,0x00,/*4*//* (16 X 16 , 宋体 )*/"好",0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,/*5*//* (16 X 16 , 宋体 )*//*按照上面的格式,在这个位置加入新的汉字数据*///.../*未找到指定汉字时显示的默认图形(一个方框,内部一个问号),请确保其位于数组最末尾*/"",		0xFF,0x01,0x01,0x01,0x31,0x09,0x09,0x09,0x09,0x89,0x71,0x01,0x01,0x01,0x01,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x96,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,};

一定是要按照对应的格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397730.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次 .NET某智慧出行系统 CPU爆高分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他们的系统出现了CPU 100%的情况,让你帮忙看一下怎么回事?dump也拿到了,本想着这种情况让他多抓几个,既然有了就拿现有的分析吧。 二:WinDbg 分析…

socket回显服务器练习

前言 什么是回显服务器(echo server)呢? 回显服务器接收客户端发送的任何数据,并将这些数据原封不动地发送回客户端。回显服务器在连接成功的基础上只需要知道如何在客户端将收到的信息打印输出到控制台即可。我接下来会使用两种方法来输出,…

精通C++ STL(六):list的模拟实现

目录 类及其成员函数接口总览 结点类的模拟实现 构造函数 迭代器类的模拟实现 迭代器类存在的意义 迭代器类的模板参数说明 构造函数 运算符的重载 --运算符的重载 运算符的重载 !运算符的重载 *运算符的重载 ->运算符的重载 list的模拟实现 默认成员函数 构造函数 拷贝…

力扣 | 递增子序列 | 动态规划 | 最长递增子序列、最长递增子序列的个数、及其变式

文章目录 一、300. 最长递增子序列二、673. 最长递增子序列的个数三、变式1、646. 最长数对链2、1218. 最长定差子序列3、1027. 最长等差数列4、354. 俄罗斯套娃信封问题5、1964. 找出到每个位置为止最长的有效障碍赛跑路线 最长递增子序列:原序-递增数值问题 最长定…

无人机之陀螺仪篇

陀螺仪器最早是用于航海导航,但随着科学技术的发展,它在航空和航天事业中也得到广泛的应用。陀螺仪不仅可以作为指示仪表,而更重要的是它可以作为自动控制系统中的一个敏感元件,即可作为信号传感器。 根据需要,陀螺仪器…

使用字典优化命令行参数处理

在 Python 中,可以使用字典优化命令行参数的处理。特别是在处理多个选项或参数时,使用字典可以使代码更加简洁和易于维护。以下是一个使用 argparse 模块和字典来管理命令行参数的示例。 问题背景 在一个项目中,您需要根据用户通过命令行参数…

yolov5更换MobileNetV3的主干网络

目录 1.定义网络 2.将test_MobileNetV3.py上面的代码复制粘贴到如下文件里面 2.1复制需要更改的原来的网络如何改结构 3.更改yolo.py注册网络 1.定义网络 1. 宽度为0.5的YOLOV5网络的结构图 在主干网络上面可以重新定义成三层,编号从0开始 如图是MobileNetV3 的…

掌握7步网站设计流程,提升你的网站用户体验

在当代社会,网站制作已经成为不可或缺的一部分。随着互联网的发展,越来越多的人开始使用网站浏览器来获取信息、交流和消费。一个好的网站设计可以吸引用户的注意力,提高用户体验,从而提高用户的满意度和忠诚度。那么,…

网络剪枝——network-slimming 项目复现

目录 文章目录 目录网络剪枝——network-slimming 项目复现clone 存储库Baselinevgg训练结果 resnet训练结果 densenet训练结果 Sparsityvgg训练结果 resnet训练结果 densenet训练结果 Prunevgg命令结果 resnet命令结果 densenet命令结果 Fine-tunevgg训练结果 resnet训练结果 …

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——5.string

1.字符串相乘 . - 力扣(LeetCode) 思路: 1.如果两个串有一个首元素为‘0’,则直接返回‘0’ 2.设置两层循环,内层第一次循环 用于str插入初始数据 (num2 的各个元素和num1 的最后一个元素相乘的结果&#…

C代码做底层及Matlab_SimuLink做应用层设计单片机程序

前言:SimuLink工具极其强大,但是能直接支持单片机自主开发的很少,造成这个问题的原因主要是我们使用的芯片底层多是C代码工程,芯片厂家也只提供C代码库,很少能提供SimuLink的支持库,即使提供也不是很不完善,如NXP的一些芯片提供的SimuLink库不含盖高级应用,再比如意法半…

哈希表 - 快乐数

202. 快乐数 方法一:用哈希集合检测循环 /*** param {number} n* return {boolean}*/let getNext function(n) {return n.toString().split().map(i > i ** 2).reduce((a, b) > a b); }let isHappy function(n) {let seen new Set();while (n ! 1 &&…

什么是跨境电商独立站?为什么选择做独立站?

独立站在近两年被推上风口,很多人跟风涌入赛道,但并不知道做独立站的根本原因是什么?为什么跨境电商要做独立站? 今天分享这篇文章,希望能帮助正在建站或想要建站的朋友们建立起对独立站的基本认知,做到不踩…

【学习笔记】Matlab和python双语言的学习(图论最短路径)

文章目录 前言一、图论基本概念示例 二、代码实现----Matlab三、代码实现----python总结 前言 通过模型算法,熟练对Matlab和python的应用。 学习视频链接: https://www.bilibili.com/video/BV1EK41187QF?p36&vd_source67471d3a1b4f517b7a7964093e6…

Java线程模型

一、相关知识 用户级线程(ULT):实现在用户空间的线程称为用户级线程。用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由用户空间的库函数完成,不需要内核的参与,也不需要进行用…

FPGA之间数据传输的讨论:解析数据传输与同步技术

在现代电子工程领域,数据传输和同步技术是确保信息准确、高效传递的关键。FPGA间的高速数据传输是实现复杂系统功能的关键技术之一。本文将基于移知公开课《FPGA之间数据传输的讨论》的内容,探讨FPGA间数据传输的技术细节和面临的挑战,帮助读…

使用VS2022生成安装包

首先需要本地已经能够正常运行的软件包,包含可执行文件及必要的运行库等,如下所示RemoteCli.exe为最终的可执行文件 打开VS2022 ,选择 扩展–>管理扩展–>联机,搜索Microsoft Visual Studio Installer Projects,…

Lua调用c#

1. 类 --lua中使用C#的类非常简单 --固定套路 --CS.命名空间.类名 --Unity的类 比如 GameObject Transform等等 —— CS.UnityEngine.类名 --CS.UnityEngine.GameObject--通过C#中的类 实例化一个对象 lua中没有new 所以我们直接 类名括号就是实例化对象 --默认调用的 相当于就…

智能分析/视频汇聚EasyCVR安防视频融合管理云平台技术优势分析

安防行业的发展历程主要围绕视频监控技术的不断改革升级,从最初的模拟监控到数字监控,再到高清化、网络化监控,直至现在的智能化监控,每一次变革都推动了行业的快速发展。特别是近年来,随着AI、大数据、物联网等技术的…

LVS负载均衡(twenty-six day)

一、LVS (一)什么是LVS linux virtural server的简称,也就是linxu虚拟机服务器,这是一个由章文岩博士发起的开源项目,官网是http://www.linuxvirtualserver.org,现在lvs已经是linux内核标准的-部分,使用lv…