打印
[其他]

分享CH32V307VCT6 驱动ST7735 LCD的C代码

[复制链接]
719|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wang6623|  楼主 | 2023-10-29 02:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是一个使用C语言编写的驱动ST7735 LCD的示例代码:
#include <stdio.h>
#include <stdint.h>
#include "stm32f4xx.h"

// 定义SPI接口的引脚和端口
#define SPI_PORT GPIOC
#define SPI_CLK_PIN GPIO_Pin_10
#define SPI_MOSI_PIN GPIO_Pin_12

// 定义D/C引脚所在的端口和引脚
#define DC_PIN GPIO_Pin_15
#define DC_PORT GPIOA

// 定义RST引脚所在的端口和引脚
#define RST_PIN GPIO_Pin_5
#define RST_PORT GPIOB

// 定义SPI控制器
#define SPIx SPI3

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

    // 使能SPI和GPIO时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOA, ENABLE);

    // 配置SPI引脚
    GPIO_InitStructure.GPIO_Pin = SPI_CLK_PIN | SPI_MOSI_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    GPIO_Init(SPI_PORT, &GPIO_InitStructure);

    // 配置D/C引脚为输出
    GPIO_InitStructure.GPIO_Pin = DC_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(DC_PORT, &GPIO_InitStructure);

    // 配置RST引脚为输出
    GPIO_InitStructure.GPIO_Pin = RST_PIN;
    GPIO_Init(RST_PORT, &GPIO_InitStructure);

    // 将引脚连到SPI功能
    GPIO_PinAFConfig(SPI_PORT, GPIO_PinSource10, GPIO_AF_SPI3);
    GPIO_PinAFConfig(SPI_PORT, GPIO_PinSource12, GPIO_AF_SPI3);

    // 配置SPI控制器
    SPI_I2S_DeInit(SPIx);
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPIx, &SPI_InitStructure);

    SPI_Cmd(SPIx, ENABLE);
}

void SPI_SendCommand(uint8_t cmd)
{
    // 设置D/C为低电平,表示发送命令
    GPIO_ResetBits(DC_PORT, DC_PIN);

    // 等待SPI发送缓冲区空
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    // 发送命令
    SPI_SendData8(SPIx, cmd);
    while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY) == SET);
}

void SPI_SendData(uint8_t data)
{
    // 设置D/C引脚为高电平,表示发送数据
    GPIO_SetBits(DC_PORT, DC_PIN);

    // 等待SPI发送缓冲区空
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    // 发送数据
    SPI_SendData8(SPIx, data);
    while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY) == SET);
}

void LCD_Reset(void)
{
    // 复位LCD
    GPIO_ResetBits(RST_PORT, RST_PIN);
    delay_ms(100);
    GPIO_SetBits(RST_PORT, RST_PIN);
    delay_ms(100);
}

void LCD_Init(void)
{
    LCD_Reset();
    SPI_SendCommand(0x11); // Sleep Out
    delay_ms(100);
    SPI_SendCommand(0xB1); // Frame Rate Control
    SPI_SendData(0x01);
    SPI_SendData(0x2C);
    SPI_SendData(0x2D);
    SPI_SendCommand(0xB2); // Frame Rate Control
    SPI_SendData(0x01);
    SPI_SendData(0x2C);
    SPI_SendData(0x2D);
    SPI_SendCommand(0xB3); // Frame Rate Control
    SPI_SendData(0x01);
    SPI_SendData(0x2C);
    SPI_SendData(0x2D);
    SPI_SendData(0x01);
    SPI_SendData(0x2C);
    SPI_SendData(0x2D);
    SPI_SendCommand(0xB4); // Display Inversion Control
    SPI_SendData(0x07);
    SPI_SendCommand(0xC0); // Power Control 1
    SPI_SendData(0xA2);
    SPI_SendData(0x02);
    SPI_SendData(0x84);
    SPI_SendCommand(0xC1); // Power Control 2
    SPI_SendData(0xC5);
    SPI_SendCommand(0xC2); // Power Control 3
    SPI_SendData(0x0A);
    SPI_SendData(0x00);
    SPI_SendCommand(0xC3); // Power Control 4
    SPI_SendData(0x8A);
    SPI_SendData(0x2A);
    SPI_SendCommand(0xC4); // Power Control 5
    SPI_SendData(0x8A);
    SPI_SendData(0xEE);
    SPI_SendCommand(0xC5); // VCOM Control 1
    SPI_SendData(0x0E);
    SPI_SendCommand(0x36); // Memory Access Control
    SPI_SendData(0xC8);
    SPI_SendCommand(0x3A); // COLMOD Pixel Format Set
    SPI_SendData(0x05);
    SPI_SendCommand(0x2A); // Column Address Set
    SPI_SendData(0x00);
    SPI_SendData(0x02);
    SPI_SendData(0x00);
    SPI_SendData(0x7F);
    SPI_SendCommand(0x2B); // Page Address Set
    SPI_SendData(0x00);
    SPI_SendData(0x01);
    SPI_SendData(0x00);
    SPI_SendData(0x9F);
    SPI_SendCommand(0x29); // Display ON
}

void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color)
{
    SPI_SendCommand(0x2A); // Column Address Set
    SPI_SendData((x >> 8) & 0xFF);
    SPI_SendData(x & 0xFF);
    SPI_SendData(((x + 1) >> 8) & 0xFF);
    SPI_SendData((x + 1) & 0xFF);
    SPI_SendCommand(0x2B); // Page Address Set
    SPI_SendData((y >> 8) & 0xFF);
    SPI_SendData(y & 0xFF);
    SPI_SendData(((y + 1) >> 8) & 0xFF);
    SPI_SendData((y + 1) & 0xFF);
    SPI_SendCommand(0x2C); // Memory Write
    SPI_SendData((color >> 8) & 0xFF);
    SPI_SendData(color & 0xFF);
}

void LCD_FillRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
{
    uint16_t i, j;
    SPI_SendCommand(0x2A); // Column Address Set
    SPI_SendData((x >> 8) & 0xFF);
    SPI_SendData(x & 0xFF);
    SPI_SendData(((x + width - 1) >> 8) & 0xFF);
    SPI_SendData((x + width - 1) & 0xFF);
    SPI_SendCommand(0x2B); // Page Address Set
    SPI_SendData((y >> 8) & 0xFF);
    SPI_SendData(y & 0xFF);
    SPI_SendData(((y + height - 1) >> 8) & 0xFF);
    SPI_SendData((y + height - 1) & 0xFF);
    SPI_SendCommand(0x2C); // Memory Write
    for (i = 0; i < width; i++) {
        for (j = 0; j < height; j++) {
            SPI_SendData((color >> 8) & 0xFF);
            SPI_SendData(color & 0xFF);
        }
    }
}

void delay_ms(uint32_t ms)
{
    volatile uint32_t nCount;

    RCC_ClocksTypeDef RCC_Clocks;
    RCC_GetClocksFreq(&RCC_Clocks);

    nCount = (RCC_Clocks.HCLK_Frequency / 10000) * ms;
    for (; nCount != 0; nCount--);
}

int main(void)
{
    SPI_Config();
    LCD_Init();

    // 示例:绘制一个红色的矩形框
    LCD_FillRect(10, 10, 100, 50, 0xF800);

    while (1) {

    }
}


使用特权

评论回复
沙发
wang6623|  楼主 | 2023-10-29 02:22 | 只看该作者
这个代码使用STM32的SPI3接口连接到ST7735 LCD,页面显示一个红色的矩形框。你可以根据需要修改代码来支持英文、画图和汉字显示。请确保在使用之前正确配置STM32的GPIO引脚和SPI控制器。

使用特权

评论回复
板凳
MessageRing| | 2023-10-30 12:16 | 只看该作者
其他系列可以用吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

424

帖子

0

粉丝