爱板网论坛

查看: 780|回复: 0

[原创] 【STM32学习分享】LCD驱动 第一话 任意方向显示

[复制链接]

主题

好友

85

积分

童生

  • TA的每日心情
    开心
    2018-9-5 08:44
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-12-26 22:08:51 |显示全部楼层
    本帖最后由 dqrf 于 2017-12-28 11:20 编辑

            在学习STM32的过程中,相信很多人肯定都玩过LCD,不管是FTF LCD还是1602的点阵液晶屏,那么在玩LCD的时候有没有遇到比较糟心的情况呢,比如说:在某宝上面买的LCD,在使用的时候明明想横屏显示,但是无奈店家给的例程只能竖屏显示;或者是,例程里面只支持某种大小的字符显示,而你觉得过大或者太小,想改却无从下手;又或者,你觉得在显示菜单时,单一显示太没劲了,还是自己做一个简单UI效果来的酷炫。别着急,如果你正在为以上的某些问题感到困惑,希望我的帖子能够帮到你。在接下来的3篇连载的帖子中,我会详细的介绍我是如何解决这些问题的。当然,对于各位大佬来说,我还是比较菜的,如果哪位大佬或者前辈偶然看到我的帖子,发现问题的话,欢迎留言指正。
            话不多说,下面转入正题。在看这篇帖子前,请先根据例程正常驱动你的液晶屏,然后在进行下面的工作。我使用的是在某宝买的2.8寸不带触控功能的TFT LCD,分辨率为240*320。下面贴出实物图,这里贴出该模块的资料链接(复制到浏览器地址栏打开):http://tftdata.tjc1688.com/2.8_spi/2.8-spi-9341.rar里面有液晶屏的相关资料和51以及STM32的例程
    1.jpg

    在使用这块液晶屏时,完全按照资料里面的原理接线。因为这个型号的液晶屏分带触摸和不带触摸两种,我用的是不带触摸的,例程有触摸功能和校准功能,直接去掉。下面分别是原例程初始界面和去掉触摸功能后的界面。
    IMG_20171226_204111.jpg
    IMG_20171226_204141.jpg

            下面开始我们的驱动修改工作。我们先来看一下字符显示函数,通过go to define ,可以发现,不管是汉字显示函数,还是字符串显示函数,都是通过一个void LCD_SetCursor( )函数实现的(汉字显示可以直接看出,字符串显示还有一层调用,通过go to  define  LCD_ShowChar()函数然后在go to define  LCD_DrawPoint()函数可以找到),那么这个函数是做什么的呢?我们进一步通过go to define找到他里面调用的函数的定义,这里有两个函数分别是void LCD_WR_REG(u16 regval)和void LCD_WR_DATA(u16 data)。这两个函数作用是通过STM32的SPI接口向LCD驱动芯片写数据。
    1.png
    QQ截图20171226210502.jpg
    QQ截图20171226211243.jpg

            也许你在查看LCD_ShowString()函数时会发现,可以通过将LCD_DrawPoint(x,y)函数的X,Y坐标进行简单的变换也可以实现字符串横屏显示的效果(认真学了高中数学的应该都秒懂,这里不多说),但是汉却依旧只能竖屏显示,其实这是治标不治本的方法,我也是通过这个方法摸索过来的。我们回过头来继续看,可以看出void LCD_WR_REG(u16 regval)和void LCD_WR_DATA(u16 data)就是控制LCD显示的最底层的函数了,即使是LCD的初始化函数也是调用这两个函数进行数据的传输。那么我们就明白了,其实只要通过修改向LCD控制芯片写入的数据就可以更改其显示方向。那么到底应该写什么进去呢?下面我们先看一篇博客。http://www.cnblogs.com/amanlikethis/p/3872515.html 这篇博客简单介绍了LCD的驱动原理和怎样控制LCD的显示方向,帖子下面有相关的测试源码,博主测试用LCD的驱动芯片刚好和我们使用的LCD的驱动芯片一模一样,在这里对博主的博客和资料的开源表示感谢。这个源码里面已经给出了所有显示方向的初始化函数,那么我们就可以直接移植过来啦。移植的过程中仔细看就会发现,LCD_ILI9341_CMD()函数其实对应的就是我们的LCD_WR_REG()函数,LCD_ILI9341_Parameter()函数就是LCD_WR_DATA8(),这里要注意一点,是LCD_WR_DATA8()函数而不是LCD_WR_DATA()函数,至于为什么,大家自己看程序思考。移植过来后,我们只需要将对应的部分加到LCD初始化函数最后的清屏函数LCD_Clear()之前就可以了。下面看一下移植效果,源码见附件。
    IMG_20171226_220229.jpg
    IMG_20171226_220230.jpg
    IMG_20171226_220232.jpg
    IMG_20171226_220233.jpg


            



















    2.8寸TFT模块测试全方向.zip

    5.93 MB, 下载次数: 13

    回复

    使用道具 举报

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

    关闭

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

    手机版|爱板网

    GMT+8, 2018-9-19 11:59 , Processed in 0.182554 second(s), 13 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部