本帖最后由 新手之帆 于 2020-11-1 17:02 编辑
大家都知道:arduino单片机是单线程的
而上次教程中的多段字符串的运行速度必须一致
而且 一个loop里面还要延时
这岂不是阻塞了程序的运行吗
那么
究竟要怎么样才能弥补缺点呢
LZ专门看了一下我所使用的OLED库
清屏是清全部的(在我所使用的库里)
那么
我要1/2 1/3要怎么办呢?
LZ研究了一下,发现Adafruit_SSD1306这个库,都是由buffer的数组进行显示的
清屏也只是将全部化为0
里面是这样写的:
由此,我们可以确定 范围是从0-(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8)-1的(指像素点啊)
然后,我们要的效果是什么?
滚动屏对吧
而且
是多重字符串的
所以
清屏肯定要有清1/2 1/4之类的
但该库没有
所以,我就自己加了上去(文末下载库)
而且,我只写了清除1行的函数
但是 我们可以加个参数 写要清除哪一行 这样 我们就可以做到滚动的效果
但是
这个函数要怎样写呢
首先,我们要摸索出来我的一个for 的起点和终点 也就是该行的第一个像素点和最后一个像素点
这里的字是8*8大小的
根据我的摸索及实际使用
我改好了库
请看图片
大概是这样 能做到效果就可以了
也许会有人说为什么没加大括号 这也许是你的C++学得不好了
如果执行的内容只有1行的话 那么可以省略
那么,解决了屏幕的清除问题 我不想用delay 可以怎么办啊
首先,我们先创建一个整形变量
int last_time;
然后在setup的最后赋值
last_time=millis();
然后在loop里面这样判断
if(millis()-last_time>=你设定的时间值也就是如果不这样写 你的delay要写多少)
就执行某个动作
下面给出一段小示例 关于上面所讲的millis以及变量的使用
就这样,烧录进去之后,你就会看到blink的效果 完全不需要延时
这大大提高了程序的运行效率
所以
我们可不可以
如果(当前时间大于我的设定值)
清屏;
就这样啊
就可以实现我们想要的效果
结合上一篇帖子的代码 我们可以给出不需要库的代码
这里面变量名的命名比较粗浅 各位请见谅
特别提醒:OLED_RESET的脚是有板载LED接口而定的 这不同的板子是不同的
像我用的是esp32 就写4 8266是2好像 还是4 uno nano是13
上传完成之后
接线正确 你就会看到屏幕上的字符在滚动了
接下来 我们要把它们写成一个库
名字就叫ROLL吧!
void Begin(void);
void Loop(String,int,int,int,int);
只有2个函数,但功能很强大!
Begin()放在setup
Loop()就loop
这里主要讲解一下Loop
void ROLL::Loop(String s,int len,int roll_y,int delay_time,int now_times)
s就是C++风格的字符串 len就是s的长度
delay_time是你的流畅度 你要延时的时间
now_times就是根据roll_y 如果roll_y为0 就填0 1就是16 2就是32 3就是48 就这样 没别的可填
roll_y就是y坐标 只有4个数 0 16 32 48
最后是库文件
Adafruit_GFX_Library.rar
(273.81 KB, 下载次数: 47)
ROLL.rar
(1023 Bytes, 下载次数: 60)
Adafruit_SSD1306.rar
(20.13 KB, 下载次数: 47)
求版主大佬加精!
|