Firefly开源社区

标题: 【Fireduino】自己动手丰衣足食--没有官方的显示屏自己改! [打印本页]

作者: tjCFeng    时间: 2016-12-7 19:17
标题: 【Fireduino】自己动手丰衣足食--没有官方的显示屏自己改!
   Fireduino为扩展各种模块做了准备,不仅有标准的Arduino接口,同时还提供了一组LCD的接口。从原理图中可以看出,虽然显示屏是8位的,但是为了增加显示速度,这组接口的数据脚从0~7使用的是同一个Port,这样无论是发送命令还是数据,都可以一次性输出到屏幕,而不是分别使用8个Pin,每个Pin输出一位,大大提高了效率。而且还有接收触摸中断的引脚,进入中断后可以通过SPI方式读取电阻屏的AD值来计算点击的坐标,估计使用的芯片是XPT2046之类的。但是官方默认是ST7735 IC的显示屏,而且到现在为止,这个配套的显示屏还没有上市,买不到,无奈只好使用原来的给Arduino准备的TFT了。




    Arduino标准接口的显示屏,IC是ILI9326的。同样是8位的接口,但是对Arduino而言,没有Port操作,即使强行把这些引脚接在Fireduino的LCD接口上,依然不可能按照Port操作,因为RKNanoD的参考手册也没有放出,也就没办法通过转换操作寄存器了。(已经找到了,可以使用Port,后面有时间改一下,正好对比速度。这个屏没有用触摸芯片,完全靠读取AD值来计算坐标,所以也就没有连接Fireduino的TPINT口。)
    既然如此,那就先从最简单的开始,把ILI9326移植到Fireduino上,替代原先的ST7735库。
    这里有个问题,看到Fireduino的WIKI上明确说明了A0~A5这几个模拟口是不支持IO操作的,那么这个屏幕直接插上是不行的,因为对应这个屏幕的RD、WR、RS、CS这几个脚就是在模拟口上的。好在这个屏幕的板子上又预留了这些引脚,通过杜邦线连接在Fireduino的LCD屏部分的接口上。原来的模拟口只是输入,所以接在一起不影响高低电平的操作。


    临时用线接了一下,没有焊上,等买的连接座到了再焊。
    一切准备就绪,下面改从哪里下手呢?还是参考自带的TFT库吧,这样最方便。安装了FireduinoSDK之后,这个库文件在默认的路径下,C:\Users\用户名\AppData\Local\Arduino15\packages\Firefly\hardware\arm\1.3.0\libraries\TFT


    这个文件夹下有两个文件和两个文件夹,TFT.cpp、TFT.h文件和utility、examples文件夹。不用说,examples就是使用的例程了,这个先不管,主要看看TFT文件。记事本打开,这两个文件太简单,没有实现什么功能。cpp主要的作用就是指定了一下宽和高,并且把ST7735初始化了一下,顺便将ST7735的名称统一成了TFT,方便使用者调用。.h文件中发现具体的实现部分在utility文件夹下的Adafruit_GFX和Adafruit_ST7735里。按照常理,Adafruit_GFX是个图形库,功能就是实现优化后的各种显示方法,比如画点、线、面,外加文字显示等。这部分应该是通用的,所以先不管它,后面再说。重点是Adafruit_ST7735,这个文件应该是ST7735显示屏的驱动程序。所以替换的思路就是,为了最少改动代码,要保持Adafruit_ST7735文件和Adafruit_GFX文件之间的继承和调用关系,只替换硬件部分的驱动代码,把ST7735的读写命令改成ILI9326的就行了


   本以为打开这个文件就能看到驱动代码,修改一下就能按照Port方式传输数据。哪知我想多了,真正的代码都被编译进固件代码不开放,这里只是调用的接口。没什么帮助,还是老老实实按照最笨的方法来修改吧。


    拷贝TFT库文件夹到任意地方,删除掉原先的Adafruit_ST7735.x文件,生成自己的类,Adafruit_ILI9326的cpp和h文件放进去,各种的引脚定义、电平操作、ILI9326的命令和数据传输等,封装成方便的函数以备调用,此处代码不再详细说明。
    需要注意一下,Adafruit_GFX实现的是各种图形的操作,但是它们有一个特点,就是不管显示什么东西,都是基于“点”的操作。也就是线是一维的点,面是二维的点,而文字则是二维的不规则的点。Adafruit_GFX虽然完成了这些点线面的显示,但是它不知道是哪种主控芯片来调用的,所以呢,Adafruit_GFX类对点的实现只是一个虚函数,需要在驱动中来重载实现,根据Adafruit_GFX中的drawPixel函数格式来在Adafruit_ILI9326中实现具体的代码。代码很简单Adafruit_ILI9326继承自Adafruit_GFX,调用ILI9326的命令来完成点的显示。


    至此,移植工作的代码部分就算完了。还记得上面提到的库文件中的TFT.cpp和TFT.h吗,为了让使用者无缝切换,这两个文件里继承的类名要从Adafruit_ST7735改成Adafruit_ILI9326了。接下来的工作就是把自己的新库添加到ArduinoIDE中。
    在ArduinoIDE的菜单中,点击“项目”->“加载库”->“添加一个.ZIP库”。名字比较坑,.ZIP是文件,不过同样可以添加文件夹。在弹出的文件夹选择对话框中找到自己的这个TFT文件夹点确定,这个文件夹就被当作库拷贝到C:\Users\用户名\Documents\Arduino\libraries中了。


    此时可以参考下examples中的例程,直接拷贝代码到自己的工程中,开始编译,完全没有变化。
    编译的结果中可以看见提示TFT有多个库,而它选择的就是刚刚新添加进去的那个TFT,结果正确。


    正常显示,没什么好说的。

   最后再唠叨一句,移植这个是迫不得已,毕竟比官方的屏速度要慢一些。但是这样做的一个好处是,这个移植的库可以放到其他的Arduino的板子上用,一劳永逸。另外,如果用在其他的Arduino板子上的话,可能需要将Adafruit_GFX.h中的“#include TF.h”移动到“#if defined(__SD_H__)”里,“#define __SD_H__”根据需要决定是否注释掉,否则编译将会报错。其他功能请自行研究吧。



作者: FireBLE_blue    时间: 2016-12-12 11:50
我靠,这个好屌,给的大大的赞
作者: tjCFeng    时间: 2016-12-12 15:06
FireBLE_blue 发表于 2016-12-12 11:50
我靠,这个好屌,给的大大的赞

谢谢,后面打算换屏,这个触摸实现起来太麻烦,还是有中断的好。
作者: 暴走的阿Sai    时间: 2016-12-12 15:22
已设置精华
作者: tjCFeng    时间: 2016-12-13 16:30
暴走的阿Sai 发表于 2016-12-12 15:22
已设置精华

谢谢,惭愧啊,功能没完全实现,后面打算换个带触摸中断的屏。
作者: bilibili    时间: 2017-5-20 12:02
大神 求个库 照着这个弄半天还是出错
作者: tjCFeng    时间: 2017-5-22 14:22
本帖最后由 tjCFeng 于 2017-5-23 20:04 编辑
bilibili 发表于 2017-5-20 12:02
大神 求个库 照着这个弄半天还是出错

已传到14楼的附件。
作者: kwpcb    时间: 2017-5-22 20:49
4.3寸屏幕怎么改。给点建议
作者: tjCFeng    时间: 2017-5-23 10:03
bilibili 发表于 2017-5-20 12:02
大神 求个库 照着这个弄半天还是出错

不好意思,昨晚忘了
作者: tjCFeng    时间: 2017-5-23 10:04
kwpcb 发表于 2017-5-22 20:49
4.3寸屏幕怎么改。给点建议

建议别接4.3的,显示速度会更慢。使用官方引脚兼容的屏幕可能好一些。
作者: bilibili    时间: 2017-5-23 12:50
tjCFeng 发表于 2017-5-23 10:03
不好意思,昨晚忘了

我邮箱 1058398819@qq.com  多谢大佬
作者: bilibili    时间: 2017-5-23 12:50
tjCFeng 发表于 2017-5-23 10:03
不好意思,昨晚忘了

我邮箱 1058398819@qq.com  多谢大佬
作者: dianziit    时间: 2017-5-23 13:12
支持一下 楼主加油

作者: tjCFeng    时间: 2017-5-23 20:02
ILI9326TFT.rar (6.18 KB, 下载次数: 6)

发到这里吧,也不是什么高级的东西,给大家当个参考。

作者: tjCFeng    时间: 2017-5-23 20:03
bilibili 发表于 2017-5-23 12:50
我邮箱   多谢大佬

14楼的附件,直接下载吧。




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1