OLED整体刷新到结合switch刷新方式演变
引言
OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。
至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的肩膀上呦。
[模块教程] 第1期 0.96寸OLED显示屏_哔哩哔哩_bilibili
OLED单独刷新
很直白, 就直接初始化一下OLED后, 直接把这段代码复制到while循环里面
整体刷新改进
存在的问题:
单独刷新, 我们观察刷新模式, 会发现我们一直在刷新 文字和数据, 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的文字了, 而是只刷新数据.
所以我们要定义一个变量, 控制我们当前应该显示哪个界面, 再定义一个变量, 表示, 我们此时界面是否切换,
因为切换的话, 就需要整体刷新, 没切换的话, 就只刷新数据区.
代码变量实现流程
(1)刷新流程
只有当我们要切换界面的时候, 我们才整体刷新, 否则, 整体刷新过一次后, 就只刷新数据即可. 这样可以节省CPU算力, 加快刷新速率。
(2)界面挑选
当我们有多个界面的时候, 我们可以选择switch来选择进行多界面的刷新。
(3)界面内部刷新
我们要把握一个点, 我们分开刷新的目的: 因为我们要重复刷新一个界面, 对于界面中不变动的文字, 就可以只刷新一次, 但是对于需要刷新变动的数据, 则需要重复刷新。
整体刷新的时机:
当刚切换到新界面的时候, 我们要整体刷新一次, 保证页面显示完整
局部刷新时机:
当已经整体刷新完, 只刷新需要更新的区域, 保证数据的实时性.
那如何区分当前是 , 刚切换完新界面, 还是已经整体刷新完呢?
那就是当界面变动的标志位触发的时候.
我们举个例子,我们可以说, 我们按下了切换界面的按键, 所以默认当前选择的界面是需要整体刷新的, 所以, 我们可以挑选一个button_down变量, 来定义, 我们是否按下了切换界面的按键, 当按下之后, 我们就要整体刷新界面( 整体刷新完后, 记得把button_down修改回来,避免重复整体刷新)
那后面当检测到, buton_down == 0 的时候, 就说明此时没有界面切换, 那么我们就局部刷新数据