毕业设计--2020.02.18 奇耘4.2寸墨水屏的程序设计思路分享

毕设中我使用了奇耘的4.2寸墨水屏,官方的范例代码给出了一些局部刷新的例子,但是我认为官方给的代码太过于简单实现的功能也不是我想要的,所以对先有的官方的代码进行了一些改进,让这一套代码更适合于我自己的毕业设计。

以下的只有程序思路, 程序还没有完全的完善,就不放出来 误导别人了(代码太烂了)。而且作为毕业设计的一部分 至少要等我毕业了再开源

首先先分享一下这块屏幕的特性

这款屏幕的分辨率是400*300 的 DPI是120  看起来颗粒感还行不是那么的强烈。

屏幕的刷新方式定义成这样,  我用的是侧方向用的屏幕  屏幕的方向设置貌似比较麻烦,我也没太过深入的了解,参数都是一个个实验找到的、、、、、

这是我的屏幕的方位定义,我的程序的逻辑是这样的

第一 整个显示得数据都是在内存中保存的,我在内存中开辟了一个15000(300*400/8)byte的数组,这个数组用于保存各个点的bit信息,在进行 字符显示的时候我就向指定的内存地址写入新的数据,然后执行全屏刷新操作(这里是针对全屏刷新)

当进行局部刷新的时候,我们的墨水屏驱动器需要我们输入以前的数据然后再输入最新的数据以此来达到局部刷新的目的。

(我猜测是需要前后的数据去进行对比,决定翻转哪一些墨水颗粒)

在这种背景下,我设计了两个函数 

这两个函数的作用很简单,就是设置一个点的 bit值到指定的位置或者是获取一个点的bit值(这里提一嘴,这个算法肯定有更优化的办法,比如一次操作8个bit  但是我为了减少逻辑复杂度就直接采用了这个笨的办法,一次只读或者写一个bit ),这两个函数就是整个系统的一个对外的接口,我们可以很轻易的把以前的 OLED显示函数迁移过来(其实我就是这么干的),一次只设置一个点的值

通过这样的操作  我可以很简单的写出我自己的墨水屏相关的显示函数,毕竟各种字符 图片本质都是一个个点阵。

 

相比较于OLED的程序而言,墨水屏的程序上面添加了一个全局刷新和局部刷新的概念, 而又因为局部刷新我需要向墨水屏的驱动芯片提供先前的显示内容所以操作有有了一点点的不同

这一部分我的操作是这样的  : 第一步: 声明一个数组     然后将你要修改的区域 的数据读到一个数组(p_Before[xxx])里面去(数据其实是保存在内部的内存 数组中, 就是数据从数组搬到另一个数组)  这里用到get point 函数  而且为了程序尽可能简单 我还对 Y座标进行了 对8取整  ,

然后修改显示内容,这一步还是set point函数, 使用Set_point() 函数 我们直接对内部的显存进行修改,  然后再次调用 EPD_COPY_AREA() 这个函数,将最新的数据数组提取出来

;然后 设置好参数  主要是刷新的区域的起始点座标  然后就是 两次提取出来的数组的信息

void EPD_partial_display(u16 x_start,u16 x_end,u16 y_start,u16 y_end ,const unsigned char *old_data,const unsigned char *new_data,unsigned char mode)

这样就可以完成局部的刷新了。

我们现在可以实现以上的两个功能之后就可以进行 应用层的代码的开发了。比如我们需要显示 字符,那么就是将以前的 OLED的画点的操作转移到 EPD上面来实现,至于是全局刷新还是局部刷新就是上面哪两个函数来负责的全局刷新就直接等所有的数据更新完  在向 EPD 发送一次数据, 如果是局部刷新就先提取刷新区域的数据,在更新显存,再次提取,然后就将两次的数据发送给EPD。 有了字符显示函数  那么数字显示也就不是问题了

这是OLED的数字显示,本质就是 将数字转化成字符串,然后调用字符串显示函数。

显示中文的话需要有中文的字库支持,方法也是大同小异  判断文字是什么,找字库数据,对应数据去进行画点

代码我就暂时不分享了,写的太烂了,而且对很多的原理也做不到真正的理解  望见谅。  如果您刚好也在开发这款屏幕可以留言交流一下 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章