[其他] 分享CH32V307VCT6 驱动ST7735 LCD的C代码

[复制链接]
 楼主| wang6623 发表于 2023-10-29 02:21 | 显示全部楼层 |阅读模式
以下是一个使用C语言编写的驱动ST7735 LCD的示例代码:
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include "stm32f4xx.h"

  4. // 定义SPI接口的引脚和端口
  5. #define SPI_PORT GPIOC
  6. #define SPI_CLK_PIN GPIO_Pin_10
  7. #define SPI_MOSI_PIN GPIO_Pin_12

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

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

  14. // 定义SPI控制器
  15. #define SPIx SPI3

  16. void SPI_Config(void)
  17. {
  18.     SPI_InitTypeDef SPI_InitStructure;
  19.     GPIO_InitTypeDef GPIO_InitStructure;

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

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

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

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

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

  43.     // 配置SPI控制器
  44.     SPI_I2S_DeInit(SPIx);
  45.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  46.     SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  47.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  48.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  49.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  50.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  51.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  52.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  53.     SPI_InitStructure.SPI_CRCPolynomial = 7;
  54.     SPI_Init(SPIx, &SPI_InitStructure);

  55.     SPI_Cmd(SPIx, ENABLE);
  56. }

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

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

  63.     // 发送命令
  64.     SPI_SendData8(SPIx, cmd);
  65.     while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY) == SET);
  66. }

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

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

  73.     // 发送数据
  74.     SPI_SendData8(SPIx, data);
  75.     while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY) == SET);
  76. }

  77. void LCD_Reset(void)
  78. {
  79.     // 复位LCD
  80.     GPIO_ResetBits(RST_PORT, RST_PIN);
  81.     delay_ms(100);
  82.     GPIO_SetBits(RST_PORT, RST_PIN);
  83.     delay_ms(100);
  84. }

  85. void LCD_Init(void)
  86. {
  87.     LCD_Reset();
  88.     SPI_SendCommand(0x11); // Sleep Out
  89.     delay_ms(100);
  90.     SPI_SendCommand(0xB1); // Frame Rate Control
  91.     SPI_SendData(0x01);
  92.     SPI_SendData(0x2C);
  93.     SPI_SendData(0x2D);
  94.     SPI_SendCommand(0xB2); // Frame Rate Control
  95.     SPI_SendData(0x01);
  96.     SPI_SendData(0x2C);
  97.     SPI_SendData(0x2D);
  98.     SPI_SendCommand(0xB3); // Frame Rate Control
  99.     SPI_SendData(0x01);
  100.     SPI_SendData(0x2C);
  101.     SPI_SendData(0x2D);
  102.     SPI_SendData(0x01);
  103.     SPI_SendData(0x2C);
  104.     SPI_SendData(0x2D);
  105.     SPI_SendCommand(0xB4); // Display Inversion Control
  106.     SPI_SendData(0x07);
  107.     SPI_SendCommand(0xC0); // Power Control 1
  108.     SPI_SendData(0xA2);
  109.     SPI_SendData(0x02);
  110.     SPI_SendData(0x84);
  111.     SPI_SendCommand(0xC1); // Power Control 2
  112.     SPI_SendData(0xC5);
  113.     SPI_SendCommand(0xC2); // Power Control 3
  114.     SPI_SendData(0x0A);
  115.     SPI_SendData(0x00);
  116.     SPI_SendCommand(0xC3); // Power Control 4
  117.     SPI_SendData(0x8A);
  118.     SPI_SendData(0x2A);
  119.     SPI_SendCommand(0xC4); // Power Control 5
  120.     SPI_SendData(0x8A);
  121.     SPI_SendData(0xEE);
  122.     SPI_SendCommand(0xC5); // VCOM Control 1
  123.     SPI_SendData(0x0E);
  124.     SPI_SendCommand(0x36); // Memory Access Control
  125.     SPI_SendData(0xC8);
  126.     SPI_SendCommand(0x3A); // COLMOD Pixel Format Set
  127.     SPI_SendData(0x05);
  128.     SPI_SendCommand(0x2A); // Column Address Set
  129.     SPI_SendData(0x00);
  130.     SPI_SendData(0x02);
  131.     SPI_SendData(0x00);
  132.     SPI_SendData(0x7F);
  133.     SPI_SendCommand(0x2B); // Page Address Set
  134.     SPI_SendData(0x00);
  135.     SPI_SendData(0x01);
  136.     SPI_SendData(0x00);
  137.     SPI_SendData(0x9F);
  138.     SPI_SendCommand(0x29); // Display ON
  139. }

  140. void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color)
  141. {
  142.     SPI_SendCommand(0x2A); // Column Address Set
  143.     SPI_SendData((x >> 8) & 0xFF);
  144.     SPI_SendData(x & 0xFF);
  145.     SPI_SendData(((x + 1) >> 8) & 0xFF);
  146.     SPI_SendData((x + 1) & 0xFF);
  147.     SPI_SendCommand(0x2B); // Page Address Set
  148.     SPI_SendData((y >> 8) & 0xFF);
  149.     SPI_SendData(y & 0xFF);
  150.     SPI_SendData(((y + 1) >> 8) & 0xFF);
  151.     SPI_SendData((y + 1) & 0xFF);
  152.     SPI_SendCommand(0x2C); // Memory Write
  153.     SPI_SendData((color >> 8) & 0xFF);
  154.     SPI_SendData(color & 0xFF);
  155. }

  156. void LCD_FillRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
  157. {
  158.     uint16_t i, j;
  159.     SPI_SendCommand(0x2A); // Column Address Set
  160.     SPI_SendData((x >> 8) & 0xFF);
  161.     SPI_SendData(x & 0xFF);
  162.     SPI_SendData(((x + width - 1) >> 8) & 0xFF);
  163.     SPI_SendData((x + width - 1) & 0xFF);
  164.     SPI_SendCommand(0x2B); // Page Address Set
  165.     SPI_SendData((y >> 8) & 0xFF);
  166.     SPI_SendData(y & 0xFF);
  167.     SPI_SendData(((y + height - 1) >> 8) & 0xFF);
  168.     SPI_SendData((y + height - 1) & 0xFF);
  169.     SPI_SendCommand(0x2C); // Memory Write
  170.     for (i = 0; i < width; i++) {
  171.         for (j = 0; j < height; j++) {
  172.             SPI_SendData((color >> 8) & 0xFF);
  173.             SPI_SendData(color & 0xFF);
  174.         }
  175.     }
  176. }

  177. void delay_ms(uint32_t ms)
  178. {
  179.     volatile uint32_t nCount;

  180.     RCC_ClocksTypeDef RCC_Clocks;
  181.     RCC_GetClocksFreq(&RCC_Clocks);

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

  185. int main(void)
  186. {
  187.     SPI_Config();
  188.     LCD_Init();

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

  191.     while (1) {

  192.     }
  193. }


 楼主| wang6623 发表于 2023-10-29 02:22 | 显示全部楼层
这个代码使用STM32的SPI3接口连接到ST7735 LCD,页面显示一个红色的矩形框。你可以根据需要修改代码来支持英文、画图和汉字显示。请确保在使用之前正确配置STM32的GPIO引脚和SPI控制器。
MessageRing 发表于 2023-10-30 12:16 | 显示全部楼层
其他系列可以用吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

615

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部