STM32 OLED_I2C动态显示 float类型(浮点型)数据

STM32江科大的oled驱动代码添加显示浮点数 最近想要用oled显示屏显示一些数据,其中有浮点数据要显示,用的是0.96OLED iic接口的四针。其中驱动代码是江科大(B站做STM32教学的)的,个人认为比较美观和实用,但是没有float类型的显示,虽然也可以放大成整数显示,但还是不够美观,所以自己写了一个函数。这个是函数,只要添加在OLED.c中然后在OLED.h中包含这个头文件就可以使用,具体原理是将浮点数转成整数,然后根据要显示的小数位数显示小数点。* @param Length 要显示数字的长度,范围:1~10。当然显示负数也是可以的。 阅读详情
AI摘要

本文详细介绍了在STM32项目中如何使用OLED显示器正确显示浮点数,通过解决数据类型转换和显示位数不准确的问题,实现动态显示浮点数。博主分享了从遇到问题到找到解决方案的过程,最终采用sprintf函数结合字符串显示函数实现了浮点数的灵活显示。代码示例展示了如何在定时器中断服务函数中更新浮点数并显示。

引 言

自己在做项目的过程中需要使用一个很小的显示屏来实时显示一组来自传感器的数据,然而当我选定了OLED,并且信心满满地写好所有驱动程序第一次上电测试时,却发现怎么都显示不了小数,什么情况?于是习惯性地打开了优快云,搜索STM32 OLED 显示浮点数,但是~,试了好几种方法,都不怎么好用,不是显示位数不准确,就是补一大堆0。总而言之,都是通过数据类型转换来实现的。本着学习是我快乐的心态,我还真得到了精华,So 那就自己动手写一个函数来实现。

实验准备

看自己手上有的,不一定要和笔者一样,看具体情况而定。

  • STM32F103X开发板
  • 中景园0.96寸OLED_I2C
  • 软件环境 :keil_v5 MDK
  • 引脚定义,具体参考oled.h :
    SCL —PA0 ;SDA —PA1

    OLED_IIC-C8T6演示视频

第一版 引子程序

  • 关键函数 sprintf(Data,“%.3f”,Fnum);
  • 相关头文件 #include “stdio.h”
  • 说明:将一个格式化的Fnum 打印到一个字符数组Data中(或字符串中(string))

这里先看看有缺陷的写法,不建议直接使用;问题是当后续传入参数长度发生变化时,不能灵活地对应显示到OLED上,也就是会造成小数点后位数被挤掉的问题发生,有能力者自行试验 。

/******************有缺陷,不会自动处理位数变化*******************
 * void OLED_ShowFNum()  显示任意浮点数,参考中景园OLED_ShowNum()函数
 * x , y :  起点坐标	 
 * Fnum  :  要显示的浮点数
 * size1 :  字体大小	 		
 * mode  :  0,反色显示;1,正常显示
 ***************************************************************/
void OLED_ShowFNum(u8 x,u8 y,float Fnum,u8 size1,u8 mode)
{
	unsigned int i,flen;
	unsigned char Data[sizeof(Fnum)];                //数据位数由sizeof(Fnum) 来判断,灵活创建数组大小 
    sprintf(Data,"%.3f",Fnum);                       //保留小数点后3位小数,打印到Data数组中
	flen = sizeof(Data)+1;							 //判断浮点数长度,方便后期打印输出 
//	  printf("转后:%c",*Data);                       //测试用
	for(i=0;i<flen;i++){							 //根据转后字符长度打印输出
		  x+=8;																		        //每个字符占8位,向后占位
		  OLED_ShowChar(x,y,Data[i],size1,mode);     //调用oled字符显示函数,在OLED屏上逐个显示          
		}
}

最终程序

下面时最终的解决方案,若有问题 还望大佬指正

通过前面的折腾,发现转来转去,根本原因时数据类型问题,于是乎在开始参数传进来的地方想办法,发现sprintf()函数的强大已足够,不需要再做多余的数据格式转换了,至于显示有问题还是自己太菜了,这里利用字符串显示函数 :

void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);

那我为什么还要用字符显示函数呢, 直接调用不就完了 ;参考整数显示方法,通过调用字符串显示函数,实现最终目标!

  • 打开oled.h文件,添加函数声明,在oled.c文件中添加如下片段:
/****************************************************************
 * void OLED_ShowFNum()  显示任意浮点数,参考中景园OLED_ShowNum()函数
 * x , y :  起点坐标	 
 * Fnum  :  要显示的浮点数
 * size1 :  字体大小	 		
 * mode  :  0,反色显示;1,正常显示
 * @作 者 :  Guard_Byte
 ***************************************************************/
void OLED_ShowFNum(u8 x,u8 y,float Fnum,u8 size1,u8 mode)
{
	uint8_t Data[]= " ";                             //创建目标数组,用来存放转换后的字符数据 
    sprintf(Data,"%.3f",Fnum);                       //保留小数点后3位小数,打印到Data数组中
	OLED_ShowString(x,y,Data,size1,mode);            //调用OLED字符串显示函数,在OLED屏上显示
}

  • timer.c文件,num变化部分,有人说直接放while里不显示,但我就是这么干的,这里把视频中浮点数变化的部分也贴出来:
/* 这里只看浮点数自增片段 */
float num = 0.00;
    //TIM3的中断服务函数
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)      //在STM32中RESET=0,SET=!RESET
	 {
		 LED1=!LED1;
		 if(num <100000)  num+=0.501;
				else num = 0.00;         //清零
		 printf("定时器中断!\r\n");
		 
		 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   //清除TIM3更新中断标志
	 }
}

主程序

  • main.c文件
/************************************************
 * 在定时器实验基础上
 * 增加IIC OLED动态浮点数显示
 * STM32F103C8T6核心板
 * @ 作 者 :Guard_Byte
************************************************/
#include "sys.h"
#include "delay.h"
#include "usart1.h"
//#include "exti.h"
#include "oled.h"
#include "led.h"
#include "timer.h"

 int main(void)
 {	
 	  char txt[32];
	  extern float num ;                 //在定时器3中 每隔一秒加一次
	  delay_init();
	  OLED_Init();
	  OLED_ColorTurn(0);                 //0正常显示,1 反色显示
      OLED_DisplayTurn(0);               //0正常显示 1 屏幕翻转显示	 
	 
      NVIC_Group2;                       //设置NVIC中断分组2;2位抢占优先级,2位响应优先级
	  USART1_Init(115200);	             //串口1初始化为115200
	  TIM3_Inits(9999,7199);             //通用定时器3初始化,参数1:预装载值;参数2:预分频系数值
//	  EXTIX_Init();                      //外部中断初始化
	  delay_init();                      
   	  LED_Init();			                    //LED端口初始化
	  LED1=1;
	  OLED_ShowString(26,0,"FS-TAST",16,1);     //固定位置不变
	  while(1)
	{                    
//		 OLED_ShowNum(0,24,num,5,16,1);     	//显示位置,内容,数字位数,格式大小  
		 OLED_ShowFNum(24,34,num,16,1);     	//调用显示函数  浮点型数据测试
		 //方式二:直接转字符显示,其实原理一样
		 //sprintf(txt,"%.3f",Fnum);           //保留小数点后3位小数,打印到Data数组中
		 //OLED_ShowString(24,34,txt,16,1);    //调用OLED字符串显示函数,在OLED屏上显示
		 OLED_Refresh();                     //将上面的内容更新到OLED显存,刷新屏幕
	     delay_ms(1000);				 //1s刷新一次显示数据
//       OLED_Clear();		             //清屏函数,注意若要清屏,必须加入延时,否则还没看到就清掉了
	}	
}

最终效果

【arduino】(u8g2最基础使用)mega2560 使用SH1106 OLED显示字符串,整数,浮点数,中文 . . 参考:【u8g2库字体问题:修改字体+中文字体支持-哔哩哔哩】 下载安装库: 打开arduino库管理 u8g2,找到u8g2,点击安装 查看例程: 选择对应型号的驱动,将注释去掉,我用的是SH1106,这里的接线需要接默认的才可以 下面个人的例子会讲到如何设置自己的接线 个人例子:显示字符串,数字,中文。 #include <Arduino.h> #include <U8g2lib.h> #include <Wire.h... 阅读详情

相关推荐

第七章 OLED+DHT11+STM32动态显示温湿度

上一章给大家介绍了OLED显示模块的使用,但上一章我们在OLED上显示的是静态的,不会变动的,所以这一章我结合第一章介绍的DHT11温湿度模块,实现温湿度数值OLED显示模块上动态变化,其实也是非常简单。...............

qq_44645742的博客 1万+

初次尝试vue脚手架

1、第一步首先安装NodeJs ,从nodejs 官网去down,然后安装 安装完成后,我安装了GIT 自己从官网去下载进行安装 2、检查安装是否成功,windows+r -> cmd,输入node -v 进行查看 3、基于Node.js 安装cnpm 走淘宝镜像   npm install -g cnpm --registry=https://registry.np...

138

[STM32]HAL STM32F103 软件I2C读写MPU6050(附DMP库移植)

本文介绍了如何在STM32F103C8T6上通过I2C协议与MPU6050传感器通信并实现DMP功能。首先,使用STM32CubeMX配置项目,设置时钟和I2C接口。然后,编写软件I2C协议的读写函数与MPU6050交互。接着,移植DMP库并进行必要修改,获取加速度计和陀螺仪数据,并将其转换为欧拉角显示在OLED上。最后,利用Keil的逻辑分析仪监测I2C时序。

m0_56841583的博客 2321

oled怎么显示浮点小数_单片机显示浮点型数据

在使用单片机显示浮点型数据时,因为要显示小数点,有时还要显示负号,而且整数部分位数还经常是不确定的。这时我们就需要一种有效快捷的显示方法。如下:#include "stdarg.h" void OLED_ShowFNum(u8 x,u8 y,char *str,...) //显示浮点数 { char buf[10]; va_list ptr; //用于获取不确定个数的参数 ...

weixin_35672450的博客 4376

Proteus中OLED12864I2C仿真黑屏?STM32CubeMX配置避坑指南

本文详细解析了Proteus中OLED12864I2C仿真黑屏问题的解决方案,涵盖STM32CubeMX配置、I2C通信调试和Proteus仿真优化。通过硬件参数调整、软件代码修改和仿真技巧,帮助开发者快速定位并解决黑屏问题,提升仿真效率。

weixin_42696271的博客 600

STM32软件模拟I2C驱动OLED屏:从时序到显存缓冲区的完整实现

在嵌入式系统开发中,I2C通信协议作为一种简单高效的双线串行总线,广泛应用于连接微控制器与各类传感器、存储器及显示模块。其工作原理基于主从架构,通过起始/停止信号、地址帧和数据帧实现设备间通信。软件模拟I2C技术,即利用通用GPIO口通过延时控制来模拟其时序,虽牺牲了部分速度,却换来了极佳的代码可移植性和调试可控性,尤其适合在早期STM32等MCU上规避硬件I2C外设的潜在稳定性问题。这项技术的核心价值在于,它让开发者能够以最基础的GPIO操作,灵活驱动如OLED显示屏这类低速外设,是掌握嵌入式底层通信和显

weixin_34014555的博客 422

STM32 OLED屏幕SSD1306显示浮点 负数

网上没有找到现成的根据别人写的改编了一个。你的库里没有mode的可以删除。

dnxyn的博客 2500

STM32 HAL I2C 驱动 SSD1306 OLED:CubeMX 配置 3 步与 128x64 图形库移植

本文详细介绍了如何使用STM32 HAL库通过I2C接口驱动SSD1306 OLED显示屏,包括CubeMX配置的3个关键步骤和128x64图形库的移植方法。内容涵盖硬件选型、开发环境搭建、I2C外设配置、开源驱动库整合以及高级图形功能实现,帮助开发者快速构建嵌入式显示界面。特别适合需要实现OLED显示的STM32开发者参考。

weixin_33901926的博客 419

stm32开发-用OLED屏显示float类型的数据

float D1; char Data[2]; int main(void) { D1 = 3.12456; sprintf(Data,"%.2f",D1); //保留小数点后2位小数,打印到Data数组中 OLED_ShowString(36,3,Data,16);//调用oled函数,在OLED屏上显示 } //oled函数文件参考自中景园oled显示程序( IIC通信) 使用sprintf函数需要在Keil魔术棒选项卡里勾选Use MicroLib。 ...

My blog. 4598

STM32驱动SSD1306 OLED屏幕全攻略

OLED显示屏作为自发光器件,凭借高对比度和低功耗特性在嵌入式系统中广泛应用。I2C/SPI接口的SSD1306驱动芯片通过内部GRAM管理像素数据,采用1bit对应1像素的存储机制。在STM32开发中,通过CubeMX配置I2C硬件参数并实现底层通信协议,可完成屏幕初始化、显存更新等核心功能。针对嵌入式场景的特殊需求,需要掌握部分刷新、双缓冲等优化技术,并解决电平转换、上拉电阻等硬件设计问题。该方案适用于智能穿戴设备、工业HMI等需要小型化显示的场合,特别是基于STM32F103等常用MCU的物联网终端。

dixi7825的博客 437

STM32 HAL库驱动SSD1306 OLED:I2C与SPI 2种方案代码实测与移植指南

本文详细解析了STM32 HAL库驱动SSD1306 OLED显示屏的I2C与SPI两种通信方案,提供从硬件配置到软件移植的完整指南。通过实测对比两种协议的刷新性能与实现细节,帮助开发者快速掌握OLED显示驱动技术,适用于嵌入式系统的人机界面开发。

weixin_34265814的博客 380

STM32入门教程(OLED屏篇)

STM32 OLED显示屏应用指南 摘要 本文基于江协科技STM32视频教程,详细介绍了OLED显示屏在STM32开发中的应用方法。文章首先讲解了OLED的基本原理和调试方式,包括串口调试、显示屏调试和Keil调试模式。然后详细阐述了0.96寸和1.3寸OLED屏的参数特性及引脚分布。 主要内容包括: 基础应用:通过示例程序演示了OLED初始化、清屏、显示字符、字符串和各种数字格式的方法。 进阶应用:介绍了OLED坐标系系统,提供了UTF-8和GB2312两种编码格式下的显示方案,包括汉字和特殊字符的显示技

Zevalin的博客 2465

STM32驱动DS18B20与OLED:不用开发板也能学透单总线与I2C

在嵌入式开发中,GPIO模拟时序与I2C通信是理解底层驱动的基础。通过微秒级电平翻转实现单总线协议,能深入掌握时序控制原理;而GPIO模拟I2C则提升对通信机制的掌控力。这些技术价值在于,它们让开发者不依赖硬件外设即可驱动传感器与显示屏,广泛应用于低成本数据采集与显示场景。本文以STM32F103C8T6最小系统板为例,结合DS18B20温度传感器和OLED模块,详细拆解单总线时序与I2C模拟的实现过程,帮助读者在无开发板条件下夯实STM32外设驱动基础。

weixin_33937499的博客 254

【STM32实战】STM32CubeMX+PlatformIO+移植U8G2+I2C+DMA

摘要:STM32驱动OLED显示屏(I2C+DMA)完整教程 本教程详细介绍了使用STM32F103C8T6开发板通过I2C接口和DMA方式驱动SSD1306 OLED显示屏的全过程。主要内容包括:硬件准备(开发板、OLED屏、连接方式)、软件环境配置(STM32CubeMX、PlatformIO)、工程创建与参数设置(时钟配置、I2C+DMA初始化)、u8g2图形库的移植与驱动代码实现(包含硬件I2C通信函数和延时函数)。教程提供了完整的代码示例和项目结构说明,特别强调了DMA传输的优化实现方式,可显著提

weixin_41176179的博客 1463

STM32F407 OLED驱动及浮点数显示综合实战

OLED(Organic Light-Emitting Diode,有机发光二极管)显示屏是一种新型的显示技术,它利用有机材料在通电后自行发光的特性来显示图像。与传统的LCD(Liquid Crystal Display,液晶显示屏)相比,OLED显示屏具有更薄、更轻、响应速度更快、视角更广、色彩更丰富等优点。STM32F407系列单片机是ST公司推出的一款高性能Cortex-M4核心的微控制器。它采用了32位ARM架构,提供了高性能的数字信号处理(DSP)能力。

weixin_42515842的博客 1429

图像质量评估:使用 SSIM 计算图像相似性

在图像处理领域,衡量两幅图像之间相似性的一种常见方法是使用结构相似性指数(SSIM)。SSIM 是一种全参考的图像质量评估指标,它不仅考虑了图像的亮度、对比度,还考虑了结构信息。在本文中,我们将介绍一个使用 Python 和 OpenCV 实现的 SSIM 计算脚本,并使用该脚本评估两幅图像的相似性。

hasque2019的博客 1152

STM32驱动OLED屏幕:从I2C通信到图形显示实战指南

在嵌入式系统开发中,单片机与外部显示设备的通信是核心基础技能之一。I2C(Inter-Integrated Circuit)作为一种简单、高效的双线串行通信协议,广泛应用于传感器、存储器和显示模块等低速外设的连接。其工作原理基于主从架构,通过时钟线(SCL)同步和数据线(SDA)传输,实现设备间的可靠数据交换。掌握I2C通信对于构建嵌入式人机界面至关重要,它使得单片机能够控制如OLED这类自发光显示模块。OLED(有机发光二极管)以其高对比度、快速响应和低功耗特性,成为嵌入式显示的热门选择,尤其适合电池供电

aaa1231722的博客 390

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

STM32硬件I2C+DMA驱动JY901S与OLED显示实战

在嵌入式开发中,I2C总线与DMA传输是提升传感器数据采集效率的关键技术。I2C作为一种同步串行总线,通过开漏输出和上拉电阻实现多设备通信;DMA则允许外设直接访问内存,减轻CPU负担。将硬件I2C与DMA结合,可高效读取九轴陀螺仪加速度计等姿态传感器数据,并实时刷新OLED显示。这种方案广泛应用于平衡车、云台和姿态记录仪等场景。本文以JY901S模块和STM32为例,详细讲解硬件I2C与DMA的配置、代码实现及常见问题排查,帮助开发者快速构建稳定的姿态检测系统。

weixin_33796205的博客 194

行人重识别技术(Re-ID)概述、研究现状以及相关数据集下载

ReID技术概述什么是ReID一般流程Re-ID特点研究现状难点数据集reid常用数据集以及下载链接评价指标实现思路研究方式基于表征学习基于度量学习基于局部特征全局特征切片姿态基于视频序列RQEN基于GANCamStyleDG-NetGAN总结对比未来方向建议文献 什么是ReID 行人重识别是指利用计算机视觉技术,判断在不同时间段、不同监控下出现的行人图像是否属于同一人员的技术。行人重识别是最近几年在视频分析领域下热门的研究领域,可以看做是人脸识别应用的拓展。现在大街上的监控较多,由于设备质量、成像光线、.

留缘的博客 1万+

【存储原理】IO超时处理 块层block-scsi层之间

【存储原理】IO超时处理 块层block-scsi层之间

sinat_37817094的博客 1023

I2C与SPI协议深度对比:从4个维度实测STM32驱动OLED屏性能

本文深度对比了I2C与SPI协议在STM32驱动OLED屏中的性能表现,从通信速率、CPU占用率、代码复杂度和布线难度四个维度进行实测分析。结果显示,SPI在高速数据传输和CPU效率方面优势明显,而I2C在布线和多设备共享方面更简便。文章为嵌入式开发者提供了协议选型的实用建议,帮助优化项目设计。

weixin_34095889的博客 444

【Bug已解决】codex: rate limit 429 / Too many requests / RPM exceeded — CodeX CLI 速率限制解决方案

CodeX CLI 触发 429 速率限制(RPM/TPM/并发)的解决方案,含请求间隔、自动重试、便宜模型、Tier 升级与多 Key 轮换。

博客 4888
上一篇: 51单片机蓝牙遥控小车 定时器 中断 PWM L298N调速控制
下一篇: 使用STM32F103CBT6自制ST LINK V2-1多功能烧录器
Guard_Byte
博客等级 码龄5年 599粉丝 15原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guard_Byte

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值