当前位置: 首页 > news >正文

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.最终的所有代码

http://www.dtcms.com/a/582657.html

相关文章:

  • 怎么查看网站disallow找做网站
  • C语言结构体入门:定义、访问与传参全解析
  • 住房城乡建设部门户网站苏州建设公司有哪些
  • 软件工程综合实践3实验报告——校园二手交易平台系统(黑龙江大学)
  • 设计制作网站板面网站建设优化开发公司哪家好
  • “职场心态与心穷
  • 网站怎么做微信支付宝wordpress占用cpu过高
  • 郑州网站推广营销百度搜索引擎竞价排名
  • 班级网站建设思路手机模板网站模板下载
  • Rust 练习册 :Nucleotide Codons与生物信息学
  • 东坑网站仿做麻涌镇做网站
  • stm32的gpio模式到底该怎么选择?(及iic,spi,定时器原理介绍)
  • 【MySQL】触发器、日志、锁机制 深度解析
  • 电商网站后台艺术设计
  • 【湖北政务服务网-注册_登录安全分析报告】
  • 酒店网站模板设计方案网站页面设计需求文档
  • Databend 十月月报:存储过程正式可用,数据流程全面自动化
  • 湖南大型网站建设公司登陆国外网站速度慢
  • 百度恶意屏蔽网站wordpress 渗透框架
  • 算法数学---差分数组(Difference Array)
  • 石家庄城乡建设局网站服装定制品牌有哪些
  • PrettyZoo:优雅易用的 ZooKeeper 可视化管理工具
  • Trae下架Claude,但Vibe Coding之路才刚刚开始
  • 哪些行业网站推广做的多上海制作网站开发
  • 二叉树的前序遍历详解(图文并茂,C语言实现)
  • 彩票网站开发需要多少钱2020 惠州seo服务
  • 建设部网站施工合同版本网络营销推广策划书
  • Codeforces Global Round 30 (Div. 1 + Div. 2)
  • pugixml使用说明
  • 贵阳市建设厅官方网站南京企业网站开发公司