STM32 ILI9341驅動TFTLCD屏(二)

2023-07-27 16:22:30 來源:紛紜雜談


(資料圖)

ILI9341集成了240x320x18位圖形類型靜態RAM,也可稱為顯存。這個172,800字節的內存允許存儲具有18位分辨率(262K-color)的240xRGBx320圖像。當同時存在面板顯示讀操作和對幀內存相同位置的接口讀/寫操作時,對顯示沒有異常的可見效果。

移動圖像區域可以通過窗口地址函數在內部GRAM中指定。可以有選擇地更新指定的窗口區域,這樣就可以獨立于靜止圖像區域同時顯示移動圖像。

ILI9341有很多調節指令集:

從圖中表格可以看到指令集的時序和指令碼,可以根據需要把指令封裝成相對應的功能函數。舉例說明一個,如果想要配置軟件復位函數,首先找到軟件復位相對應的說明。

軟件復位的指令碼為0x01。當編寫軟件重置命令時,它將導致軟件重置。它將命令和參數重置為它們的S/W重置默認值。軟件重置后,需要等待5ms才能發送新命令。在此5ms期間,顯示模塊將所有顯示供應商工廠默認值加載到寄存器。如果軟件重置是在休眠模式下應用,它將需要等待120ms才能發送Sleep out命令。軟件重置命令無法在休眠期間發送序列。為了休眠模式等待120ms,統一讓軟件復位后等待120ms。

//軟件復位void ILI9341_SoftwareReset(){  LCD_CS_L();                //片選有效  ILI9341_WriteCmd(0x01);    //指令碼為0x01  Delay_ms(120);             //等待120ms  LCD_CS_H();                //片選失效}

對于其他需要的指令封裝成相對應的功能函數,只要根據ILI9341手冊按照以上步驟依次封裝即可,這里就不再一一講述了。以下給出一部分常用指令封裝成的函數:

//軟件復位void ILI9341_SoftwareReset(void){  LCD_CS_L();              //片選有效  ILI9341_WriteCmd(0x01);  //指令碼為0x01  Delay_ms(120);          //等待120ms  LCD_CS_H();              //片選失效}//休眠模式void ILI9341_EnterSleepMode(){  LCD_CS_L();              //片選有效  ILI9341_WriteCmd(0x10); //指令碼為0x10  LCD_CS_H();             //片選失效  Delay_ms(120);          //等待120ms}//退出休眠void ILI9341_ExitSleepMode(){  LCD_CS_L();              //片選有效  ILI9341_WriteCmd(0x11); //指令碼為0x11  LCD_CS_H();             //片選失效  Delay_ms(120);          //等待120ms}//反白顯示開void ILI9341_InverseOn(){  LCD_CS_L();              //片選有效  ILI9341_WriteCmd(0x21); //指令碼為0x21  LCD_CS_H();             //片選失效}                        //反白顯示關,正常顯示void ILI9341_InverseOff(){  LCD_CS_L();              //片選有效  ILI9341_WriteCmd(0x20); //指令碼為0x20  LCD_CS_H();             //片選失效}//顯示器關,內存數據不變,屏幕插入一個空白頁void ILI9341_DisplayOff(){  LCD_CS_L();              //片選有效  ILI9341_WriteCmd(0x28); //指令碼為0x28  LCD_CS_H();             //片選失效}//顯示器開void ILI9341_DisplayOn(){  LCD_CS_L();              //片選有效  ILI9341_WriteCmd(0x29); //指令碼為0x29  LCD_CS_H();             //片選失效}//列地址設置void ILI9341_SetColumnAddr(u16 StartCol,u16 EndCol){  LCD_CS_L();                      //片選有效  ILI9341_WriteCmd(0x2a);         //指令碼為0x2a  ILI9341_WriteParam(StartCol >>8);//發送起始列位置高8位  ILI9341_WriteParam(StartCol >>0);//發送起始列位置低8位  ILI9341_WriteParam(EndCol >>8);  //發送停止列位置高8位  ILI9341_WriteParam(EndCol >>0);  //發送停止列位置低8位  LCD_CS_H();                      //片選失效}//行地址設置void ILI9341_SetPageAddr(u16 StartPage,u16 EndPage){  LCD_CS_L();                          //片選有效  ILI9341_WriteCmd(0x2b);             //指令碼為0x2b  ILI9341_WriteParam(StartPage >>8);   //發送起始行位置高8位  ILI9341_WriteParam(StartPage >>0);   //發送起始行位置低8位  ILI9341_WriteParam(EndPage >>8);     //發送停止行位置高8位  ILI9341_WriteParam(EndPage >>0);     //發送停止行位置低8位  LCD_CS_H();                         //片選失效}//內存寫入void ILI9341_WriteMemory(u16 *buf,u32 size){  u32 i = 0;  ILI9341_WriteCmd(0X2C);          //指令碼為0x2b  for(i=0;i< size;i++)              //要寫入大小  {    ILI9341_WriteParam(*buf++);    //寫入像素點顏色        }}//局部模式要配合命令0x30來指定局部窗口void ILI9341_PartialModeOn(){  LCD_CS_L();                //片選有效  ILI9341_WriteCmd(0x12);   //指令碼為0x12  LCD_CS_H();               //片選失效}//設定局部窗口范圍void ILI9341_SetPartialArea(u16 StartRow,u16 EndRow){  LCD_CS_L();                        //片選有效  ILI9341_WriteCmd(0x30);           //指令碼為0x30  ILI9341_WriteParam(StartRow >>8);  //發送起始行位置高8位  ILI9341_WriteParam(StartRow >>0);  //發送起始行位置低8位  ILI9341_WriteParam(EndRow >>8);    //發送停止行位置高8位  ILI9341_WriteParam(EndRow >>0);    //發送停止行位置低8位  LCD_CS_H();                        //片選失效}//正常模式,局部模式關閉void ILI9341_PartialModeOff(){  LCD_CS_L();                  //片選有效  ILI9341_WriteCmd(0x13);     //指令碼為0x13  LCD_CS_H();                 //片選失效}//設定垂直滾動范圍//tfa:頂端固定區域//vsa:垂直滾動區域//bfa:低端固定區域void ILI9341_VertScrollDef(u16 tfa,u16 vsa,u16 bfa){  LCD_CS_L();                   //片選有效  ILI9341_WriteCmd(0x33);       //指令碼為0x33  ILI9341_WriteParam(tfa >>8);   //發送頂端固定區域tfa高8位  ILI9341_WriteParam(tfa >>0);  //發送頂端固定區域tfa低8位  ILI9341_WriteParam(vsa >>8);  //發送垂直滾動區域vsa高8位  ILI9341_WriteParam(vsa >>0);  //發送垂直滾動區域vsa低8位  ILI9341_WriteParam(bfa >>8);   //發送低端固定區域bfa高8位  ILI9341_WriteParam(bfa >>0);  //發送低端固定區域bfa低8位  LCD_CS_H();                   //片選失效}//vsp是指把滾動區域第幾行作為頂端固定區域下的第一行void ILI9341_VertScrollStartAdd(u16 vsp){  LCD_CS_L();                  //片選有效  ILI9341_WriteCmd(0x37);      //指令碼為0x37  ILI9341_WriteParam(vsp >>8);  //發送滾動區域第幾行vsp高8位  ILI9341_WriteParam(vsp >>0);  //發送滾動區域第幾行vsp低8位  LCD_CS_H();                  //片選失效}//掃描設置//第3位BGR為1時為RGB順序,為0時為BGR順序void ILI9341_MemoryAccessControl(u16 dat){  LCD_CS_L();                //片選有效  ILI9341_WriteCmd(0x36);    //指令碼為0x36  ILI9341_WriteParam(dat);  //發送設置掃描的參數  LCD_CS_H();                //片選失效}//清屏void ILI9341_ClearScreen(u32 col)    //col為清屏的顏色{  u32 i = 0;  ILI9341_WriteCmd(0X2C);            //指令碼為0x36  for(i=0;i< 240*320;i++)            //屏幕大小  {    ILI9341_WriteParam(col);        //寫入清屏顏色  }}

調用以上函數,就可以實現屏幕的很多操作了。對于這么多函數,查找時很不方便,又不好辨別功能,所以在頭文件中聲明時順便加上每個函數的功能注釋,方便后面的應用。

void ILI9341_Init(void);                             //ILI9341初始化void ILI9341_SoftwareReset(void);                     //軟件復位void ILI9341_EnterSleepMode(void);                   //休眠模式void ILI9341_ExitSleepMode(void);                     //退出休眠void ILI9341_InverseOn(void);                         //反白顯示開void ILI9341_InverseOff(void);                       //反白顯示關void ILI9341_DisplayOff(void);                       //關顯示void ILI9341_DisplayOn(void);                         //開顯示void ILI9341_SetColumnAddr(u16 StartCol,u16 EndCol); //列地址設置void ILI9341_SetPageAddr(u16 StartPage,u16 EndPage); //頁地址設置void ILI9341_WriteMemory(u16 *buf,u32 size);         //內存寫入void ILI9341_PartialModeOn(void);                     //局部模式開,要配合命令0x30來指定局部窗口void ILI9341_SetPartialArea(u16 StartRow,u16 EndRow);//設定局部窗口范圍void ILI9341_PartialModeOff(void);                   //局部模式關閉,正常窗口模式void ILI9341_VertScrollDef(u16 tfa,u16 vsa,u16 bfa); //設定垂直滾動范圍void ILI9341_VertScrollStartAdd(u16 vsp);             //把滾動區域第幾行作為頂端固定區域下的第一行void ILI9341_MemoryAccessControl(u16 dat);           //掃描設置void ILI9341_ClearScreen(u32 col);                   //清屏

至此,把常用的指令封裝成函數就完成了。

標簽:

上一篇:【NuMaker-M2354試用】I2C測試分享
下一篇:最后一頁