技术标签: 毕设
毕设中我使用了奇耘的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的数字显示,本质就是 将数字转化成字符串,然后调用字符串显示函数。
显示中文的话需要有中文的字库支持,方法也是大同小异 判断文字是什么,找字库数据,对应数据去进行画点
代码我就暂时不分享了,写的太烂了,而且对很多的原理也做不到真正的理解 望见谅。 如果您刚好也在开发这款屏幕可以留言交流一下
DC_GAN与之前的生成MNIST数据集的项目一样,同样是利用了GAN神经网络的特性。让机器学会模仿并生成类似的图片。 只是这里不同的是,鉴别器的神经网路由全连接神经网络改成了卷积神经网络。同样的,生成器的神经网络也变成了反卷积神经网络,毕竟这次的SVHM数据集比MNIST数据集复杂。下图是DCGAN论文中关于反卷积的图片: 项目代码https://github.com/IronM...
Qt相册播放器,widget版本可放大缩小,旋转,镜像//这里传代码,ui文件自己画一下吧#pragma execution_character_set("utf-8")/*! @file 重庆予乔 @author 陈强灵 @date 2018/9 @brief 接软硬件开发,控件插件开发 Q.Q:609162385 @https https:...
此文档记录参加pat考试并且以dev c++【针对5.11版本】软件作为开发工具时,必须修改的三个默认设置。1.修改默认语言标准Dev C++ 5.11 版本支持较新的 C 和 C++ 标准,但是默认没有开启。2.产生调试信息3.代码提示默认的代码提示快捷键是【CTRL+SPACE】,但是该快捷键很容易和切换输入法冲突,修改为【CTRL+ENTER】这样的话,如果考场记...
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~代码:https://github.com/eastmountyxz/ImageProcessing-Python本篇文章作为第一篇,将讲解图像处理基础知识和OpenCV入门函数,知识点如下:1.图像基础知识2.OpenCV读写图像3_openvc 计算机 图像处理 算法
今天在写代码的时候用bootstrap在js中生成表格内容时,对表格中的内容加入超链接,即使用a标签,在a标签中使用onclick传递参数带中文或者字母时遇到了问题,不能调用对应的函数,纠结了好长时间,开始传递单个参数时,我是这样写的:{ field:'name', align: 'center', title:'归档名称', formatter:function(va
为什么80%的码农都做不了架构师?>>> ..._linux排除文件后删除
image身份认证这里所说的身份认证,指的是狭义上的在计算机及其网络系统中确认操作者身份的过程,从而确定用户是否具有访问或操作某种资源的权限。image之所以要在互联网中进行身份认证,是为了防止攻击者假冒你的身份在系统中进行不利于你的操作。试想一下,万一哪天早晨起来你发现你的支付宝账号被盗了,你余额宝里的钱全没了,那岂不是亏大了。只不过,和现实世界不同的是,网络世界中..._2fa双因素认证
点击上方蓝字关注我,了解更多咨询C语言查询最大最小值的实现思路:定一个变量存储最大值或最小值,变量的初始值取自数组的第一个元素,然后遍历数组,如果遍历到的元素比变量的值大,就把值赋给变量,遍历结束后则拿到最大值。如果遍历到的值比当前变量小,则赋值给变量,遍历结束得到数组最小值。因为代码比较简单,直接贴出示例代码,下面是查找数组中的最大值:#include <stdi..._c语言中求数组中的最小值
0x887601ae(0x887601ae, "DDERR_SURFACEBUSY", "Access to this surface is being refused because the surface is already locked by another thread.")
自定义SolrEventListener实现searcher的autowarm策略在solrconfig.xml上可以配置在newSearcher和firstSearcher的监听器,在事件触发时,可以做某些热身搜索,让Searcher做好准备提供服务,特别是服务重启的时候,如果没有做好热身,开始提供服务搜索时都很勉强。但原生的配置比较麻烦,如果要做多个搜索请求时,单纯在配置文
.map文件格式说明链接:linkmap格式的文件, 主要是图谱文件信息, 主要包括染色体名称, 所在的染色体和所在染色体的坐标.map文件包括:染色体编号(1-22, X, Y or 0 if unplaced), 未知为0SNP名称(字符或数字), 如果不重要, 可以从1编号, 注意要和bed文件SNP列一一对应染色体的摩尔位置(可选项, 可以用0)SNP物理坐标Example1 snp1 0 11 snp2 0 21 snp3 0 3第一列:这三个SNP在第一个染色体上_ped文件
之前不知道imx6内核是怎么启动文件系统的init进程,查了下资料,记录于此,以后再来补充。kernel/init/main.cstatic noinline int init_post(void){ /* need to finish all async __init code before freeing the memory */ async_synchronize_f..._imx6的进程