在使用0.96 OLED显示屏的时候,我发现显示数字是一个大问题,特别是关于显示浮点型数据,自己折腾了一番,目前虽然浮点型显示上还有不小的问题,但可以满足最低级别的需求。
首先声明,本文中使用的程序是在 正点原子 ALIENTEK战舰STM32开发板V3 代码为基础进行的修改,感谢原子哥!
遗留的问题会在后面罗列,希望路过的大佬多多指教。

显示整型数据

先把原子哥的代码贴出来

//显示2个数字
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//mode:模式   0,填充模式;1,叠加模式
//num:数值(0~4294967295);
void OLED_ShowNumber(u8 x,u8 y,u16 num,u8 len,u8 size2)
{u8 t,temp;u8 enshow=0;for(t=0;t<len;t++){temp=(num/oled_pow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){OLED_ShowChar(x+(size2/2)*t,y,' ',size2);continue;}else enshow=1; }OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); }
}

原子哥的代码是用来显示正的整型数据的,同时还需要输入整型数据的位数,个人比较懒,所以在原子哥代码的基础上做了一些更改,使得它可以 显示正负整数,同时不需要手动输入整型数据的位数 ,需要手动输入的数据更少,操作更方便。
话不多说,直接上代码

/*
描述:显示整数(可显示正负数)(-65535~65535)
输入:x:显示的x起始位置y:显示的y起始位置num:要显示的数字Char_Size:要显示数字的大小
*/
void OLED_ShowIntegerNumber(u8 x,u8 y,int num,u8 Char_Size)
{unsigned char len=0;int buf=num;while(buf){len++;buf/=10;}if(num>0)OLED_ShowNumber(x,y,num,len,Char_Size);else{OLED_ShowChar(x,y,'-',Char_Size);num=abs(num);if(Char_Size==16)OLED_ShowNumber(x+8,y,num,len,Char_Size);elseOLED_ShowNumber(x+6,y,num,len,Char_Size);}
}

上面我个人的代码和原子哥的代码合并(使用上面代码时,仍需要原子个哥的代码),由于我上面重复调用了三次原子哥的代码,如果合并到一起,虽然子函数少了一个,但代码占用空间会变大

显示浮点型数据

关于浮点型数据是真的很头疼,直接上自己的代码

/*
描述:显示浮点数(可显示正负数)(-65535~65535)
输入:x:显示的x起始位置y:显示的y起始位置num:要显示的数字Char_Size:要显示数字的大小
局限:目前只能显示确定范围的小数,且小数部分显示不准确
*/
void OLED_ShowFloatNumber(u8 x,u8 y,float num,u8 Char_Size)
{unsigned char zheng_len=0,xiao_len=0,polarity_flag=0;int zheng=0,xiao=0;      //经读者“迷迷惘惘”提醒,为这两行局部变量赋值//附注:为防止程序运行过程中程序行为异常,需要对局部变量赋值if(num>0)polarity_flag=1;else{polarity_flag=0;num=-num;}zheng=(int)num;xiao=((num-zheng)*100)/1;    //显示小数点后两位while(zheng)  //计算整数部分位数{zheng_len++;zheng/=10;}xiao_len=2;zheng=(int)num;   //在计算整数部分数值时,原赋值被篡改,这里重新赋值if(polarity_flag){  if(Char_Size==16){OLED_ShowNumber(x,y,zheng,zheng_len,Char_Size);OLED_ShowChar(x+zheng_len*8,y,'.',Char_Size);OLED_ShowNumber(x+(zheng_len+1)*8,y,xiao,xiao_len,Char_Size);}else{OLED_ShowNumber(x,y,zheng,zheng_len,Char_Size);OLED_ShowChar(x+zheng_len*6,y,'.',Char_Size);OLED_ShowNumber(x+(zheng_len+1)*6,y,xiao,xiao_len,Char_Size);}}else{OLED_ShowChar(x,y,'-',Char_Size);if(Char_Size==16){OLED_ShowNumber(x+8,y,zheng,zheng_len,Char_Size);OLED_ShowChar(x+(zheng_len+1)*8,y,'.',Char_Size);OLED_ShowNumber(x+(zheng_len+2)*8,y,xiao,xiao_len,Char_Size);}else{OLED_ShowNumber(x+6,y,zheng,zheng_len,Char_Size);OLED_ShowChar(x+(zheng_len+1)*6,y,'.',Char_Size);OLED_ShowNumber(x+(zheng_len+2)*6,y,xiao,xiao_len,Char_Size);}}
}

浮点型数据的显示思路是把浮点型数据分离成整数部分和小数部分的整数形式,但是在实际操作过程中,好像是因为 float类型 自身的数值显示问题,很多时候会对小数点后的数据带来误差

困惑 和 遗留问题(浮点型数据显示)

1.浮点型数据显示时只能显示小数点后的固定几位,虽然可以在程序里更改选定显示的具体位数,但很不舒服
2.浮点型数据在输入时,小数部分总会出现一些偏差,如:
在使用 stm32c8t6 进行硬件仿真的时候,实际代码为float a;a=63.2;但仿真时,在对数据进行赋值时,a的数据值被赋值为63.2000008,这就给上面代码的输入带来问题,影响最终显示。

关于0.96 OLED显示屏显示数字相关推荐

  1. 基于STM32的0.96寸OLED显示屏显示数据和滚动显示

    文章目录 一.SPI 二.OLED显示屏显示数据 2.1 代码实现 2.2 结果展示 三.0.96寸OLED滚动显示数据 3.1 滚动方式 3.2 对显示文字进行取模 3.3 代码实现 3.4 结果展 ...

  2. 基于STM32F103C8T6的0.96寸OLED显示屏显示数据

    一.了解SPI(串行外设接口) SPI全称是Serial Perripheral Interface,也就是串行外围设备接口.SPI是Motorola公司推出的一种同步串行接口技术,是一种高速,全双工 ...

  3. STM32分别实现温湿度的采集和OLED显示屏显示数据

    目录 一.温湿度的采集 1.1了解I2C总线协议 1.2实现AHT20采集程序 二.OLED显示屏显示数据 2.1了解SPI 2.2使用OLED显示 2.2.1实验题目: 2.2.2实验过程 三.总结 ...

  4. 总结一下嵌入式OLED显示屏显示中文汉字的办法

    为什么80%的码农都做不了架构师?>>>    这个问题以为很简单,但最后花很多功夫才能完成,所以总结一下分享给大家. 解决思路 UTF-8->Unicode->GB23 ...

  5. 【STM32】 硬件IIC 驱动SSD1302(0.96 OLED模块) -- 3/4 OLED的命令表 学习

    书接上回 文章1:[STM32] 硬件IIC 驱动SSD1306(0.96 OLED模块) – 1/4 库函数 学习 文章2:[STM32] 硬件IIC 驱动SSD1302(0.96 OLED模块) ...

  6. 003.0.96‘OLED+合宙ESP32C3+和风天气预报

    合宙ESP32-C3+OLED天气预报 一.搭建开发框架 使用VScode platformio开发 1.oled显示 #include <Arduino.h> #include < ...

  7. Arduino ESP8266 +0.96“Oled屏幕基于U8g2库实现充电和wifi图标动态显示

    Arduino ESP8266 +0.96"Oled屏幕基于U8g2库实现充电和wifi图标动态显示 这种效果(基于U8g2函数构建实现的,区别于图片取模的方式.) 屏幕采用的是0.96&q ...

  8. 基于STM32的0.96寸OLED显示屏显示汉字+数字

    文章目录 一.SPI协议 1.什么是SPI协议 2. SPI 协议的物理层和协议层 二.0.96寸OLED屏 三.使用OLED屏显示数据 1.下载程序 2.打开工程 3.部分代码 4.编译并烧录 5. ...

  9. 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据

    目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...

最新文章

  1. Java对多线程的支持
  2. MySQL快速入门指南
  3. 管理信息系统 课程设计(2018-6-16)
  4. 详细讲解Python _init_()方法;为什么需要 innit方法?__init__传参
  5. Debug enterprise search menu
  6. LeetCode 2131. 连接两字母单词得到的最长回文串
  7. docker 学习笔记一(教程) 快速上手
  8. 初中数学抽象教学的案例_初中数学课堂片段教学案例分析
  9. 苹果针对FaceTime内的4个iOS漏洞提出更新
  10. 银联接口的一些加密方式
  11. C# RestSharp的http连接
  12. ReactNative实现ListView分组,悬浮效果
  13. Json数据的序列化与反序列化的三种常用方法介绍
  14. 防伪热点:洪都拉斯推出钞票设计,暗示独立二百周年!
  15. linux体系结构+linux内核结构+linux内核目录结构
  16. 宋体和英文字号与matlab中对照,Word中英文字号对照
  17. linux dos2unix 批量,linux下dos2unix
  18. sql查询数据库表结构
  19. python递归函数特点_Python递归函数特点及原理解析
  20. 知识付费时代对内容为王的反思

热门文章

  1. C# Windows服务启动错误1083配置成在该可执行程序中运行的这个服务不能执行该服务
  2. excel向程序发送命令时出现错误
  3. NUCLEO STM32H743购买和使用说明
  4. my.cnf配置文件详解
  5. 一款php开发的非常好的OA办公管理系统源码
  6. 如何去除网页噪声提取数据(02) —— 汽车之家(字体反爬)
  7. 网络原理之TCP/UDP IP
  8. 2022卡塔尔世界杯︱小游戏预上线
  9. TS2532: xxx is possibly ‘undefined‘.
  10. 首席财务官如何看待云计算和人工智能的财务报告