簡單了解液晶顯示屏
液晶顯示屏LCD是靠背光LED發光,然后經過橫豎透光,每個點電壓可以改變光線的方向,總之能改變透光度0-100%,最后就是每個像素點對應紅綠藍RGB,RGB各自的亮度不同,組成的顏色自然也不同
了解stm32和顯示屏之間通信,那些東西我們編程不用管
- stm32和顯示連接管腳對應圖
- 顯示屏原理圖
- 了解8080通信,先了解FSMC
-
3.1 FSMC:靈活的靜態存儲控制器; 能夠與同步或異步存儲器和16位PC存儲器卡連接; STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存儲器; STM32 407和103是不支持SD RAM的,429,439支持SD RAM操作
-
3.2 FSMC原理圖
下面這篇文章很好:
【https://blog.csdn.net/abap_brave/article/details/53080703】
注意:上面篇文章使用模式A與LCD通信,但我們這次編程使用模式B
然后再看這個
https://blog.csdn.net/siufai_92/article/details/48214109
文章提到為什么使用8080,LCD那些接口才是8080通信有效的,LCD使用16位寬度的數據傳輸,需要解決地址這個問題。
了解地址線與命令/數據信號線的關系,看完下面這篇文章,再結合下圖,我的代碼哪里是怎樣的寫的
https://blog.csdn.net/z1512751703/article/details/78937117
總之,想對一個LCD屏進行操作,首先看他的數據手冊,判斷他的通訊時序和FSMC那種模式的時序相識,信號線的對應關系,還有地址線,地址線的范圍請根據FSMC控制的存儲類型,如下圖,即使確定之后,還要確定你片選那一塊,FSMC划分了四個區,如下圖,根據所選的區的起始地址計算地址,地址的計算上面說的很明確了
驅動代碼編程
- 管腳的配置,查看stm32手冊,管腳那些寫到FSMC管腳使用什么模式,輸出全是推挽輸出就可以了
- FSMC配置,其實就是對19.5.6 NOR閃存和PSRAM控制器寄存器進行配置,SRAM/NOR閃存片選時序寄存器 1…4 (FSMC_BTR1…4),同時開時鍾並使能,
- 當配置控制寄存器選擇 了拓展模式,就需要多配置SRAM/NOR閃存寫時序寄存器 1…4 (FSMC_BWTR1…4)
- 下面不使用拓展模式,只需要配置 NOR閃存和PSRAM控制器寄存器、SRAM/NOR閃存片選時序寄存器
- 下圖畫紅線需要我們設置,其他默認,不懂看stm32官方手冊
- 下面是配置寄存器的代碼
static void ILI9341_FSMC_Config ( void )
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
/* 使能FSMC時鍾*/
RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_FSMC, ENABLE );
//地址建立時間(ADDSET)為1個HCLK 2/72M=28ns
readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立時間
//數據保持時間(DATAST)+ 1個HCLK = 5/72M=70ns
readWriteTiming.FSMC_DataSetupTime = 0x04; //數據建立時間
//選擇控制的模式
//模式B,異步NOR FLASH模式,與ILI9341的8080時序匹配
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_B;
/*以下配置與模式B無關,也需要設置*/
//地址保持時間(ADDHLD)模式A未用到
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持時間
//設置總線轉換周期,僅用於復用模式的NOR操作
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
//設置時鍾分頻,僅用於同步類型的存儲器
readWriteTiming.FSMC_CLKDivision = 0x00;
//數據保持時間,僅用於同步型的NOR
readWriteTiming.FSMC_DataLatency = 0x00;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAMx;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;
FSMC_NORSRAMInit ( & FSMC_NORSRAMInitStructure );
/* 使能 FSMC_Bank1_NORSRAM4 */
FSMC_NORSRAMCmd ( FSMC_Bank1_NORSRAMx, ENABLE );
}
- 使能背光燈
- 復位(復位能執行廠家燒的內部初始化代碼)
- 發送命令初始化LCD屏,先看手冊里,初始化流程(沒有找到),這個初始化過程中發送的代碼及參數主要是配置了液晶屏的上電過程、 顯示屏的伽瑪參數、分辨率、 像素格式等內容, 這些配置主要由液晶屏生產廠家提供,
static void ILI9341_REG_Config ( void )
{
/* Power control B (CFh) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xCF );
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x81 );
ILI9341_Write_Data ( 0x30 );
/* Power on sequence control (EDh) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xED );
ILI9341_Write_Data ( 0x64 );
ILI9341_Write_Data ( 0x03 );
ILI9341_Write_Data ( 0x12 );
ILI9341_Write_Data ( 0x81 );
/* Driver timing control A (E8h) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xE8 );
ILI9341_Write_Data ( 0x85 );
ILI9341_Write_Data ( 0x10 );
ILI9341_Write_Data ( 0x78 );
/* Power control A (CBh) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xCB );
ILI9341_Write_Data ( 0x39 );
ILI9341_Write_Data ( 0x2C );
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x34 );
ILI9341_Write_Data ( 0x02 );
/* Pump ratio control (F7h) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xF7 );
ILI9341_Write_Data ( 0x20 );
/* Driver timing control B */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xEA );
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x00 );
/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xB1 );
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x1B );
/* Display Function Control (B6h) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xB6 );
ILI9341_Write_Data ( 0x0A );
ILI9341_Write_Data ( 0xA2 );
/* Power Control 1 (C0h) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xC0 );
ILI9341_Write_Data ( 0x35 );
/* Power Control 2 (C1h) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0xC1 );
ILI9341_Write_Data ( 0x11 );
/* VCOM Control 1 (C5h) */
ILI9341_Write_Cmd ( 0xC5 );
ILI9341_Write_Data ( 0x45 );
ILI9341_Write_Data ( 0x45 );
/* VCOM Control 2 (C7h) */
ILI9341_Write_Cmd ( 0xC7 );
ILI9341_Write_Data ( 0xA2 );
/* Enable 3G (F2h) */
ILI9341_Write_Cmd ( 0xF2 );
ILI9341_Write_Data ( 0x00 );
/* Gamma Set (26h) */
ILI9341_Write_Cmd ( 0x26 );
ILI9341_Write_Data ( 0x01 );
DEBUG_DELAY ();
/* Positive Gamma Correction */
ILI9341_Write_Cmd ( 0xE0 ); //Set Gamma
ILI9341_Write_Data ( 0x0F );
ILI9341_Write_Data ( 0x26 );
ILI9341_Write_Data ( 0x24 );
ILI9341_Write_Data ( 0x0B );
ILI9341_Write_Data ( 0x0E );
ILI9341_Write_Data ( 0x09 );
ILI9341_Write_Data ( 0x54 );
ILI9341_Write_Data ( 0xA8 );
ILI9341_Write_Data ( 0x46 );
ILI9341_Write_Data ( 0x0C );
ILI9341_Write_Data ( 0x17 );
ILI9341_Write_Data ( 0x09 );
ILI9341_Write_Data ( 0x0F );
ILI9341_Write_Data ( 0x07 );
ILI9341_Write_Data ( 0x00 );
/* Negative Gamma Correction (E1h) */
ILI9341_Write_Cmd ( 0XE1 ); //Set Gamma
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x19 );
ILI9341_Write_Data ( 0x1B );
ILI9341_Write_Data ( 0x04 );
ILI9341_Write_Data ( 0x10 );
ILI9341_Write_Data ( 0x07 );
ILI9341_Write_Data ( 0x2A );
ILI9341_Write_Data ( 0x47 );
ILI9341_Write_Data ( 0x39 );
ILI9341_Write_Data ( 0x03 );
ILI9341_Write_Data ( 0x06 );
ILI9341_Write_Data ( 0x06 );
ILI9341_Write_Data ( 0x30 );
ILI9341_Write_Data ( 0x38 );
ILI9341_Write_Data ( 0x0F );
/* memory access control set */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0x36 );
ILI9341_Write_Data ( 0xC8 ); /*豎屏 左上角到 (起點)到右下角 (終點)掃描方式*/
DEBUG_DELAY ();
/* column address control set */
ILI9341_Write_Cmd ( CMD_SetCoordinateX ); //這是設置像素寬,剛好從0x0000到0x00EF是240
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0xEF );
/* page address control set */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( CMD_SetCoordinateY ); //這是設置像素高,剛好從0x0000到0x013F是320
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x00 );
ILI9341_Write_Data ( 0x01 );
ILI9341_Write_Data ( 0x3F );
/* Pixel Format Set (3Ah) */
DEBUG_DELAY ();
ILI9341_Write_Cmd ( 0x3a );
ILI9341_Write_Data ( 0x55 );
/* Sleep Out (11h) */
ILI9341_Write_Cmd ( 0x11 );
ILI9341_Delay ( 0xAFFf<<2 );
DEBUG_DELAY ();
/* Display ON (29h) */
ILI9341_Write_Cmd ( 0x29 );
}
-
設置掃描方向,默認是6
-
操作液晶顯示
總例程代碼如下