STM32
登录
直播中
王霞
7年用户
1316经验值
私信
关注
[问答]
分享一个基于STM32F407的中景园0.96寸OLED的程序升级方法
开启该帖子的消息推送
STM32F407
受到警告
提示:
作者被禁止或删除 内容自动屏蔽
回帖
(1)
杨明
2021-10-14 15:33:36
前天学习了韦东山老师的嵌入式linux教学的一期视频中关于LCD的刷新显示章节,对于显示的机制有了一些略微的理解,回想起来之前一直在用的OLED不禁想要去看看有没有人做过相应的程序, 结果没有找到! 于是自己做了一个底层的代码。
还是老规矩 先来展示效果图
图片展示的是OLED 的显示数字和字符串,OLED屏幕的刷新频率达到了惊人的40Hz,而且几乎不占用 CPU时间(数据全部走DMA) 我的程序是基于其他大佬的硬件IIC和DMA程序改编的,程序的整体框架如下
在编写用户程序之前 我需要先实现 单片机内存到 OLED内存的这个工作,这一部分我选择使用的是STM32F407的硬件IIC 集合DMA来实现的,虽然网上对STM32F407的硬件IIC诟病比较大,但是我测试的时候还是勉强可以接受,代码是借鉴的网上大佬的,我拿到手就可以实现DMA对IIC设备的读写操作了。 在解决这一部分问题时 我借鉴了 大佬的经验 博客地址如下
https://blog.csdn.net/qq_24896591/article/details/86287443
(介绍STM32F4 硬件IIC +DMA的)
在解决了硬件IIC向 OLED 内存写数据的问题后,我发现OLED的数据只能刷新一行(最上面的 128*8的区域),效果暂且不展示,于是去查询各种资料 我查询到了一个重要的信息 : SSD1306 控制器的刷新模式是行刷新!
https://blog.csdn.net/W1107101310/article/details/79829063
仔细看了一下确实是这样! ,然后我再初始化函数里面添加了 修改地址模式
通过修改指令,我实现了对Gram的整体刷新!(插播一句 OLED内部的叫 GDDRAM)
刷新过程如下:
我向Gram里面一次性的写入1024个 byte 刚好对应于整个GDRAM,可以一次刷新一整屏。而这个过程消耗的时间几乎可以忽略(甚至我可以配置一个DMA 的循环模式,自动刷新!!!)
接下来就是处理现实函数部分了,首先要处理的就是ASCII码的显示,也就是我们的showchar 函数,这一部分的实现我参考了中景园的参考例程(字库也是直接copy的),相比较于官方的代码 我自己的代码实现起来更加的容易
我的代码里面还加入了反白的选项,可以让字符反白显示(这里的反白是基于软件反白的,不是使用指令操作 OLED寄存器实现的!)实现了 字符显示函数,剩下的 显示字符串和 数字的函数就简单了!,字符串显示的函数,几乎是完全照搬的官方代码,但是数字显示部分的函数加进去了我的一些个人的解决方案,数字显示部分代码如下
我个人感觉代码用起来还行,前面补的几个0影响不是很大。。。。(借口,只是懒得解决而已)
之后的画点画圆的代码是从 正点原子的代码里面抄的,,,, 我记得原子哥将视频的时候好像说自己也是抄的。。。
算法这种东西就交给大佬们去解决了,咱也看不懂, 咱也想不明白, 确实可以运行。 不过在这之前我们还是需要完善一个底层的画点的函数,这个函数实现起来还是很简单的
这就是我的画点的函数,只有一行代码, 一次可以添加一个点。。。。 只要在我们的内存buffer中的指定值的指定位置1,剩下的DMA 这个苦力会去给我们完成!
有了画点函数的支持,我们的画圆,画线,画正方形 等等函数都不是梦! 然后就有了我先前展示的第二章图片
接下来是反白显示的介绍,反白显示也是很简单就实现了的,,,
主要的代码就是一句话 , 给我们的字库数据按位取反。。
至此,程序的实现就大致完成了。
代码的链接 在我整理完会上传,目前还是处于编写阶段,还有待优化。
前天学习了韦东山老师的嵌入式linux教学的一期视频中关于LCD的刷新显示章节,对于显示的机制有了一些略微的理解,回想起来之前一直在用的OLED不禁想要去看看有没有人做过相应的程序, 结果没有找到! 于是自己做了一个底层的代码。
还是老规矩 先来展示效果图
图片展示的是OLED 的显示数字和字符串,OLED屏幕的刷新频率达到了惊人的40Hz,而且几乎不占用 CPU时间(数据全部走DMA) 我的程序是基于其他大佬的硬件IIC和DMA程序改编的,程序的整体框架如下
在编写用户程序之前 我需要先实现 单片机内存到 OLED内存的这个工作,这一部分我选择使用的是STM32F407的硬件IIC 集合DMA来实现的,虽然网上对STM32F407的硬件IIC诟病比较大,但是我测试的时候还是勉强可以接受,代码是借鉴的网上大佬的,我拿到手就可以实现DMA对IIC设备的读写操作了。 在解决这一部分问题时 我借鉴了 大佬的经验 博客地址如下
https://blog.csdn.net/qq_24896591/article/details/86287443
(介绍STM32F4 硬件IIC +DMA的)
在解决了硬件IIC向 OLED 内存写数据的问题后,我发现OLED的数据只能刷新一行(最上面的 128*8的区域),效果暂且不展示,于是去查询各种资料 我查询到了一个重要的信息 : SSD1306 控制器的刷新模式是行刷新!
https://blog.csdn.net/W1107101310/article/details/79829063
仔细看了一下确实是这样! ,然后我再初始化函数里面添加了 修改地址模式
通过修改指令,我实现了对Gram的整体刷新!(插播一句 OLED内部的叫 GDDRAM)
刷新过程如下:
我向Gram里面一次性的写入1024个 byte 刚好对应于整个GDRAM,可以一次刷新一整屏。而这个过程消耗的时间几乎可以忽略(甚至我可以配置一个DMA 的循环模式,自动刷新!!!)
接下来就是处理现实函数部分了,首先要处理的就是ASCII码的显示,也就是我们的showchar 函数,这一部分的实现我参考了中景园的参考例程(字库也是直接copy的),相比较于官方的代码 我自己的代码实现起来更加的容易
我的代码里面还加入了反白的选项,可以让字符反白显示(这里的反白是基于软件反白的,不是使用指令操作 OLED寄存器实现的!)实现了 字符显示函数,剩下的 显示字符串和 数字的函数就简单了!,字符串显示的函数,几乎是完全照搬的官方代码,但是数字显示部分的函数加进去了我的一些个人的解决方案,数字显示部分代码如下
我个人感觉代码用起来还行,前面补的几个0影响不是很大。。。。(借口,只是懒得解决而已)
之后的画点画圆的代码是从 正点原子的代码里面抄的,,,, 我记得原子哥将视频的时候好像说自己也是抄的。。。
算法这种东西就交给大佬们去解决了,咱也看不懂, 咱也想不明白, 确实可以运行。 不过在这之前我们还是需要完善一个底层的画点的函数,这个函数实现起来还是很简单的
这就是我的画点的函数,只有一行代码, 一次可以添加一个点。。。。 只要在我们的内存buffer中的指定值的指定位置1,剩下的DMA 这个苦力会去给我们完成!
有了画点函数的支持,我们的画圆,画线,画正方形 等等函数都不是梦! 然后就有了我先前展示的第二章图片
接下来是反白显示的介绍,反白显示也是很简单就实现了的,,,
主要的代码就是一句话 , 给我们的字库数据按位取反。。
至此,程序的实现就大致完成了。
代码的链接 在我整理完会上传,目前还是处于编写阶段,还有待优化。
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32F407
中景
园
0.96OLED
SPI的
程序
移植到DSP28335上之后,进行滚动显示时候屏幕上下出现了白线
2022-07-30
22123
如何使用
STM32F407
进行内部测温呢
2021-10-26
1183
请问
STM32
Cubemx硬件SPI如何驱动七针
0.96
寸
OLED
?
2022-02-17
1421
基于
stm32
的
0.96
寸
OLED
驱动架构模块代码有何功能
2022-02-21
1551
如何编写
0.96
寸
OLED
的底层驱动?
2021-11-23
1829
stm32f407
iic是怎样驱动并点亮
oled
屏的
2021-10-19
2689
msp430烧写错误求助
2016-07-23
4082
问题
0.96
寸
OLED
2017-05-28
4360
0.96
寸
OLED
显示屏CH563Q例程有吗?哪里可下载到?
2022-06-10
695
高薪聘请
STM32F407
高手 解决U盘 和 USB口
升级
2015-03-27
7468
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分