在写第一篇的时候提到过,由于没有官方屏幕,只得自己改造一个以前在Arduino使用的屏幕。但是因为引脚的关系,8位并行数据不能一次性输出,从而导致刷新速度很慢。通过对Fireduino的熟悉后,改进了连接方式和代码,最大程度地接近官方屏幕,测试一下比以前能够提高多少。 话不多说,首先是入口函数,就是对屏幕的初始化,然后对清屏函数计时。
时间取自Fireduino本身,在刷屏前保存开机时长,刷屏后相减,就是刷屏的时间了。 一、第一种传统连接方式:
按照标准的Arduino接口方式连接,为了方便比较,所有脚都用线连接。
引脚的初始化函数,最最常用的那种,为每一个引脚都操作一遍。
最核心的部分,本应该是8位并行输出的数据,分别执行了8条语句才能完成,严重的影响了效率。
编译、烧写、运行,得到的结果是2602毫秒。其实测了多次为了取平均值,发现除了一次2603毫秒外,其他一直稳定2602毫秒,取一张有代表性的图来说明。2.6秒才能刷完一次屏幕,可以说是惨不忍睹。
二、第二种官方提供的LCD数据接口方式:
完全变了,都集中在这一部分。接口图显示,这里是LCD数据的0~7脚,按顺序插好。
初始化的程序也变了,首先根据D0的引脚获取到Port号,然后再根据这个Port获取到方向寄存器和输出寄存器,以便后续操作。注释掉的部分和前面的代码是完全一样的,用哪种都行。不过为了便于移植,还是采取了前面的方式。 获取到寄存器后,对寄存器赋值,一次性将这8个口设置为输出。
最关键的地方,8位数据并行输出,一次性赋给屏幕,通过WR提交。 再次烧写,看看结果。
639毫秒,比刚才的2602毫秒快了不少,提高了4倍有余,但是比我设想的7~8倍还是有差距。
受制于接口的设计,只能采用8位的方式使得显示速度大打折扣,当然也许和显示屏的主控IC及初始化代码有关,如果再经过深入优化后或许能够再提高一些。不知道官方的屏幕速度能有多快,希望能比我这个快很多,这样显示各种内容尤其是动态部分才会更加顺畅。
后来查了下手册,即便是采用第二种方式,其实还是基于IO口的操作,速度依然不能达到最优。RKNanoD本身带了 LCD控制器,最好的方法是调用CPU本身的硬件操作。比过比较麻烦,还没有开始动手。
|