在学习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()之前就可以了。下面看一下移植效果,源码见附件。
单片机源程序如下:
- #include "lcd.h"
- #include "spi.h" +
- #include "delay.h"
- #include "sys.h"
- u8 state=0;
- void xianshi(void);//显示信息
- void refshow(void);//刷新显示
- void xianshi()//显示信息
- {
- BACK_COLOR=WHITE;
- POINT_COLOR=RED;
- //显示32*32汉字
- showhanzi32(0,0,0); //淘
- showhanzi32(40,0,1); //晶
- showhanzi32(80,0,2); //驰
- //显示16*16汉字
- showhanzi16(0,35,0); //专
- showhanzi16(20,35,1); //注
- showhanzi16(40,35,2); //显
- showhanzi16(60,35,3); //示
- showhanzi16(80,35,4); //方
- showhanzi16(100,35,5); //案
- LCD_ShowString(0,55,200,16,16,"2.8 TFT SPI 240*320");
- }
- int main(void)
- {
- delay_init(); //延时函数初始化
- // NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
-
- SPI1_Init(); //SPI1初始化
- LCD_Init();
- Lcd_GramScan(1);
- LCD_Clear(BLACK);
- while(1)
- {
- Lcd_GramScan(1);
- LCD_Clear(BLACK);
- LCD_Fill(0,0,100,10,RED);
- delay_ms(1000);
-
- Lcd_GramScan(2);
- LCD_Clear(BLACK);
- LCD_Fill(0,0,100,10,RED);
- delay_ms(1000);
-
- Lcd_GramScan(3);
- LCD_Clear(BLACK);
- LCD_Fill(0,0,100,10,RED);
- delay_ms(1000);
-
- Lcd_GramScan(4);
- LCD_Clear(BLACK);
- LCD_Fill(0,0,100,10,RED);
- delay_ms(1000);
-
- Lcd_GramScan(5);
- LCD_Clear(BLACK);
- LCD_Fill(0,0,100,10,RED);
- delay_ms(1000);
-
- Lcd_GramScan(6);
- LCD_Clear(BLACK);
- LCD_Fill(0,0,100,10,RED);
- delay_ms(1000);
-
- Lcd_GramScan(7);
- LCD_Clear(BLACK);
- LCD_Fill(0,0,100,10,RED);
- delay_ms(1000);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
2.8寸TFT模块测试全方向.rar
(364.77 KB, 下载次数: 114)
|