首先,需要在STM32F104VE上初始化SPI接口和LCD驱动芯片ST7789V3。这里假设SPI1被用于控制LCD驱动芯片。

初始化SPI1:

void SPI1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    SPI_InitTypeDef SPI_InitStruct;

    // 使能SPI1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    // 配置SPI1引脚
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 配置SPI1
    SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStruct.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &SPI_InitStruct);

    // 使能SPI1
    SPI_Cmd(SPI1, ENABLE);
}

初始化LCD驱动芯片ST7789V3:

void LCD_Init(void)
{
    // 使能LCD时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);

    // 配置LCD引脚
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_Init(GPIOC, &GPIO_InitStruct);

    // 初始化LCD
    LCD_WriteCommand(0x11); // Sleep Out
    delay_ms(120);
    LCD_WriteCommand(0x36); // Memory Data Access Control
    LCD_WriteData(0x00); // MY = 0, MX = 0, MV = 0, ML = 0, RGB = 0
    LCD_WriteCommand(0x3A); // Interface Pixel Format
    LCD_WriteData(0x05); // 16 bits / pixel
    LCD_WriteCommand(0xB2); // Porch Setting
    LCD_WriteData(0x0C);
    LCD_WriteData(0x0C);
    LCD_WriteData(0x00);
    LCD_WriteData(0x33);
    LCD_WriteData(0x33);
    LCD_WriteCommand(0xB7); // Gate Control
    LCD_WriteData(0x35);
    LCD_WriteCommand(0xBB); // VCOM Setting
    LCD_WriteData(0x19);
    LCD_WriteCommand(0xC0); // LCM Control
    LCD_WriteData(0x2C);
    LCD_WriteCommand(0xC2); // VDV and VRH Command Enable
    LCD_WriteData(0x01);
    LCD_WriteData(0xFF);
    LCD_WriteData(0xFF);
    LCD_WriteCommand(0xC3); // VRH Set
    LCD_WriteData(0x11);
    LCD_WriteCommand(0xC4); // VDV Set
    LCD_WriteData(0x20);
    LCD_WriteCommand(0xC6); // Frame Rate Control
    LCD_WriteData(0x0F);
    LCD_WriteCommand(0xD0); // Power Control 1
    LCD_WriteData(0xA4);
    LCD_WriteData(0xA1);
    LCD_WriteCommand(0xE0); // Positive Gamma Correction
    LCD_WriteData(0xD0);
    LCD_WriteData(0x00);
    LCD_WriteData(0x05);
    LCD_WriteData(0x0E);
    LCD_WriteData(0x15);
    LCD_WriteData(0x0D);
    LCD_WriteData(0x37);
    LCD_WriteData(0x43);
    LCD_WriteData(0x47);
    LCD_WriteData(0x09);
    LCD_WriteData(0x15);
    LCD_WriteData(0x12);
    LCD_WriteData(0x16);
    LCD_WriteCommand(0xE1); // Negative Gamma Correction
    LCD_WriteData(0xD0);
    LCD_WriteData(0x00);
    LCD_WriteData(0x05);
    LCD_WriteData(0x0D);
    LCD_WriteData(0x0C);
    LCD_WriteData(0x06);
    LCD_WriteData(0x2D);
    LCD_WriteData(0x44);
    LCD_WriteData(0x40);
    LCD_WriteData(0x0E);
    LCD_WriteData(0x1C);
    LCD_WriteData(0x18);
    LCD_WriteData(0x16);
    LCD_WriteCommand(0x29); // Display On
}

实现在屏幕上显示字母A:

void LCD_WriteData(uint8_t data)
{
    GPIO_SetBits(GPIOB, GPIO_Pin_4); // DC = 1
    GPIO_ResetBits(GPIOB, GPIO_Pin_5); // CS = 0
    SPI_I2S_SendData(SPI1, data);
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
    GPIO_SetBits(GPIOB, GPIO_Pin_5); // CS = 1
}

void LCD_WriteCommand(uint8_t command)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_4); // DC = 0
    GPIO_ResetBits(GPIOB, GPIO_Pin_5); // CS = 0
    SPI_I2S_SendData(SPI1, command);
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
    GPIO_SetBits(GPIOB, GPIO_Pin_5); // CS = 1
}

void LCD_SetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
{
    LCD_WriteCommand(0x2A); // Column Address Set
    LCD_WriteData(x0 >> 8);
    LCD_WriteData(x0 & 0xFF);
    LCD_WriteData(x1 >> 8);
    LCD_WriteData(x1 & 0xFF);

    LCD_WriteCommand(0x2B); // Row Address Set
    LCD_WriteData(y0 >> 8);
    LCD_WriteData(y0 & 0xFF);
    LCD_WriteData(y1 >> 8);
    LCD_WriteData(y1 & 0xFF);

    LCD_WriteCommand(0x2C); // Memory Write
}

void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color)
{
    LCD_SetWindow(x, y, x, y);
    LCD_WriteData(color >> 8);
    LCD_WriteData(color & 0xFF);
}

void LCD_DrawChar(uint16_t x, uint16_t y, char c, uint16_t color)
{
    uint8_t i, j;
    for(i = 0; i < 16; i++)
    {
        for(j = 0; j < 8; j++)
        {
            if((font[c - 32][i] >> (7 - j)) & 0x01)
            {
                LCD_DrawPixel(x + j, y + i, color);
            }
            else
            {
                LCD_DrawPixel(x + j, y + i, 0xFFFF);
            }
        }
    }
}

void LCD_DrawString(uint16_t x, uint16_t y, char* str, uint16_t color)
{
    while(*str)
    {
        LCD_DrawChar(x, y, *str++, color);
        x += 8;
    }
}

void LCD_DisplayLetterA(void)
{
    LCD_DrawString(0, 0, "A", 0xF800);
}

在主函数中调用SPI1_Init()LCD_Init()函数初始化SPI接口和LCD驱动芯片,然后调用LCD_DisplayLetterA()函数在屏幕上显示字母A。

你是一名STM32的软件开发工程师要求你用STM32F104VE完成下面的题目用标准库函数方式使用SPI协议在屏幕上显示字母A屏幕分辨率为240280驱动芯片ST7789V3

原文地址: https://www.cveoy.top/t/topic/KNl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录