历史上的今天
今天是:2025年04月14日(星期一)
2020年04月14日 | 基于STM32F407的 中景园0.96寸OLED(IIC)的程序升级
2020-04-14 来源:eefocus
前天学习了韦东山老师的嵌入式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 这个苦力会去给我们完成!
有了画点函数的支持,我们的画圆,画线,画正方形 等等函数都不是梦! 然后就有了我先前展示的第二章图片
接下来是反白显示的介绍,反白显示也是很简单就实现了的,,,

主要的代码就是一句话 , 给我们的字库数据按位取反。。
至此,程序的实现就大致完成了。
史海拾趣
|
我用友坚的6410开发板调试了一个USB function驱动,想利用这个驱动通过usb接口向主机发送数据。写了一个简单的应用程序,利用writefile函数发送数据。我传输的端点用的是中断端点1。结果发现只能传输第一次调用writefile发的数据,后 ...… 查看全部问答> |
|
各位前辈大家好,我一个刚进公司的新人,有幸可以跟各位大牛一样搞系统研发,但是我们公司是做芯片的,我在公司做wince的BSP部分,头儿让我分析一下WINCE5.0下的触摸驱动(本地驱动)看了大牛们的资料对于实现框架比较了解了,(很多资料都是重点分 ...… 查看全部问答> |
|
使用C# 2005开发WINCE下一个程序 为什么焦点在按钮上,按回车键却不触发CLICK事件? 如果通过消息来触发,SendMessage或PostMessage 该如何定义啊? const int WM_LBUTTONDOWN = 0x0201; const int WM_LBUTTONUP = 0x0202; [DllImport(\"user3 ...… 查看全部问答> |
|
我在移置2440的Bootload中的lcd驱动时候,设置24bpp Mode显示,现在屏幕上显示的内容为屏幕的上半边水平依次显示了两个一摸一样的我欲显示的开机画面,下半部分无任何显示,请问应该调节那几个参数啊。 我显示16bpp mode时候可以正常显示并调试通 ...… 查看全部问答> |
|
关于LM3S8962开发板,装完驱动后,MDK没选项问题的解决 从网上找的不错,能解决实际问题 可以的 修改一下TOOLS文件就可以了 1:修改两处CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDRV9) # Drivers for Cortex-M devices  ...… 查看全部问答> |




