ST7789 LCD顯示屏的使用

一、概述

ST7789是一款廣泛應用於嵌入式系統中的LCD控制器,它可以驅動240×240、240×320等不同解析度的顯示屏。ST7789支持SPI介面,可以使用硬體SPI或者軟體SPI進行通訊,還支持橫屏和豎屏顯示等多種功能。本文將基於STM32平台,結合官方提供的ST7789驅動庫,進行詳細的操作說明。

二、硬體連接

在將ST7789顯示屏連接到STM32上之前,我們需要查閱ST7789顯示屏的數據手冊,確定它的引腳分布。常見的ST7789顯示屏引腳如下所示:

                --------------------------
                |                           |
                |        ST7789顯示屏       |
                |                           |
                |   SCL       ---> PB3      |
                |   SDA       ---> PB5      |
                |   DC        ---> PB4      |
                |   RES       ---> PB6      |
                |   CS        ---> PB7      |
                |   BLK       ---> GND      |
                |                           |
                --------------------------

其中,SCL、SDA、DC、RES、CS分別對應STM32的GPIO引腳,BLK是顯示屏的背光控制引腳,接地則顯示屏背光常亮。

三、軟體配置

1、下載ST7789驅動庫
首先,我們需要從官方網站上下載ST7789的驅動庫。下載地址為:https://www.st.com/content/st_com/zh/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries/stsw-stm32090.html 。下載解壓後,將inc和src文件夾中的內容拷貝到工程目錄下。

2、修改驅動庫頭文件
在下載的ST7789驅動庫中,需要修改一些內容才能夠正確驅動ST7789顯示屏。我們需要按照以下步驟來進行修改:

[1] 打開st7789.h文件,在頭文件中添加如下代碼:

/* ST7789顯示屏參數定義 */
#define ST7789_WIDTH  240
#define ST7789_HEIGHT 240
#define ST7789_PIXEL  (ST7789_WIDTH * ST7789_HEIGHT)
#define ST7789_SPI    SPI2

[2] 在st7789.h文件中找到「#define ST7789_SPI_MODE SPI_MODE_3」一行代碼,將其注釋掉。

[3] 打開st7789.c文件,在頭文件中添加如下代碼:

#define ST7789_SPI_GPIO_PORT      GPIOB
#define ST7789_SPI_GPIO_CLK       RCC_APB2Periph_GPIOB

#define ST7789_SPI_SCK_PIN        GPIO_Pin_3
#define ST7789_SPI_SCK_AF         GPIO_AF_SPI2
#define ST7789_SPI_SCK_PIN_SOURCE GPIO_PinSource3

#define ST7789_SPI_MOSI_PIN       GPIO_Pin_5
#define ST7789_SPI_MOSI_AF        GPIO_AF_SPI2
#define ST7789_SPI_MOSI_PIN_SOURCE GPIO_PinSource5

#define ST7789_LCD_DC_PORT        GPIOB
#define ST7789_LCD_DC_PIN         GPIO_Pin_4

#define ST7789_LCD_RES_PORT       GPIOB
#define ST7789_LCD_RES_PIN        GPIO_Pin_6

#define ST7789_LCD_CS_PORT        GPIOB
#define ST7789_LCD_CS_PIN         GPIO_Pin_7

[4] 在st7789.c文件中找到「#define ST7789_SPI_Init(…)」一行代碼,將其注釋掉。

3、初始化SPI
在STM32中,我們需要通過SPI介面來與ST7789進行通訊。因此,我們需要初始化SPI外設。

void SPI2_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;

    //1.打開SPI時鐘
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  
    //2.打開SPI引腳GPIO時鐘
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    
    //3.設置SPI引腳GPIO
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //4.配置SPI功能引腳映射
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI2);

    //5.配置SPI外設
    SPI_I2S_DeInit(SPI2);
    SPI_InitStructure.SPI_Direction         = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode              = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize          = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL              = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA              = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS               = SPI_NSS_Soft;
    SPI_InitStructure.SPI_FirstBit          = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial     = 7;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    SPI_Init(SPI2, &SPI_InitStructure);

    //6.開啟SPI外設
    SPI_Cmd(SPI2, ENABLE);
}

四、驅動ST7789顯示屏

首先,我們需要按照以下步驟來配置ST7789:

[1] 初始化SPI

SPI2_Init();

[2] 初始化GPIO引腳

GPIO_InitTypeDef GPIO_InitStructure;

//打開GPIO時鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

//配置LCD_DC引腳
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);

//配置LCD_RES引腳
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);

//配置LCD_CS引腳
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);

[3] 初始化ST7789

//LCD引腳初始化
LCD_GPIO_Init();

//重置LCD
LCD_Reset();

//初始化LCD
LCD_Init();

[4] 顯示圖像

//清空屏幕
LCD_Clear(BLACK);

//畫兩條直線
LCD_DrawLine(0, 0, 239, 239, RED);
LCD_DrawLine(239, 0, 0, 239, GREEN);

//顯示一張圖片
LCD_ShowImage(Image);

其中,LCD_GPIO_Init()函數用於初始化ST7789的GPIO引腳,LCD_Reset()函數用於將ST7789進行複位操作,LCD_Init()函數用於初始化ST7789,LCD_Clear()函數用於清空顯示屏,LCD_DrawLine()函數用於畫直線,LCD_ShowImage()函數用於顯示圖片。

五、總結

本文詳細介紹了ST7789的硬體連接、軟體配置、以及如何驅動ST7789顯示屏。通過對ST7789的學習,能夠幫助我們更好的了解嵌入式系統的開發,並能夠在實際應用中得到更好的運用。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/200871.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-06 11:28
下一篇 2024-12-06 11:28

相關推薦

  • lcd屏幕c語言,lcd c

    本文目錄一覽: 1、怎樣用C語言程序讓單片機外接設備LCD液晶屏進入休眠狀態 2、51單片機lcd顯示c語言程序 3、LCD屏 用C語言如何寫 4、用C語言編寫LCD顯示程序 怎樣…

    編程 2024-12-22
  • 如何使用u8g2庫控制OLED顯示屏

    在嵌入式系統開發中,使用OLED屏幕是一種常見的方式來顯示信息。而u8g2庫正是一款為OLED顯示屏設計的強大庫。該庫可以支持多種控制硬體和多種OLED型號,因此非常方便應用。本文…

    編程 2024-10-14

發表回復

登錄後才能評論