在學習STM32的過程中,相信很多人肯定都玩過LCD,不管是FTF LCD還是1602的點陣液晶屏,那么在玩LCD的時候有沒有遇到比較糟心的情況呢,比如說:在某寶上面買的LCD,在使用的時候明明想橫屏顯示,但是無奈店家給的例程只能豎屏顯示;或者是,例程里面只支持某種大小的字符顯示,而你覺得過大或者太小,想改卻無從下手;又或者,你覺得在顯示菜單時,單一顯示太沒勁了,還是自己做一個簡單UI效果來的酷炫。別著急,如果你正在為以上的某些問題感到困惑,希望我的帖子能夠幫到你。在接下來的3篇連載的帖子中,我會詳細的介紹我是如何解決這些問題的。當然,對于各位大佬來說,我還是比較菜的,如果哪位大佬或者前輩偶然看到我的帖子,發(fā)現(xiàn)問題的話,歡迎留言指正。
話不多說,下面轉(zhuǎn)入正題。在看這篇帖子前,請先根據(jù)例程正常驅(qū)動你的液晶屏,然后在進行下面的工作。我使用的是在某寶買的2.8寸不帶觸控功能的TFT LCD,分辨率為240*320。下面貼出實物圖,這里貼出該模塊的資料鏈接:
2.8-spi-9341.rar
(8.44 MB, 下載次數(shù): 128)
2018-3-20 18:02 上傳
點擊文件名下載附件
里面有液晶屏的相關(guān)資料和51以及STM32的例程
在使用這塊液晶屏時,完全按照資料里面的原理接線。因為這個型號的液晶屏分帶觸摸和不帶觸摸兩種,我用的是不帶觸摸的,例程有觸摸功能和校準功能,直接去掉。下面分別是原例程初始界面和去掉觸摸功能后的界面。
下面開始我們的驅(qū)動修改工作。我們先來看一下字符顯示函數(shù),通過go to define ,可以發(fā)現(xiàn),不管是漢字顯示函數(shù),還是字符串顯示函數(shù),都是通過一個void LCD_SetCursor( )函數(shù)實現(xiàn)的(漢字顯示可以直接看出,字符串顯示還有一層調(diào)用,通過go to define LCD_ShowChar()函數(shù)然后在go to define LCD_DrawPoint()函數(shù)可以找到),那么這個函數(shù)是做什么的呢?我們進一步通過go to define找到他里面調(diào)用的函數(shù)的定義,這里有兩個函數(shù)分別是void LCD_WR_REG(u16 regval)和void LCD_WR_DATA(u16 data)。這兩個函數(shù)作用是通過STM32的SPI接口向LCD驅(qū)動芯片寫數(shù)據(jù)。
也許你在查看LCD_ShowString()函數(shù)時會發(fā)現(xiàn),可以通過將LCD_DrawPoint(x,y)函數(shù)的X,Y坐標進行簡單的變換也可以實現(xiàn)字符串橫屏顯示的效果(認真學了高中數(shù)學的應(yīng)該都秒懂,這里不多說),但是漢卻依舊只能豎屏顯示,其實這是治標不治本的方法,我也是通過這個方法摸索過來的。我們回過頭來繼續(xù)看,可以看出void LCD_WR_REG(u16 regval)和void LCD_WR_DATA(u16 data)就是控制LCD顯示的最底層的函數(shù)了,即使是LCD的初始化函數(shù)也是調(diào)用這兩個函數(shù)進行數(shù)據(jù)的傳輸。那么我們就明白了,其實只要通過修改向LCD控制芯片寫入的數(shù)據(jù)就可以更改其顯示方向。那么到底應(yīng)該寫什么進去呢?下面我們先看一篇博客。http://www.cnblogs.com/amanlikethis/p/3872515.html 這篇博客簡單介紹了LCD的驅(qū)動原理和怎樣控制LCD的顯示方向,帖子下面有相關(guān)的測試源碼,博主測試用LCD的驅(qū)動芯片剛好和我們使用的LCD的驅(qū)動芯片一模一樣,在這里對博主的博客和資料的開源表示感謝。這個源碼里面已經(jīng)給出了所有顯示方向的初始化函數(shù),那么我們就可以直接移植過來啦。移植的過程中仔細看就會發(fā)現(xiàn),LCD_ILI9341_CMD()函數(shù)其實對應(yīng)的就是我們的LCD_WR_REG()函數(shù),LCD_ILI9341_Parameter()函數(shù)就是LCD_WR_DATA8(),這里要注意一點,是LCD_WR_DATA8()函數(shù)而不是LCD_WR_DATA()函數(shù),至于為什么,大家自己看程序思考。移植過來后,我們只需要將對應(yīng)的部分加到LCD初始化函數(shù)最后的清屏函數(shù)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(); //延時函數(shù)初始化
- // NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
-
- 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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
2.8寸TFT模塊測試全方向.rar
(364.77 KB, 下載次數(shù): 114)
2018-3-20 18:02 上傳
點擊文件名下載附件
|