找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13545|回复: 5
打印 上一主题 下一主题
收起左侧

STM32驱动LCD任意方向显示(横竖屏任意设置源码)

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



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



下面开始我们的驱动修改工作。我们先来看一下字符显示函数,通过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驱动芯片写数据。

也许你在查看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()之前就可以了。下面看一下移植效果,源码见附件。


单片机源程序如下:
  1. #include "lcd.h"
  2. #include "spi.h"        +  
  3. #include "delay.h"
  4. #include "sys.h"

  5. u8 state=0;
  6. void xianshi(void);//显示信息  
  7. void refshow(void);//刷新显示

  8. void xianshi()//显示信息
  9. {
  10.         BACK_COLOR=WHITE;
  11.         POINT_COLOR=RED;   
  12.         //显示32*32汉字
  13.         showhanzi32(0,0,0);         //淘
  14.         showhanzi32(40,0,1);         //晶
  15.         showhanzi32(80,0,2);    //驰
  16.         //显示16*16汉字
  17.         showhanzi16(0,35,0);          //专
  18.         showhanzi16(20,35,1);          //注
  19.         showhanzi16(40,35,2);          //显
  20.         showhanzi16(60,35,3);          //示
  21.         showhanzi16(80,35,4);          //方
  22.         showhanzi16(100,35,5);          //案           
  23.         LCD_ShowString(0,55,200,16,16,"2.8 TFT SPI 240*320");
  24. }
  25. int main(void)
  26. {                  
  27.         delay_init();                     //延时函数初始化         
  28. //        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  29.         
  30.         SPI1_Init();        //SPI1初始化
  31.         LCD_Init();                                

  32.         Lcd_GramScan(1);
  33.         LCD_Clear(BLACK);         
  34.         while(1)
  35.         {
  36.                 Lcd_GramScan(1);
  37.                 LCD_Clear(BLACK);
  38.                 LCD_Fill(0,0,100,10,RED);
  39.                 delay_ms(1000);
  40.                
  41.                 Lcd_GramScan(2);
  42.                 LCD_Clear(BLACK);
  43.                 LCD_Fill(0,0,100,10,RED);
  44.                 delay_ms(1000);
  45.                
  46.                 Lcd_GramScan(3);
  47.                 LCD_Clear(BLACK);
  48.                 LCD_Fill(0,0,100,10,RED);
  49.                 delay_ms(1000);
  50.                
  51.                 Lcd_GramScan(4);
  52.                 LCD_Clear(BLACK);
  53.                 LCD_Fill(0,0,100,10,RED);
  54.                 delay_ms(1000);
  55.                
  56.                 Lcd_GramScan(5);
  57.                 LCD_Clear(BLACK);
  58.                 LCD_Fill(0,0,100,10,RED);
  59.                 delay_ms(1000);
  60.                
  61.                 Lcd_GramScan(6);
  62.                 LCD_Clear(BLACK);
  63.                 LCD_Fill(0,0,100,10,RED);
  64.                 delay_ms(1000);
  65.                
  66.                 Lcd_GramScan(7);
  67.                 LCD_Clear(BLACK);
  68.                 LCD_Fill(0,0,100,10,RED);
  69.                 delay_ms(1000);
  70. ……………………

  71. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
2.8寸TFT模块测试全方向.rar (364.77 KB, 下载次数: 114)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:238825 发表于 2018-4-26 22:41 | 只看该作者
讲解的很详细!!!!
回复

使用道具 举报

板凳
ID:386074 发表于 2018-8-14 16:01 | 只看该作者
刚好在调试这个屏,怎么调试横屏都不行,借鉴下看看是哪里出错误了!
回复

使用道具 举报

地板
ID:386074 发表于 2018-8-14 16:39 | 只看该作者
你这代码中都没有横屏处理的代码,基本上完全就是例程来的!!!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:347759 发表于 2018-8-15 09:12 | 只看该作者
好文章,下载了,希望对自己有用,谢谢了
回复

使用道具 举报

6#
ID:443958 发表于 2018-12-11 13:27 | 只看该作者
不错的资料,学习一下。谢谢分享。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表