你是一名STM32的软件开发工程师要求你用STM32F104VE完成下面的题目用标准库函数方式使用SPI协议在屏幕上显示字母A屏幕分辨率为240280驱动芯片ST7789V3
首先,需要在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。
原文地址: https://www.cveoy.top/t/topic/KNl 著作权归作者所有。请勿转载和采集!