使用STM32F103ZET霸道主板實現LCD顯示屏顯示

簡單瞭解液晶顯示屏

液晶顯示屏LCD是靠背光LED發光,而後通過橫豎透光,每一個點電壓能夠改變光線的方向,總之能改變透光度0-100%,最後就是每一個像素點對應紅綠藍RGB,RGB各自的亮度不一樣,組成的顏色天然也不一樣編程

瞭解stm32和顯示屏之間通訊,那些東西咱們編程不用管

  1. stm32和顯示鏈接管腳對應圖

  1. 顯示屏原理圖

  1. 瞭解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原理圖.net

下面這篇文章很好:
https://blog.csdn.net/abap_brave/article/details/53080703code

注意:上面篇文章使用模式A與LCD通訊,但咱們此次編程使用模式B
orm

而後再看這個cdn

https://blog.csdn.net/siufai_92/article/details/48214109blog

文章提到爲何使用8080,LCD那些接口才是8080通訊有效的,LCD使用16位寬度的數據傳輸,須要解決地址這個問題。接口

瞭解地址線與命令/數據信號線的關係,看完下面這篇文章,再結合下圖,個人代碼哪裏是怎樣的寫的ip

https://blog.csdn.net/z1512751703/article/details/78937117get

總之,想對一個LCD屏進行操做,首先看他的數據手冊,判斷他的通信時序和FSMC那種模式的時序相識,信號線的對應關係,還有地址線,地址線的範圍請根據FSMC控制的存儲類型,以下圖,即便肯定以後,還要肯定你片選那一塊,FSMC劃分了四個區,以下圖,根據所選的區的起始地址計算地址,地址的計算上面說的很明確了

驅動代碼編程

  1. 管腳的配置,查看stm32手冊,管腳那些寫到FSMC管腳使用什麼模式,輸出全是推輓輸出就能夠了
  2. FSMC配置,其實就是對19.5.6 NOR閃存和PSRAM控制器寄存器進行配置,SRAM/NOR閃存片選時序寄存器 1…4 (FSMC_BTR1…4),同時開時鐘並使能,
  3. 當配置控制寄存器選擇 了拓展模式,就須要多配置SRAM/NOR閃存寫時序寄存器 1…4 (FSMC_BWTR1…4)
  4. 下面不使用拓展模式,只須要配置 NOR閃存和PSRAM控制器寄存器、SRAM/NOR閃存片選時序寄存器
  5. 下圖畫紅線須要咱們設置,其餘默認,不懂看stm32官方手冊

  1. 下面是配置寄存器的代碼
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 );  
        
}
  1. 使能背光燈
  2. 復位(復位能執行廠家燒的內部初始化代碼)
  3. 發送命令初始化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 ); 
    
    
}
  1. 設置掃描方向,默認是6

  2. 操做液晶顯示

總例程代碼以下

1-液晶顯示.7z

相關文章
相關標籤/搜索