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

OLED代码演示-使用缓存区 - 指南

OLED代码演示-使用缓存区 - 指南

目录

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

2.接线图

3.代码编写

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

第二步:

第三步:

代码优化:

第四步:

第五步:

该计算过程的演示过程

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

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

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

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

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

第六步:

汉字函数,参数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.jsqmd.com/news/353573/

相关文章:

  • Docker 27镜像签名与验证终极方案:从cosign签发到自动门禁拦截的6分钟自动化流水线
  • Matlab学习记录43
  • 强!FPGA + 双AD9288,DIY高性能便携示波器全攻略
  • GME多模态向量-Qwen2-VL-2B:开箱即用的多模态搜索解决方案
  • Swift 6.2 列传(第四篇):enumerated () 的 “集合神功” - 指南
  • Docker 27镜像仓库凭据泄露风暴:2024上半年真实泄露事件复盘,教你用Vault动态令牌替代硬编码token
  • 车联网毕设入门实战:从零搭建一个高可用的车辆数据上报系统
  • GPT-5.3-Codex是什么?一文看懂OpenAI新一代AI编程智能体
  • 【有啥问啥】智能座舱CPD技术:毫米波雷达如何守护儿童安全?
  • 从零配置到零延迟:configuration: latency=0 实战指南
  • ChatTTS环境配置实战:从零搭建高可用AI辅助开发环境
  • 从标准到私密:Teams 团队迁移的挑战与解决方案
  • 为什么越来越多 App 开发者开始用 XinServer?
  • ChatGPT生成代码实战:如何规避AI辅助开发的常见陷阱
  • 高通跃龙QCS6490部署yolov11_obb实战:QNN SDK工具链全解析与避坑指南
  • Rasa vs Chatbot框架实战对比:从架构设计到生产环境部署
  • 智能客服dify工作流架构优化实战:从高延迟到毫秒级响应的演进之路
  • STM32 USART TC标志位原理与RS-485方向控制实战
  • Docker 27边缘容器资源泄漏诊断:5步精准定位+3行命令强制回收(附生产环境压测数据)
  • 使用Matplotlib手工绘制自定义柱状图
  • Docker 27动态资源调控白皮书(2024 Q3内核补丁+dockerd配置矩阵+Prometheus动态阈值联动模板)
  • 从零搭建高可用低代码容器集群:基于Docker 27的多租户隔离、动态扩缩容与灰度发布(含Kubernetes Operator适配清单)
  • STM32串口寄存器机制与HAL底层原理详解
  • 基于Dify搭建图文并茂知识库智能客服的架构设计与实现
  • AI 辅助开发实战:基于 Spring Boot 的计算机毕业设计项目高效构建指南
  • Chat TTS本地部署实战:如何实现低延迟高并发的语音合成服务
  • 轻量级AI新选择:Ollama上的Granite-4.0-H-350M体验指南
  • Hive与Kafka集成:实时大数据处理方案
  • STM32串口中断驱动原理与工程实践
  • Kotlin 在移动开发中的代码重构