每日一言
今天的每一份坚持,都是在为未来积攒底气。
案例:OLED显示一个A
这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。
解释 :
如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变),OLED 驱动芯片可能 采样到不稳定的电平(比如 SDA 还在上升 / 下降过程中),导致显示数据错误,表现为屏幕 “雪花”(乱码、闪烁等)。
所以在这边开头添加一个SCL为0 让SDA=1 再让SCL=1 等于是让SCL信号稳定一点,这样采样比较稳定
我们这个用于对A的这个地址的话我们用字模工具
直接用这个
核心代码在这
因为我们的A是宽8 X高16的所以高是有16个位 那么就要用到2个寄存器,那么我们用两个数组,每个数组装的都是该归属的寄存器的数据,然后再分别再去取寄存器地址和列的命令 数据用for循环输出
案例:OLED显示“真的会生气”
原理是一样的
主要实现功能代码就是这些
讲解一下:
我们字模工具取出来数据,因为是16 x 16,要用到2个寄存器,每个字16个列,所以字的一半是page0一半是page1的。每个字都是一样的,因此我们先让所有字的上半部分先显示出来,再让下半部分显示出来
主要还是因为我们是页寻址模式,数据是从左往右输出,那么我们就是先让同一个寄存器的最左边到最右边的数据先描绘出来,然后再换寄存器,将下半部分从左到右显示出来
案例:显示一张图片
首先我们先在画图那边设置一下 128x64 像素 然后我们进行绘画
画完之后我们就保存为BMP格式,单色位图
一、BMP 格式适配 OLED 显示的核心原因
- 无需解码,直接映射像素
BMP 是 未压缩(或极少压缩)的位图格式 ,存储的就是像素原始数据(如单色 BMP 直接存 0/1 点阵)。OLED 屏是像素点阵列(如 128×64),显示时只需把 BMP 的像素数据 按顺序映射到 OLED 像素点 ,无需复杂解码(不像 JPG 需解压缩、色彩空间转换)。
比如单色 BMP 图像,文件里的字节数据可直接对应 OLED 屏的 “亮 / 灭” 状态,程序读取后能快速刷屏。
- 与 OLED 点阵显示原理匹配
OLED 是 点阵屏 (每个像素独立控制亮灭),BMP 格式存储的就是点阵数据(“位图” 本质)。二者都是 按像素矩阵组织数据 ,天然适配。
然后我们将在字模工具将图片放进去,将数据取出来
就像这样
这个的话我们怎么在OLED上面显示呢
那我们就可以这样想啊,既然我们屏幕是128x64 那么这个图片也是128x64
那么是不是到时候导入数据的时候也是都要进行刷新一下,那是不是就是和我们的清屏函数很像
数据放到数组里前面加code是为了数据不要那么大,编译通过
主要就是参数类型要注意一下,要是只是char *image的话那么 只能到127
必须是unsigned * char image 可以到达256才符合 当数据为0xFF的时候
这边的话还是老样子有8个寄存器 但是每个寄存器要从之前已经写完的继续下去,所以设置成128*i,一个page寄存器可以存放127个数据,我们下一个寄存器要从128开始到256,在下一个又是这样,最后到page7是128*7 到128*8 所以我们就根据这个规律设计成了
for(j = 128*i;j<(128*(i+1));j++){
Oled_Write_Data(image[j]);
}
然后我们就可以实现了,也就是将整个屏幕的数据都根据字模工具的数据都换一遍
暂时就对OLED的操作使用就到此结束