> 文档中心 > STM32 I2C OLED 动态显示 float类型数据

STM32 I2C OLED 动态显示 float类型数据


STM32使用OLED显示浮点数

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

  1. 所用硬件 :
    ~STM32F103X开发板
    ~中景园0.96寸OLED_I2C
  2. 软件环境 :
    keil_v5 MDK
  3. 引脚定义,具体参考oled.h :
    CLK —PA0
    SDA —PA1

废话不多说,直接上第一版程序

年少不知学习好,奈何基础有点差啊 C语言基础好的就当我啥也没说

关键函数 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屏上显示}

最终效果 - OLED动态浮点数 显示

在这里插入图片描述

  • 对应资源下载链接:STM32 I2C OLED 动态显示 float类型数据

耳机推荐