基于STM32F407的 中景园0.96寸OLED(IIC)的程序升级(DMA+IIC + 显存Buffer)

前天学习了韦东山老师的嵌入式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 这个苦力会去给我们完成!

有了画点函数的支持,我们的画圆,画线,画正方形 等等函数都不是梦! 然后就有了我先前展示的第二章图片

接下来是反白显示的介绍,反白显示也是很简单就实现了的,,,

主要的代码就是一句话 , 给我们的字库数据按位取反。。 

至此,程序的实现就大致完成了。

代码的链接 在我整理完会上传,目前还是处于编写阶段,还有待优化。

发布了35 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41534481/article/details/90168039