查看: 234|回复: 3

[原创] 【Fireduino】自己动手丰衣足食--没有官方的显示屏自己改!

[复制链接]

134

主题

2

好友

4895

积分

版主

Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 1061 天

    [LV.10]以坛为家III

    爱板会员勋章 活跃会员勋章 在线达人勋章 发帖机器勋章 在线之王勋章 论坛骨干勋章

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


        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屏部分的接口上。原来的模拟口只是输入,所以接在一起不影响高低电平的操作。


    引脚图.png
    0.jpg

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


    2.png

        这个文件夹下有两个文件和两个文件夹,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的就行了。

    3.png

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

    4.png

        拷贝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的命令来完成点的显示。


    5.png

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


    6.png

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


    1.jpg

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

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



    回复

    使用道具 举报

    56

    主题

    1

    好友

    1960

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 13:05
  • 签到天数: 602 天

    [LV.9]以坛为家II

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

    发表于 2016-12-13 20:47:52 |显示全部楼层
    没屏,谢谢分享
    回复

    使用道具 举报

    17

    主题

    1

    好友

    3253

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    无聊
    5 天前
  • 签到天数: 423 天

    [LV.9]以坛为家II

    发表于 2016-12-13 23:18:47 |显示全部楼层
    Arduino,很酷的东西。谢谢分享
    回复

    使用道具 举报

    43

    主题

    0

    好友

    1151

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 144 天

    [LV.7]常住居民III

    发表于 2016-12-16 16:18:20 |显示全部楼层
    这个厉害,技术牛
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /3 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-2-24 16:08 , Processed in 0.138422 second(s), 13 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部