ILI9341集成了240x320x18位圖形類型靜態(tài)RAM,也可稱為顯存。這個172,800字節(jié)的內(nèi)存允許存儲具有18位分辨率(262K-color)的240xRGBx320圖像。當(dāng)同時存在面板顯示讀操作和對幀內(nèi)存相同位置的接口讀/寫操作時,對顯示沒有異常的可見效果。
移動圖像區(qū)域可以通過窗口地址函數(shù)在內(nèi)部GRAM中指定??梢杂羞x擇地更新指定的窗口區(qū)域,這樣就可以獨(dú)立于靜止圖像區(qū)域同時顯示移動圖像。
ILI9341有很多調(diào)節(jié)指令集:



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

軟件復(fù)位的指令碼為0x01。當(dāng)編寫軟件重置命令時,它將導(dǎo)致軟件重置。它將命令和參數(shù)重置為它們的S/W重置默認(rèn)值。軟件重置后,需要等待5ms才能發(fā)送新命令。在此5ms期間,顯示模塊將所有顯示供應(yīng)商工廠默認(rèn)值加載到寄存器。如果軟件重置是在休眠模式下應(yīng)用,它將需要等待120ms才能發(fā)送Sleep out命令。軟件重置命令無法在休眠期間發(fā)送序列。為了休眠模式等待120ms,統(tǒng)一讓軟件復(fù)位后等待120ms。
//軟件復(fù)位
void ILI9341_SoftwareReset()
{
  LCD_CS_L();                //片選有效
  ILI9341_WriteCmd(0x01);    //指令碼為0x01
  Delay_ms(120);             //等待120ms
  LCD_CS_H();                //片選失效
}
對于其他需要的指令封裝成相對應(yīng)的功能函數(shù),只要根據(jù)ILI9341手冊按照以上步驟依次封裝即可,這里就不再一一講述了。以下給出一部分常用指令封裝成的函數(shù):
//軟件復(fù)位
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();             //片選失效
}                        
//反白顯示關(guān),正常顯示
void ILI9341_InverseOff()
{
  LCD_CS_L();              //片選有效
  ILI9341_WriteCmd(0x20); //指令碼為0x20
  LCD_CS_H();             //片選失效
}
//顯示器關(guān),內(nèi)存數(shù)據(jù)不變,屏幕插入一個空白頁
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();             //片選失效
}
//列地址設(shè)置
void ILI9341_SetColumnAddr(u16 StartCol,u16 EndCol)
{
  LCD_CS_L();                      //片選有效
  ILI9341_WriteCmd(0x2a);         //指令碼為0x2a
  ILI9341_WriteParam(StartCol >?>8);//發(fā)送起始列位置高8位
  ILI9341_WriteParam(StartCol >?>0);//發(fā)送起始列位置低8位
  ILI9341_WriteParam(EndCol >?>8);  //發(fā)送停止列位置高8位
  ILI9341_WriteParam(EndCol >?>0);  //發(fā)送停止列位置低8位
  LCD_CS_H();                      //片選失效
}
//行地址設(shè)置
void ILI9341_SetPageAddr(u16 StartPage,u16 EndPage)
{
  LCD_CS_L();                          //片選有效
  ILI9341_WriteCmd(0x2b);             //指令碼為0x2b
  ILI9341_WriteParam(StartPage >?>8);   //發(fā)送起始行位置高8位
  ILI9341_WriteParam(StartPage >?>0);   //發(fā)送起始行位置低8位
  ILI9341_WriteParam(EndPage >?>8);     //發(fā)送停止行位置高8位
  ILI9341_WriteParam(EndPage >?>0);     //發(fā)送停止行位置低8位
  LCD_CS_H();                         //片選失效
}
//內(nèi)存寫入
void ILI9341_WriteMemory(u16 *buf,u32 size)
{
  u32 i = 0;
  ILI9341_WriteCmd(0X2C);          //指令碼為0x2b
  for(i=0;i< size;i++)              //要寫入大小
  {
    ILI9341_WriteParam(*buf++);    //寫入像素點(diǎn)顏色      
  }
}
//局部模式要配合命令0x30來指定局部窗口
void ILI9341_PartialModeOn()
{
  LCD_CS_L();                //片選有效
  ILI9341_WriteCmd(0x12);   //指令碼為0x12
  LCD_CS_H();               //片選失效
}
//設(shè)定局部窗口范圍
void ILI9341_SetPartialArea(u16 StartRow,u16 EndRow)
{
  LCD_CS_L();                        //片選有效
  ILI9341_WriteCmd(0x30);           //指令碼為0x30
  ILI9341_WriteParam(StartRow >?>8);  //發(fā)送起始行位置高8位
  ILI9341_WriteParam(StartRow >?>0);  //發(fā)送起始行位置低8位
  ILI9341_WriteParam(EndRow >?>8);    //發(fā)送停止行位置高8位
  ILI9341_WriteParam(EndRow >?>0);    //發(fā)送停止行位置低8位
  LCD_CS_H();                        //片選失效
}
//正常模式,局部模式關(guān)閉
void ILI9341_PartialModeOff()
{
  LCD_CS_L();                  //片選有效
  ILI9341_WriteCmd(0x13);     //指令碼為0x13
  LCD_CS_H();                 //片選失效
}
//設(shè)定垂直滾動范圍
//tfa:頂端固定區(qū)域
//vsa:垂直滾動區(qū)域
//bfa:低端固定區(qū)域
void ILI9341_VertScrollDef(u16 tfa,u16 vsa,u16 bfa)
{
  LCD_CS_L();                   //片選有效
  ILI9341_WriteCmd(0x33);       //指令碼為0x33
  ILI9341_WriteParam(tfa >?>8);   //發(fā)送頂端固定區(qū)域tfa高8位
  ILI9341_WriteParam(tfa >?>0);  //發(fā)送頂端固定區(qū)域tfa低8位
  ILI9341_WriteParam(vsa >?>8);  //發(fā)送垂直滾動區(qū)域vsa高8位
  ILI9341_WriteParam(vsa >?>0);  //發(fā)送垂直滾動區(qū)域vsa低8位
  ILI9341_WriteParam(bfa >?>8);   //發(fā)送低端固定區(qū)域bfa高8位
  ILI9341_WriteParam(bfa >?>0);  //發(fā)送低端固定區(qū)域bfa低8位
  LCD_CS_H();                   //片選失效
}
//vsp是指把滾動區(qū)域第幾行作為頂端固定區(qū)域下的第一行
void ILI9341_VertScrollStartAdd(u16 vsp)
{
  LCD_CS_L();                  //片選有效
  ILI9341_WriteCmd(0x37);      //指令碼為0x37
  ILI9341_WriteParam(vsp >?>8);  //發(fā)送滾動區(qū)域第幾行vsp高8位
  ILI9341_WriteParam(vsp >?>0);  //發(fā)送滾動區(qū)域第幾行vsp低8位
  LCD_CS_H();                  //片選失效
}
//掃描設(shè)置
//第3位BGR為1時為RGB順序,為0時為BGR順序
void ILI9341_MemoryAccessControl(u16 dat)
{
  LCD_CS_L();                //片選有效
  ILI9341_WriteCmd(0x36);    //指令碼為0x36
  ILI9341_WriteParam(dat);  //發(fā)送設(shè)置掃描的參數(shù)
  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);        //寫入清屏顏色
  }
}
調(diào)用以上函數(shù),就可以實(shí)現(xiàn)屏幕的很多操作了。對于這么多函數(shù),查找時很不方便,又不好辨別功能,所以在頭文件中聲明時順便加上每個函數(shù)的功能注釋,方便后面的應(yīng)用。
void ILI9341_Init(void);                             //ILI9341初始化
void ILI9341_SoftwareReset(void);                     //軟件復(fù)位
void ILI9341_EnterSleepMode(void);                   //休眠模式
void ILI9341_ExitSleepMode(void);                     //退出休眠
void ILI9341_InverseOn(void);                         //反白顯示開
void ILI9341_InverseOff(void);                       //反白顯示關(guān)
void ILI9341_DisplayOff(void);                       //關(guān)顯示
void ILI9341_DisplayOn(void);                         //開顯示
void ILI9341_SetColumnAddr(u16 StartCol,u16 EndCol); //列地址設(shè)置
void ILI9341_SetPageAddr(u16 StartPage,u16 EndPage); //頁地址設(shè)置
void ILI9341_WriteMemory(u16 *buf,u32 size);         //內(nèi)存寫入
void ILI9341_PartialModeOn(void);                     //局部模式開,要配合命令0x30來指定局部窗口
void ILI9341_SetPartialArea(u16 StartRow,u16 EndRow);//設(shè)定局部窗口范圍
void ILI9341_PartialModeOff(void);                   //局部模式關(guān)閉,正常窗口模式
void ILI9341_VertScrollDef(u16 tfa,u16 vsa,u16 bfa); //設(shè)定垂直滾動范圍
void ILI9341_VertScrollStartAdd(u16 vsp);             //把滾動區(qū)域第幾行作為頂端固定區(qū)域下的第一行
void ILI9341_MemoryAccessControl(u16 dat);           //掃描設(shè)置
void ILI9341_ClearScreen(u32 col);                   //清屏
至此,把常用的指令封裝成函數(shù)就完成了。
                        電子發(fā)燒友App
                    
                
                
          
        
        












           
            
            
                
            
評論