当前位置: 首页 > news >正文

OLED整体刷新到结合switch刷新方式演变

OLED整体刷新到结合switch刷新方式演变

引言

OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。

至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的肩膀上呦。

[模块教程] 第1期 0.96寸OLED显示屏_哔哩哔哩_bilibili

OLED单独刷新

很直白, 就直接初始化一下OLED后, 直接把这段代码复制到while循环里面

image-20240820122845765

整体刷新改进

存在的问题:

单独刷新, 我们观察刷新模式, 会发现我们一直在刷新 文字和数据, OLED, 只要我们不动其数据区,我们只供电, 就可以持续的将文字留在上面.

所以, 如果我们只是显示一个页面, 那么需要刷新修改的只是数据区, 文字区域就不用刷新了,

如果我们重复刷新文字, 就相当于白白浪费CPU算力了

解决方案:

我们的做法是这样的:

只刷新一次文字区域, 然后重复刷新数据区域

OLED_ShowChinese(0, 0, "温度");
OLED_ShowChinese(0, 24, "湿度:");
OLED_ShowChinese(0, 48, "烟雾浓度:");
while(1)
{OLED_Printf(48,0,OLED_8X16,"%2d",temp);OLED_Printf(48,24,OLED_8X16,"%2d",humi);OLED_Printf(80,48,OLED_8X16,"%2.1f",ad_value);    
}   

多界面切换, 分隔刷新

多界面修改方案

当只有一个界面的时候, 我们在while循环前, 刷新一次文字, while循环里面只是修改数据就可以了.

但是有很多界面呢? 这存在一个问题, 因为我们运行都是在while循环里面运行的, 也不可能再跳转到while循环外去刷新.

多界面刷新文字区域

所以我们探讨一个问题, 我们什么时候, 才去刷新文字区域, 当然是我们要切换界面的时候, 那我们是什么时候要切换界面呢? 那当然是, 控制界面的变量, 切换的时候, 确切可以说, 我们从界面1 切换到 界面2 的时候, 我们就要刷新文字了, 当切换到界面2的时候, 我们整体刷新一次,

但是到第二次, 如果还是界面2, 我们就没必要重复刷新界面2的文字了, 而是只刷新数据.

所以我们要定义一个变量, 控制我们当前应该显示哪个界面, 再定义一个变量, 表示, 我们此时界面是否切换,

因为切换的话, 就需要整体刷新, 没切换的话, 就只刷新数据区.

image-20240820140536173

代码变量实现流程

(1)刷新流程

只有当我们要切换界面的时候, 我们才整体刷新, 否则, 整体刷新过一次后, 就只刷新数据即可. 这样可以节省CPU算力, 加快刷新速率。

image-20240820141027098

(2)界面挑选

当我们有多个界面的时候, 我们可以选择switch来选择进行多界面的刷新。

image-20240820154826038

(3)界面内部刷新

我们要把握一个点, 我们分开刷新的目的: 因为我们要重复刷新一个界面, 对于界面中不变动的文字, 就可以只刷新一次, 但是对于需要刷新变动的数据, 则需要重复刷新。

整体刷新的时机:

当刚切换到新界面的时候, 我们要整体刷新一次, 保证页面显示完整

局部刷新时机:

当已经整体刷新完, 只刷新需要更新的区域, 保证数据的实时性.

那如何区分当前是 , 刚切换完新界面, 还是已经整体刷新完呢?

那就是当界面变动的标志位触发的时候.

我们举个例子,我们可以说, 我们按下了切换界面的按键, 所以默认当前选择的界面是需要整体刷新的, 所以, 我们可以挑选一个button_down变量, 来定义, 我们是否按下了切换界面的按键, 当按下之后, 我们就要整体刷新界面( 整体刷新完后, 记得把button_down修改回来,避免重复整体刷新)

image-20240820155951091

那后面当检测到, buton_down == 0 的时候, 就说明此时没有界面切换, 那么我们就局部刷新数据

image-20240820160013762

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Swin-Transformer论文阅读
  • 打印空心正方形(c语言)
  • 8.20
  • 【人工智能】Transformers之Pipeline(十一):零样本图片分类(zero-shot-image-classification)
  • SpringSecurity6
  • 学习C语言 第十八天
  • Java面试题--分布式锁
  • 多目标跟踪之StrongSORT论文(翻译+精读)
  • 目标检测 | yolov9 原理和介绍
  • 吐血整理 ChatGPT 3.5/4.0/4o 新手使用手册~
  • 使用 Python 进行 PDF 文件加密
  • Sed编辑器
  • 【案例49】ORA-01000:超出打开游标的最大数
  • 基于SpringBoot+Vu e.js校园疫情防控系统的设计与实现
  • Visual Studio中 生成版本号
  • [译]CSS 居中(Center)方法大合集
  • Apache的基本使用
  • C++类中的特殊成员函数
  • JavaScript设计模式之工厂模式
  • js ES6 求数组的交集,并集,还有差集
  • Python - 闭包Closure
  • Ruby 2.x 源代码分析:扩展 概述
  • swift基础之_对象 实例方法 对象方法。
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue 重置组件到初始状态
  • 程序员该如何有效的找工作?
  • 第2章 网络文档
  • 讲清楚之javascript作用域
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 三栏布局总结
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 事件委托的小应用
  • 算法-图和图算法
  • 原生Ajax
  • 数据可视化之下发图实践
  • ​iOS实时查看App运行日志
  • ​香农与信息论三大定律
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • (06)金属布线——为半导体注入生命的连接
  • (4)(4.6) Triducer
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (day 12)JavaScript学习笔记(数组3)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (SERIES12)DM性能优化
  • (第61天)多租户架构(CDB/PDB)
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (全注解开发)学习Spring-MVC的第三天
  • (三) diretfbrc详解
  • (算法)Game
  • (一)WLAN定义和基本架构转
  • (一)插入排序
  • (一一四)第九章编程练习
  • (已解决)什么是vue导航守卫