微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 7、自定义OLED开机内容

7、自定义OLED开机内容

时间:10-02 整理:3721RD 点击:

      春节忙过去了,看到大家都陆陆续续开始上班,虽然本人还没有毕业,但是有你们这么多人都在学习工作我也是感到了压力,像是有人在后面对我“鞭策”一样,后面在有限的时间内抓紧学习。这次来学习玩一下小e开发板上的OLED,上一篇详细介绍了小e的启动的整个流程和启动的相关代码流程,有了上次的大概思路,现在就可以分模块去实现自己的创意了。下面我们就开始玩一下OLED!


       首先还是进入到源码的主函数中,找到初始化函数user _init();在里面找到OLED显示的函数,就是user_show_logo();如下图:



       按下Ctrl键并点击鼠标左键快速跳转到该函数内部(source insight软件查看、编辑代码还是比较爽的,还有就是在这里面添加的程序修改后会直接将源程序覆盖)。


       我们可以看到首先是声明了一个外部的数组BMP1[],看到bmp就应该想到是图片的格式,然后我们进去看一下都是什么内容:


里面有16*16的字库编码表:


有6*8的符号编码库:


有8*16的符号编码库:


最后就是我们的BMP图片数据内容了,也就是开机的logo图片:


      里面的这些相当于组成了OLED的字库,需要显示符号就调用相应大小的符号库OLED_show_str(),需要显示汉字的就调用汉字库OLED_show_chn();不过里面只有出厂时的字库,如果需要其他的汉字我们需要配套的“取字模软件”获取数据。(因为目前厂家的相关工作人员还没有上班,暂时不能提供配套的取模软件,后面我在网上先找找看能不能找到合适的,有的话会及时上传!)


       再接下来就是定义图片的大小et_uint32 len = 1024;然后是OLED的I2C通信工作方式的初始化i2c_master_gpio_init();这个I2C通信的规则一般是固定的,里面的程序我们先暂时不要看,因为修改这个没有意义,修改后IC和IC之间就不能通信了。然后就是OLED的初始化函数OLED_init(); 接下来就是OLED的清屏了OLED_clear();



        然后就到了控制OLED显示内容的函数了:OLED_show_bmp(0, 0, 128, 8, BMP1, len);               我们进去看看具体内容:


       从这段代码可以看出来该函数后面的几个参数是控制OLED内容的起始点坐标、结束点坐标、显示的图片、图片大。这里的BMP1就是该产品的logo标识“K”。

       函数对应的参数分别是(x0,y0,x1,y1,BMP[],len);我们调用OLED_show_bmp()函数时候只需要控制好这6个参数就可以随心所欲了,达到会用的效果就可以了,至于把每个硬件都要弄明白怎么驱动的,怎么控制的这些工作中是专门有人做的,到时候他们直接给你这个函数,后面留几个参数就可以用了!就是这个样子的,要不然就像现在玩小e这个样子,人家几个工程师半年的工作量现在让你一个人短短2个月内实现基本是不可能的,所以学习一段时间后会发现学习过程中有些东西没必要从锅盖到锅底看的清楚,知道往锅里添水、会做饭就是好的!

       紧接着下来是个4s的延时,整个流程对应的OLED显示效果就是先有一个类似雪花的画面,之后显示“K”持续4S钟,然后来个清屏,最后停留在“开发从未如此简单”。我当时想把后面的那句“开发从未如此简单”这句话换掉的,但是我在user_show_logo()里面没有看到显示这句话的程序,当时以为应该就是在OLED_show_bmp(0, 0, 128, 8, BMP1, len)这个函数里面,但是后来我把它注释掉之后,重新在虚拟机内编译生成固件烧录到板子中还是会显示“开发从未如此简单”的字样,开发快的标志“K“没有了,没有“K”可以理解是正常的,但是一直出来“开发从未如此简单”就不知道哪的原因了。


       后来我干脆直接在初始化函数里面把user_show_logo()的整个函数全部注释掉,不调用这个函数看看什么现象:


      结果还是一样的出现“开发从未如此简单”,到这一步已经可以确定这条控制程序不在user_show_logo()里面!难不成还在后面?

      于是我又继续往下看了看,看到两个if语句内部之后,发现隐藏的内容了。先看看第一个判断:


       if (RETURN_OK != user_get_work_mode(&work_mode))

       {

              os_printf("getwork mode fail !\n");

              return;

       }


       在上一篇帖子里面已经详细说明过了,调用的user_get_work_mode()函数目的就是通过获取拨码开关状态下ADC的电压大小判断小e目前处于那种模式下!下面我们就进去这个函数看看:


       从这里面可以看到第一个框内的串口信息已经在串口助手内正常打印出来了,说明小e得到了正常的模式;第二个框内是从串口信息得到的ADC值确定是在OLED模式下的:


       然后user_get_work_mode()返回RETURN_OK正好和判断条件相反,于是乎就来到了第二条if判断句:


同样调用了函数user_init_work_mode();是带两个参数的函数:





       该函数功能是通过上一个if语句得到的模式标志mode= WORK_MODE_OLED;从而进一步选择相应的模式进行初始化,下面的框内则是选择的OLED的初始化:


       看到这里就算是真正的找到了“开发从未如此简单”的来源了!为了确认一下,我将”开发从未如此简单“的显示内容注释掉;另外把之前的”K“内容换成“开发从未如此简单”。就是把开机的显示现象换一下!如下图:




       最后如果没有错的话编译烧录之后的效果就是先出现雪花状的刷新,然后是“开发从未如此简单”的内容并等待4S钟时间,最后清屏什么都不显示。这个和出厂的现象区别已经很大了,然后我在虚拟机开始编译,烧录,最终的现象和完全符合预期,这也就证实了对程序的判断和简单修改。等到后期我找到合适的取模软件之后上传到坛子中,就可以显示自己想要的内容了!



修改后的工程源码:et_iot_source.rar(5.03 MB, 下载次数: 5)

2016-2-19 13:25 上传

点击文件名下载附件


编译后生成的固件:user1.2048.new.3.rar(210.63 KB, 下载次数: 1)

2016-2-19 13:26 上传

点击文件名下载附件


本帖Word版教程:自定义OLED开机内容.rar(779.12 KB, 下载次数: 7)

2016-2-19 13:26 上传

点击文件名下载附件


学习了,可以告诉我你的QQ吗 ,有问题可以请教你

一起学习,共同进步,一会私戳你!

软件很多的,主要是看是什么方式扫描的

是的,厂家发过来的软件我用的时间发现是和平常用的那种一样的。

这个帖子很不错呀,赞一个

小喇叭还有时间看这些贴

一直默默关注着你们,哈哈哈

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top