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
字符函数,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.最终的所有代码











