OLED代码演示-使用缓存区

目录

1.使用缓存区代码优点、缺点、适应情况

2.接线图

3.代码编写

第一步:复制OLED编程示例-4针脚I2C接口-不使用缓存区改名为OLED编程示例-4针脚I2C接口-使用缓存区

第二步:

第三步:

代码优化:

第四步:

第五步:

这个计算过程的演示过程

1.先将这个字模放在主函数的前面,调用OLED_ShowImage函数,先把这个特例显示出来

2.通过这个特例找规律,现在x轴是完成了的,但是y轴还是固定的

3.现在的x轴和y轴都是可以任意指定的了,但这个y范围局限于0~7

4.现在y的范围为0~63,y轴的通用化完成,但是这个代码,只循环了宽度次,高度只有一次,目前的代码只能显示字模第0行的部分图像

5.对代码进行最后的通用化,如果高度位于9~16,给两个for循环,如果图像高度位于17~24,给三个for循环

第六步:

[汉字函数,参数uint8_t Page改为uint8_t Y,将里面的Page,也改为Y,里面的高度原来是以页为单位,现在是实际的像素高度,所以高度改为16像素](#汉字函数,参数uint8_t Page改为uint8_t Y,将里面的Page,也改为Y,里面的高度原来是以页为单位,现在是实际的像素高度,所以高度改为16像素)

[字符串函数,uint8_t Page改为uint8_t Y](#字符串函数,uint8_t Page改为uint8_t Y)

[字符函数,uint8_t Page改为uint8_t Y,高度改为8和6](#字符函数,uint8_t Page改为uint8_t Y,高度改为8和6)

第七步:

第八步:

画点函数

读取点函数

利用画点函数,实现画直线函数

4.最终的所有代码


1.使用缓存区代码优点、缺点、适应情况

优点:灵活,可任意指定位置显示想要的内容

缺点:会占用一些SRAM内存资源

适用情况:绝大部分场合


2.接线图


3.代码编写

第一步:复制OLED编程示例-4针脚I2C接口-不使用缓存区改名为OLED编程示例-4针脚I2C接口-使用缓存区

第二步:

在OLED.c定义一个显示缓存数组


这个数组需要占用8*128=1024,1KB的SRAM空间,和OLED里的GDDRAM完全一样,可以说是把OLED里的显存在STM32中镜像地复制了一份,为什么OLED里面已经有显存了STM32里面还要在定义一个显存,虽然在空间上有些浪费,但是在功能和性能上STM32内还是要在搞一份,两个原因:1.目前I2C是串行接口,OLED里的那一份显存,写进去就没法读了,这样就无法实现仅点亮一个像素点的操作;2.即使OLED的显存能读,那每次访问显存都还得调用通信线进行访问,显然,这个性能不如STM32直接访问内部的SRAM,所以需要在STM32里面在定义一个显存数组

第三步:

在OLED.c里,将所有调用OLED_WriteData的地方改一下,调用OLED_WriteData是直接把数据写入OLED的GDDRAM,选择STM32里有了缓存数组,就要改成先把数据写入缓存数组,然后再另外加一个函数,OLED_Update(更新函数),调用OLED_Update才会统一地,把缓存数组的内容,写入到OLED的GDDRAM里。虽然这个功能函数这个没有问题,但是,有点浪费时间,连续写一页,128字节数据时,每写一个字节都调用一次WriteData,在WriteData函数里面,I2C平均发三个字节才有一个有效数据

代码优化:

对OLED_WriteData函数进行升级,实现一条时序写多个Date的功能,这样Update函数调用一个时序就能写128个有效数据

第四步:

将OLED.c中的功能函数,将清屏函数用显存数组赋值的操作替换

第五步:

在OLED.c中实现y轴的任意指定,修改OLED_ShowImage函数即可,因为这个函数是其他功能函数的底层调用函数

这个计算过程的演示过程

用这个图像作为特例,推导出代码的计算过程,要完成的就是,把每个字模数据拆开为字模0和字模1,一半写到当前PAGE,一半写到下一个PAGE,写入的时候用|=的方式赋值

1.先将这个字模放在主函数的前面,调用OLED_ShowImage函数,先把这个特例显示出来
2.通过这个特例找规律,现在x轴是完成了的,但是y轴还是固定的
3.现在的x轴和y轴都是可以任意指定的了,但这个y范围局限于0~7
4.现在y的范围为0~63,y轴的通用化完成,但是这个代码,只循环了宽度次,高度只有一次,目前的代码只能显示字模第0行的部分图像
5.对代码进行最后的通用化,如果高度位于9~16,给两个for循环,如果图像高度位于17~24,给三个for循环

找规律,对这个代码进行优化,在套一个for循环,高度是1~8循环一次,高度是9~16循环两次,高度是17~24循环三次,所以循环次数是Height/8,但是这样是不对,7 / 8就为0了,所以这里实际的需要的逻辑是Y/8并向上取整,C语言的ceil函数(头文件math.h)可以办到,但还要用一个简单的计算实现(Heighe-1)/ 8 + 1


当前函数没有对数组越界处理,处理方法:1.程序中进行判断,忽略越界的数据;2.就是程序员自己不显示越界的数据

第六步:

升级其他函数,实现Y坐标任意指定

汉字函数,参数uint8_t Page改为uint8_t Y,将里面的Page,也改为Y,里面的高度原来是以页为单位,现在是实际的像素高度,所以高度改为16像素

字符串函数,uint8_t Page改为uint8_t Y

字符函数,uint8_t Page改为uint8_t Y,高度改为8和6

第七步:

因为OLED_ShowImage函数,适用|=赋值的,只能写1不能写0,所以如果同一个函数调用两次就会使得显示的内容叠加,所以要在OLED_ShowImage函数添加覆盖显示的模式,在每次显示之前,先把指定的矩形区域清空,之后再进行|=的赋值,写一个清空局部内容的函数

第八步:

完成点亮像素点的函数,通过这个函数作为底层调用函数,就能实现画直线、三角形、矩形、椭圆等等的函数,有些需要一些算法

画点函数

读取点函数

利用画点函数,实现画直线函数


4.最终的所有代码

相关推荐
良许Linux1 小时前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式
混分巨兽龙某某1 小时前
基于STM32的嵌入式操作系统RT-Thread移植教学(HAL库版本)
stm32·嵌入式硬件·rt-thread·rtos
_ZeroKing1 小时前
自制智能门锁:NFC 刷卡 + 小程序远程开锁(完整实战记录)
嵌入式硬件·小程序·notepad++·arduino
清风6666662 小时前
基于单片机的多路温湿度采集与WIFI智能报警控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
爱吃番茄鼠骗2 小时前
回顾ESP32S3系列---基础篇(Bootloader)
单片机·嵌入式硬件
码农三叔2 小时前
(8-2)传感器系统与信息获取:外部环境传感
人工智能·嵌入式硬件·数码相机·机器人·人形机器人
青椒*^_^*凤爪爪2 小时前
Vscode下调试STM32N6系列单片机的方法
vscode·单片机·stm32n6·stm32n647
余生皆假期-2 小时前
永磁同步电机下桥三电阻采样方式的电机电流重构方法
单片机·嵌入式硬件·嵌入式
蓬荜生灰3 小时前
STM32(12)-- GPIO输入,按键检测
stm32·单片机·嵌入式硬件
DLGXY3 小时前
STM32——ADC、多通道转换(十三)
stm32·单片机·嵌入式硬件