打印
[STM32L5]

【STM32L562E-DK试用】学习FMC驱动LCD屏幕

[复制链接]
716|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
学习了@yuyy1989https://bbs.21ic.com/icview-3429636-1-1.html
的贴
新建cubeMX工程
时钟设置为100MHz,方便计算

设置为这个值方便计算,实际上,这么算就是1个周期是10nS

实测,手册规定最低是10ns,那么你一定不能用10ns,要大于它,这里设置2个周期就是20ns就可以满足要求了
启用FMC,配置如下图所示

查看GPIO配置

发现GPIO就是按照开发板的手册原理图默认的,那么就不用再修改了
生成工程
完善代码
参考了yuyy1989的测试代码
并学习,在头文件main.h中,MX已经自动设置好了对应的引脚宏,跟原理图是一样的。应该原理图就是按照默认配置来做的。

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * [url=home.php?mod=space&uid=288409]@file[/url]           : main.c
  * [url=home.php?mod=space&uid=247401]@brief[/url]          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#define LCD_CMD_ADDR  0x60000000
#define LCD_DATA_ADDR 0x60000002
void LCD_WriteData(uint16_t data)
{
    *(__IO uint16_t *)LCD_DATA_ADDR = data;
}
void LCD_WriteCMD(uint16_t cmd)
{
    *(__IO uint16_t *)LCD_CMD_ADDR = cmd;
}
uint16_t ReadData(void)
{
    uint16_t data;
    data = *(__IO uint16_t *)LCD_DATA_ADDR;
    return data;
}
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

SRAM_HandleTypeDef hsram1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_FMC_Init(void);
static void MX_ICACHE_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

void LCD_Init(void)
{
    LL_GPIO_ResetOutputPin(LCD_PWR_ON_GPIO_Port,LCD_PWR_ON_Pin);
   
    LL_GPIO_ResetOutputPin(LCD_RST_GPIO_Port,LCD_RST_Pin);
    LL_mDelay(1);
    LL_GPIO_SetOutputPin(LCD_RST_GPIO_Port,LCD_RST_Pin);
    LL_mDelay(120);
   
    LCD_WriteCMD(0x10);
    LL_mDelay(10);
    //软复位
    LCD_WriteCMD(0x01);
    LL_mDelay(200);
    LCD_WriteCMD(0x11);
    LL_mDelay(120);
    //屏幕方向 0竖 0xA0横 0xC0倒竖 0x60倒横
    LCD_WriteCMD(0x36);
    LCD_WriteData(0x00);
    //颜色格式 0x03 444 0x05 565 0x06 666
    LCD_WriteCMD(0x3A);
    LCD_WriteData(0x06);
    //反色显示
    LCD_WriteCMD(0x21);
    //列地址
    LCD_WriteCMD(0x2A);
    LCD_WriteData(0x00);
    LCD_WriteData(0x00);
    LCD_WriteData(0x00);
    LCD_WriteData(0xEF);
    //行地址
    LCD_WriteCMD(0x2B);
    LCD_WriteData(0x00);
    LCD_WriteData(0x00);
    LCD_WriteData(0x00);
    LCD_WriteData(0xEF);
    //颜色数据格式
    LCD_WriteCMD(0xB0);
    LCD_WriteData(0x00);
    LCD_WriteData(0xF1);
    //porch
    LCD_WriteCMD(0xB2);
    LCD_WriteData(0x0C);
    LCD_WriteData(0x0C);
    LCD_WriteData(0x00);
    LCD_WriteData(0x33);
    LCD_WriteData(0x33);
    //gate
    LCD_WriteCMD(0xB7);
    LCD_WriteData(0x35);
    //vcom
    LCD_WriteCMD(0xBB);
    LCD_WriteData(0x1F);
    //lcm
    LCD_WriteCMD(0xC0);
    LCD_WriteData(0x2C);
    //VDV and VRH Command Enable
    LCD_WriteCMD(0xC2);
    LCD_WriteData(0x01);
    LCD_WriteData(0xC3);
    //VDV
    LCD_WriteCMD(0xC4);
    LCD_WriteData(0x20);
    //Frame Rate Control in normal mode
    LCD_WriteCMD(0xC6);
    LCD_WriteData(0x0F);
    //Power
    LCD_WriteCMD(0xD0);
    LCD_WriteData(0xA4);
    LCD_WriteData(0xA1);
    //Positive Voltage Gamma
    LCD_WriteCMD(0xE0);
    LCD_WriteData(0xD0);
    LCD_WriteData(0x08);
    LCD_WriteData(0x11);
    LCD_WriteData(0x08);
    LCD_WriteData(0x0C);
    LCD_WriteData(0x15);
    LCD_WriteData(0x39);
    LCD_WriteData(0x33);
    LCD_WriteData(0x50);
    LCD_WriteData(0x36);
    LCD_WriteData(0x13);
    LCD_WriteData(0x14);
    LCD_WriteData(0x29);
    LCD_WriteData(0x2D);
    //Negative Voltage Gamma
    LCD_WriteCMD(0xE1);
    LCD_WriteData(0xD0);
    LCD_WriteData(0x08);
    LCD_WriteData(0x10);
    LCD_WriteData(0x08);
    LCD_WriteData(0x06);
    LCD_WriteData(0x06);
    LCD_WriteData(0x39);
    LCD_WriteData(0x44);
    LCD_WriteData(0x51);
    LCD_WriteData(0x0B);
    LCD_WriteData(0x16);
    LCD_WriteData(0x14);
    LCD_WriteData(0x2F);
    LCD_WriteData(0x31);
    //TE
    LCD_WriteCMD(0x35);
    LCD_WriteData(0x01);
    //开启显示
    LCD_WriteCMD(0x29);
}

void LCD_SetPos(uint16_t x,uint16_t y)
{
    LCD_WriteCMD(0x2A);
    LCD_WriteData((x>>8)&0xFF);
    LCD_WriteData(x&0xFF);
    LCD_WriteData(0x00);
    LCD_WriteData(0xEF);
   
    LCD_WriteCMD(0x2B);
    LCD_WriteData((y>>8)&0xFF);
    LCD_WriteData(y&0xFF);
    LCD_WriteData(0x00);
    LCD_WriteData(0xEF);
}

void LCD_Test(void)
{
    uint8_t r,g,b;
    uint16_t rgb[2];
    uint8_t i = 0;
    uint8_t j = 0;
    while(i < 240)
    {
        LCD_SetPos(0,i);
        if(i<63 || i >188)
        {
            r = 252 - 4*(i%63);
            g = 252 - r;
            b = 0;
        }
        else if(i<126)
        {
            g = 252 - 4*(i%63);
            b = 252 - g;
            r = 0;
        }
        else if(i<189)
        {
            b = 252 - 4*(i%63);
            r = 252 - b;
            g = 0;
        }
        rgb[0] = (r<<8)|g;
        rgb[1] = (b<<8);
        j = 0;
        LCD_WriteCMD(0x2C);
        while(j < 240)
        {
            LCD_WriteData(rgb[0]);
            LCD_WriteData(rgb[1]);
            j+=1;
        }
        i+=1;
    }
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_FMC_Init();
  MX_ICACHE_Init();
  /* USER CODE BEGIN 2 */
        LCD_Init();
        LCD_Test();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);
  while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)
  {
  }

  LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE0);
  LL_RCC_MSI_Enable();

   /* Wait till MSI is ready */
  while(LL_RCC_MSI_IsReady() != 1)
  {
  }

  LL_RCC_MSI_EnableRangeSelection();
  LL_RCC_MSI_SetRange(LL_RCC_MSIRANGE_11);
  LL_RCC_MSI_SetCalibTrimming(0);
  LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_12, 50, LL_RCC_PLLR_DIV_2);
  LL_RCC_PLL_EnableDomain_SYS();
  LL_RCC_PLL_Enable();

   /* Wait till PLL is ready */
  while(LL_RCC_PLL_IsReady() != 1)
  {
  }

   /* Intermediate AHB prescaler 2 when target frequency clock is higher than 80 MHz */
   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2);

  LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);

   /* Wait till System clock is ready */
  while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
  {
  }

  /* Insure 1us transition state at intermediate medium speed clock*/
  for (__IO uint32_t i = (RCC_MAX_FREQUENCY_MHZ >> 1); i !=0; i--);

  LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
  LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
  LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
  LL_SetSystemCoreClock(100000000);

   /* Update the time base */
  if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief ICACHE Initialization Function
  * @param None
  * @retval None
  */
static void MX_ICACHE_Init(void)
{

  /* USER CODE BEGIN ICACHE_Init 0 */

  /* USER CODE END ICACHE_Init 0 */

  /* USER CODE BEGIN ICACHE_Init 1 */

  /* USER CODE END ICACHE_Init 1 */

  /** Enable instruction cache in 1-way (direct mapped cache)
  */
  if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_ICACHE_Enable() != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ICACHE_Init 2 */

  /* USER CODE END ICACHE_Init 2 */

}

/* FMC initialization function */
static void MX_FMC_Init(void)
{

  /* USER CODE BEGIN FMC_Init 0 */

  /* USER CODE END FMC_Init 0 */

  FMC_NORSRAM_TimingTypeDef Timing = {0};
  FMC_NORSRAM_TimingTypeDef ExtTiming = {0};

  /* USER CODE BEGIN FMC_Init 1 */

  /* USER CODE END FMC_Init 1 */

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FMC_NORSRAM_DEVICE;
  hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
  hsram1.Init.NBLSetupTime = 0;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  hsram1.Init.MaxChipSelectPulse = DISABLE;
  /* Timing */
  Timing.AddressSetupTime = 0;
  Timing.AddressHoldTime = 15;
  Timing.DataSetupTime = 2;
  Timing.DataHoldTime = 2;
  Timing.BusTurnAroundDuration = 2;
  Timing.CLKDivision = 16;
  Timing.DataLatency = 17;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */
  ExtTiming.AddressSetupTime = 0;
  ExtTiming.AddressHoldTime = 15;
  ExtTiming.DataSetupTime = 2;
  ExtTiming.DataHoldTime = 1;
  ExtTiming.BusTurnAroundDuration = 2;
  ExtTiming.CLKDivision = 16;
  ExtTiming.DataLatency = 17;
  ExtTiming.AccessMode = FMC_ACCESS_MODE_A;

  if (HAL_SRAM_Init(&hsram1, &Timing, &ExtTiming) != HAL_OK)
  {
    Error_Handler( );
  }

  /* USER CODE BEGIN FMC_Init 2 */

  /* USER CODE END FMC_Init 2 */
}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOG);
  LL_PWR_EnableVddIO2();
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOF);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH);

  /**/
  LL_GPIO_ResetOutputPin(GPIOG, LED_GREEN_Pin|BLE_RSTN_Pin|AUDIO_RESETN_Pin);

  /**/
  LL_GPIO_ResetOutputPin(LED_RED_GPIO_Port, LED_RED_Pin);

  /**/
  LL_GPIO_ResetOutputPin(UCPD_DBn_GPIO_Port, UCPD_DBn_Pin);

  /**/
  LL_GPIO_ResetOutputPin(LCD_TE_GPIO_Port, LCD_TE_Pin);

  /**/
  LL_GPIO_ResetOutputPin(LCD_PWR_ON_GPIO_Port, LCD_PWR_ON_Pin);

  /**/
  LL_GPIO_ResetOutputPin(GPIOF, LCD_RST_Pin|STMOD_SEL_12_Pin|STMOD_SEL_34_Pin|CTP_RST_Pin);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_5|LL_GPIO_PIN_3|LL_GPIO_PIN_4|LL_GPIO_PIN_2
                          |LL_GPIO_PIN_6;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_13;
  LL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LCD_BL_PWM_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_14;
  LL_GPIO_Init(LCD_BL_PWM_GPIO_Port, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LED_GREEN_Pin|BLE_RSTN_Pin|AUDIO_RESETN_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
  LL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_10|LL_GPIO_PIN_9
                          |LL_GPIO_PIN_8;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_15|VBUS_SENSE_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_12|LL_GPIO_PIN_11;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_10;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = USER_BUTTON_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(USER_BUTTON_GPIO_Port, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LED_RED_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(LED_RED_GPIO_Port, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = UCPD_DBn_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(UCPD_DBn_GPIO_Port, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = USART1_TX_Pin|USART1_RX_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LCD_TE_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(LCD_TE_GPIO_Port, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LCD_PWR_ON_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(LCD_PWR_ON_GPIO_Port, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_3|LL_GPIO_PIN_1;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_10;
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_7;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  LL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_4|LL_GPIO_PIN_2|LL_GPIO_PIN_3|BLE_CSN_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_5;
  LL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_3;
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LCD_RST_Pin|STMOD_SEL_12_Pin|STMOD_SEL_34_Pin|CTP_RST_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_7|LL_GPIO_PIN_3|LL_GPIO_PIN_6;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_10;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_1|LL_GPIO_PIN_0;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_10;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_10|LL_GPIO_PIN_11;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_8;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = UCPD_FLT_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(UCPD_FLT_GPIO_Port, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_12;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /**/
  LL_EXTI_SetEXTISource(LL_EXTI_EXTI_PORTF, LL_EXTI_EXTI_LINE3);

  /**/
  LL_EXTI_SetEXTISource(LL_EXTI_EXTI_PORTF, LL_EXTI_EXTI_LINE2);

  /**/
  LL_EXTI_SetEXTISource(LL_EXTI_EXTI_PORTF, LL_EXTI_EXTI_LINE1);

  /**/
  LL_EXTI_SetEXTISource(LL_EXTI_EXTI_PORTG, LL_EXTI_EXTI_LINE6);

  /**/
  EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_3;
  EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  EXTI_InitStruct.LineCommand = ENABLE;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  LL_EXTI_Init(&EXTI_InitStruct);

  /**/
  EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_2;
  EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  EXTI_InitStruct.LineCommand = ENABLE;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  LL_EXTI_Init(&EXTI_InitStruct);

  /**/
  EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_1;
  EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  EXTI_InitStruct.LineCommand = ENABLE;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  LL_EXTI_Init(&EXTI_InitStruct);

  /**/
  EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_6;
  EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  EXTI_InitStruct.LineCommand = ENABLE;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  LL_EXTI_Init(&EXTI_InitStruct);

  /**/
  LL_GPIO_SetPinPull(GYRO_ACC_INT_GPIO_Port, GYRO_ACC_INT_Pin, LL_GPIO_PULL_NO);

  /**/
  LL_GPIO_SetPinPull(SDIO_DETECT_GPIO_Port, SDIO_DETECT_Pin, LL_GPIO_PULL_NO);

  /**/
  LL_GPIO_SetPinPull(CTP_INT_GPIO_Port, CTP_INT_Pin, LL_GPIO_PULL_NO);

  /**/
  LL_GPIO_SetPinPull(BLE_INT_GPIO_Port, BLE_INT_Pin, LL_GPIO_PULL_NO);

  /**/
  LL_GPIO_SetPinMode(GYRO_ACC_INT_GPIO_Port, GYRO_ACC_INT_Pin, LL_GPIO_MODE_INPUT);

  /**/
  LL_GPIO_SetPinMode(SDIO_DETECT_GPIO_Port, SDIO_DETECT_Pin, LL_GPIO_MODE_INPUT);

  /**/
  LL_GPIO_SetPinMode(CTP_INT_GPIO_Port, CTP_INT_Pin, LL_GPIO_MODE_INPUT);

  /**/
  LL_GPIO_SetPinMode(BLE_INT_GPIO_Port, BLE_INT_Pin, LL_GPIO_MODE_INPUT);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
编译烧录,可以看到红绿蓝色条了

原来使用8080接口这么容易
关于写数据和写指令地址也可以参考BSP示例里的,
#define LCD_REGISTER_ADDR FMC_BANK1_1
#define LCD_DATA_ADDR     (FMC_BANK1_1 | 0x00000002UL)

相关头文件里是
/* External memories base addresses - Not aliased */
#define FMC_BASE              (0x60000000UL) /*!< FMC base address */
#define OCTOSPI1_BASE         (0x90000000UL) /*!< OCTOSPI1 memories accessible over AHB base address */

#define FMC_BANK1             FMC_BASE
#define FMC_BANK1_1           FMC_BANK1
有了读写指令就可以让相关绘图和字符函数调用他们来实现各种显示效果了。

使用特权

评论回复
沙发
dongnanxibei| | 2025-2-7 17:52 | 只看该作者
那要是自己做板子,也这么做IO链接,那就开发软件也很容易了

使用特权

评论回复
板凳
dongnanxibei| | 2025-2-7 17:55 | 只看该作者
这个接口这么用,貌似比那个SPI还容易,不知道这个方法能否用DMA

使用特权

评论回复
地板
dongnanxibei| | 2025-2-7 20:12 | 只看该作者
试了一下可以。

使用特权

评论回复
5
gaoyang9992006|  楼主 | 2025-2-7 20:15 | 只看该作者
完善几个绘图函数
#define ST77XX_BLACK 0x0000
#define ST77XX_WHITE 0xFFFF
#define ST77XX_RED 0xF800
#define ST77XX_GREEN 0x07E0
#define ST77XX_BLUE 0x001F
#define ST77XX_CYAN 0x07FF
#define ST77XX_MAGENTA 0xF81F
#define ST77XX_YELLOW 0xFFE0
#define ST77XX_ORANGE 0xFC00

void test(void)
{
        for(int i=0;i<240;i++)
        for(int j=0;j<240;j++)
        {
                LCD_SetPos(i,j);
                LCD_WriteCMD(0x2C);
                LCD_WriteData(ST77XX_YELLOW);
        }
}

#define LCD_WIDTH  240
#define LCD_HEIGHT 240

void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
    if (x >= LCD_WIDTH || y >= LCD_HEIGHT) return;  // 边界检查
    LCD_SetPos(x, y);
    LCD_WriteCMD(0x2C);
    LCD_WriteData(color);
}

void LCD_DrawHLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
    for (uint16_t i = 0; i < length; i++) {
        LCD_DrawPixel(x + i, y, color);
    }
}

void LCD_DrawVLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
    for (uint16_t i = 0; i < length; i++) {
        LCD_DrawPixel(x, y + i, color);
    }
}

void LCD_DrawRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) {
    LCD_DrawHLine(x, y, width, color);
    LCD_DrawHLine(x, y + height - 1, width, color);
    LCD_DrawVLine(x, y, height, color);
    LCD_DrawVLine(x + width - 1, y, height, color);
}

void LCD_FillRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) {
    for (uint16_t i = 0; i < height; i++) {
        LCD_DrawHLine(x, y + i, width, color);
    }
}

void LCD_DrawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
    int16_t x = r, y = 0;
    int16_t err = 0;

    while (x >= y) {
        LCD_DrawPixel(x0 + x, y0 + y, color);
        LCD_DrawPixel(x0 + y, y0 + x, color);
        LCD_DrawPixel(x0 - y, y0 + x, color);
        LCD_DrawPixel(x0 - x, y0 + y, color);
        LCD_DrawPixel(x0 - x, y0 - y, color);
        LCD_DrawPixel(x0 - y, y0 - x, color);
        LCD_DrawPixel(x0 + y, y0 - x, color);
        LCD_DrawPixel(x0 + x, y0 - y, color);
        
        y++;
        if (err <= 0) {
            err += 2 * y + 1;
        } else {
            x--;
            err += 2 * (y - x) + 1;
        }
    }
}

void LCD_FillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
    for (int16_t y = -r; y <= r; y++) {
        for (int16_t x = -r; x <= r; x++) {
            if (x * x + y * y <= r * r) {
                LCD_DrawPixel(x0 + x, y0 + y, color);
            }
        }
    }
}


使用下面代码测试
 LCD_Init();
        LCD_FillRect(0,0,240,240,ST77XX_BLACK);
        LCD_FillCircle(120,120,50,ST77XX_GREEN);
        LCD_DrawRect(10,10,200,200,ST77XX_CYAN);
        LCD_DrawRect(100,100,20,30,ST77XX_MAGENTA);        


运行效果

使用特权

评论回复
6
gaoyang9992006|  楼主 | 2025-2-7 20:20 | 只看该作者
跟GPT沟通优化相关函数
void LCD_DrawHLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
    if (x + length > LCD_WIDTH) length = LCD_WIDTH - x; // 防止越界
    LCD_SetPos(x, y);
    LCD_WriteCMD(0x2C);
    for (uint16_t i = 0; i < length; i++) {
        LCD_WriteData(color);
    }
}

void LCD_DrawVLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
    if (y + length > LCD_HEIGHT) length = LCD_HEIGHT - y; // 防止越界
    for (uint16_t i = 0; i < length; i++) {
        LCD_DrawPixel(x, y + i, color);
    }
}


使用特权

评论回复
7
gaoyang9992006|  楼主 | 2025-2-7 21:29 | 只看该作者
完善字符显示函数


// 6x8点阵字符集
const char font6x8_ascii[128][6] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x00
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x01
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x02
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x03
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x04
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x05
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x06
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x07
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x08
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x09
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0A
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0B
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0C
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0D
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0E
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0F
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x10
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x11
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x12
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x13
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x14
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x15
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x16
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x17
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x18
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x19
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1A
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1B
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1C
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1D
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1E
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1F
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x20 (space)
    {0x00, 0x00, 0x00, 0x2F, 0x00, 0x00},  // 0x21 (!)
    {0x00, 0x00, 0x03, 0x00, 0x03, 0x00},  // 0x22 (")
    {0x00, 0x14, 0x3E, 0x14, 0x3E, 0x14},  // 0x23 (#)
    {0x00, 0x04, 0x2A, 0x7F, 0x2A, 0x10},  // 0x24 ($)
    {0x00, 0x26, 0x10, 0x08, 0x04, 0x32},  // 0x25 (%)
    {0x00, 0x1A, 0x25, 0x29, 0x10, 0x28},  // 0x26 (&)
    {0x00, 0x00, 0x00, 0x03, 0x00, 0x00},  // 0x27 (')
    {0x00, 0x00, 0x3E, 0x41, 0x41, 0x00},  // 0x28 (()
    {0x00, 0x00, 0x41, 0x41, 0x3E, 0x00},  // 0x29 ())
    {0x00, 0x28, 0x18, 0x0E, 0x18, 0x28},  // 0x2A (*)
    {0x00, 0x08, 0x08, 0x3E, 0x08, 0x08},  // 0x2B (+)
    {0x00, 0x00, 0x20, 0x10, 0x00, 0x00},  // 0x2C (,)
    {0x00, 0x08, 0x08, 0x08, 0x08, 0x08},  // 0x2D (-)
    {0x00, 0x00, 0x00, 0x10, 0x00, 0x00},  // 0x2E (.)
    {0x00, 0x20, 0x10, 0x08, 0x04, 0x02},  // 0x2F (/)
    {0x00, 0x00, 0x1E, 0x21, 0x21, 0x1E},  // 0x30 (0)
    {0x00, 0x00, 0x00, 0x22, 0x3F, 0x20},  // 0x31 (1)
    {0x00, 0x00, 0x22, 0x31, 0x29, 0x26},  // 0x32 (2)
    {0x00, 0x00, 0x12, 0x21, 0x25, 0x1A},  // 0x33 (3)
    {0x00, 0x00, 0x0C, 0x0A, 0x3F, 0x08},  // 0x34 (4)
    {0x00, 0x00, 0x17, 0x25, 0x25, 0x19},  // 0x35 (5)
    {0x00, 0x00, 0x1C, 0x26, 0x25, 0x18},  // 0x36 (6)
    {0x00, 0x00, 0x01, 0x39, 0x05, 0x03},  // 0x37 (7)
    {0x00, 0x00, 0x1A, 0x25, 0x25, 0x1A},  // 0x38 (8)
    {0x00, 0x00, 0x06, 0x09, 0x29, 0x1E},  // 0x39 (9)
    {0x00, 0x00, 0x00, 0x14, 0x00, 0x00},  // 0x3A (:)
    {0x00, 0x00, 0x20, 0x14, 0x00, 0x00},  // 0x3B (;)
    {0x00, 0x00, 0x08, 0x14, 0x22, 0x00},  // 0x3C (<)
    {0x00, 0x00, 0x14, 0x14, 0x14, 0x00},  // 0x3D (=)
    {0x00, 0x00, 0x22, 0x14, 0x08, 0x00},  // 0x3E (>)
    {0x00, 0x02, 0x01, 0x29, 0x06, 0x00},  // 0x3F (?)
    {0x00, 0x1E, 0x21, 0x2D, 0x2E, 0x00},  // 0x40 (@)
    {0x00, 0x30, 0x0C, 0x0B, 0x0C, 0x30},  // 0x41 (A)
    {0x00, 0x00, 0x3F, 0x25, 0x25, 0x1A},  // 0x42 (B)
    {0x00, 0x00, 0x1E, 0x21, 0x21, 0x12},  // 0x43 (C)
    {0x00, 0x00, 0x3F, 0x21, 0x21, 0x1E},  // 0x44 (D)
    {0x00, 0x00, 0x3F, 0x25, 0x25, 0x25},  // 0x45 (E)
    {0x00, 0x00, 0x3F, 0x05, 0x05, 0x05},  // 0x46 (F)
    {0x00, 0x00, 0x1E, 0x21, 0x29, 0x1A},  // 0x47 (G)
    {0x00, 0x00, 0x3F, 0x04, 0x04, 0x3F},  // 0x48 (H)
    {0x00, 0x00, 0x21, 0x3F, 0x21, 0x00},  // 0x49 (I)
    {0x00, 0x18, 0x20, 0x21, 0x1F, 0x00},  // 0x4A (J)
    {0x00, 0x00, 0x3F, 0x0C, 0x12, 0x21},  // 0x4B (K)
    {0x00, 0x00, 0x3F, 0x20, 0x20, 0x20},  // 0x4C (L)
    {0x00, 0x3F, 0x06, 0x08, 0x06, 0x3F},  // 0x4D (M)
    {0x00, 0x00, 0x3F, 0x06, 0x18, 0x3F},  // 0x4E (N)
    {0x00, 0x00, 0x1E, 0x21, 0x21, 0x1E},  // 0x4F (O)
    {0x00, 0x00, 0x3F, 0x09, 0x09, 0x06},  // 0x50 (P)
    {0x00, 0x1E, 0x21, 0x21, 0x5E, 0x00},  // 0x51 (Q)
    {0x00, 0x00, 0x3F, 0x09, 0x19, 0x26},  // 0x52 (R)
    {0x00, 0x00, 0x12, 0x25, 0x29, 0x12},  // 0x53 (S)
    {0x00, 0x01, 0x01, 0x3F, 0x01, 0x01},  // 0x54 (T)
    {0x00, 0x1F, 0x20, 0x20, 0x20, 0x1F},  // 0x55 (U)
    {0x00, 0x0F, 0x10, 0x20, 0x10, 0x0F},  // 0x56 (V)
    {0x00, 0x1F, 0x20, 0x1C, 0x20, 0x1F},  // 0x57 (W)
    {0x00, 0x21, 0x12, 0x0C, 0x12, 0x21},  // 0x58 (X)
    {0x00, 0x03, 0x04, 0x38, 0x04, 0x03},  // 0x59 (Y)
    {0x00, 0x00, 0x31, 0x29, 0x25, 0x23},  // 0x5A (Z)
    {0x00, 0x00, 0x3F, 0x21, 0x21, 0x00},  // 0x5B ([)
    {0x00, 0x02, 0x04, 0x08, 0x10, 0x20},  // 0x5C (\)
    {0x00, 0x00, 0x21, 0x21, 0x3F, 0x00},  // 0x5D (])
    {0x00, 0x04, 0x02, 0x01, 0x02, 0x04},  // 0x5E (^)
    {0x00, 0x40, 0x40, 0x40, 0x40, 0x40},  // 0x5F (_)
    {0x00, 0x00, 0x00, 0x01, 0x02, 0x00},  // 0x60 (`)
    {0x00, 0x18, 0x24, 0x24, 0x18, 0x20},  // 0x61 (a)
    {0x00, 0x00, 0x3F, 0x24, 0x24, 0x18},  // 0x62 (b)
    {0x00, 0x00, 0x18, 0x24, 0x24, 0x00},  // 0x63 (c)
    {0x00, 0x00, 0x18, 0x24, 0x24, 0x3F},  // 0x64 (d)
    {0x00, 0x00, 0x1C, 0x2A, 0x2A, 0x0C},  // 0x65 (e)
    {0x00, 0x04, 0x04, 0x3E, 0x05, 0x05},  // 0x66 (f)
    {0x00, 0x00, 0x0C, 0x52, 0x52, 0x3E},  // 0x67 (g)
    {0x00, 0x00, 0x3F, 0x04, 0x04, 0x38},  // 0x68 (h)
    {0x00, 0x00, 0x24, 0x3D, 0x20, 0x00},  // 0x69 (i)
    {0x00, 0x20, 0x40, 0x44, 0x3D, 0x00},  // 0x6A (j)
    {0x00, 0x00, 0x3F, 0x08, 0x14, 0x22},  // 0x6B (k)
    {0x00, 0x00, 0x1F, 0x20, 0x20, 0x10},  // 0x6C (l)
    {0x00, 0x3E, 0x04, 0x18, 0x04, 0x3E},  // 0x6D (m)
    {0x00, 0x00, 0x3C, 0x02, 0x02, 0x3C},  // 0x6E (n)
    {0x00, 0x00, 0x1C, 0x22, 0x22, 0x1C},  // 0x6F (o)
    {0x00, 0x00, 0x7E, 0x12, 0x12, 0x0C},  // 0x70 (p)
    {0x00, 0x00, 0x0C, 0x12, 0x12, 0x7E},  // 0x71 (q)
    {0x00, 0x00, 0x04, 0x38, 0x04, 0x04},  // 0x72 (r)
    {0x00, 0x00, 0x04, 0x2A, 0x2A, 0x10},  // 0x73 (s)
    {0x00, 0x00, 0x04, 0x1E, 0x24, 0x10},  // 0x74 (t)
    {0x00, 0x1C, 0x20, 0x20, 0x20, 0x1C},  // 0x75 (u)
    {0x00, 0x0C, 0x10, 0x20, 0x10, 0x0C},  // 0x76 (v)
    {0x00, 0x1C, 0x20, 0x18, 0x20, 0x1C},  // 0x77 (w)
    {0x00, 0x22, 0x14, 0x08, 0x14, 0x22},  // 0x78 (x)
    {0x00, 0x04, 0x48, 0x30, 0x08, 0x04},  // 0x79 (y)
    {0x00, 0x00, 0x24, 0x34, 0x2C, 0x24},  // 0x7A (z)
    {0x00, 0x08, 0x08, 0x36, 0x41, 0x41},  // 0x7B ({)
    {0x00, 0x00, 0x00, 0x7F, 0x00, 0x00},  // 0x7C (|)
    {0x00, 0x41, 0x41, 0x36, 0x08, 0x08},  // 0x7D (})
    {0x00, 0x08, 0x04, 0x08, 0x10, 0x08},  // 0x7E (~)
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}   // 0x7F
};
#include <stdint.h>
#include <string.h>
void LCD_DrawChar(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bg_color)
{
    if (ch < ' ' || ch > '~') return; // 检查字符范围

    uint8_t char_data[6];
    memcpy(char_data, font6x8_ascii[ch], 6);

    for (uint8_t row = 0; row < 8; row++) {
        for (uint8_t col = 0; col < 6; col++) {
            if (char_data[col] & (1 << row)) {
                LCD_DrawPixel(x + col, y + row, color);
            } else {
                LCD_DrawPixel(x + col, y + row, bg_color);
            }
        }
    }
}

void LCD_DrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bg_color)
{
    while (*str) {
        LCD_DrawChar(x, y, *str, color, bg_color);
        x += 7; // 每个字符宽度为6,加上1个像素的间距
        str++;
    }
}


使用特权

评论回复
8
gaoyang9992006|  楼主 | 2025-2-7 21:50 | 只看该作者
void LCD_DrawChar2(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bg_color)
{
    if (ch < ' ' || ch > '~') return; // 检查字符范围

    uint8_t char_data[16];
    memcpy(char_data, font8x16[ch], 16);

    for (uint8_t row = 0; row < 16; row++) {
        for (uint8_t col = 0; col < 8; col++) {
            if (char_data[row] & (1 << (7 - col))) {
                LCD_DrawPixel(x + col, y + row, color);
            } else {
                LCD_DrawPixel(x + col, y + row, bg_color);
            }
        }
    }
}

void LCD_DrawString2(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bg_color)
{
    while (*str) {
        LCD_DrawChar2(x, y, *str, color, bg_color);
        x += 7; // 每个字符宽度为6,加上1个像素的间距
        str++;
    }
}
完善8*16点阵字符显示
unsigned char font8x16[][16] = {
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x00,
                { 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD, 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,  },       //0x01,
                { 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF, 0xFF, 0xC3, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00,  },       //0x02,
                { 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,  },       //0x03,
                { 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x04,
                { 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7, 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x05,
                { 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x06,
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x07,
                { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  },       //0x08,
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x09,
                { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  },       //0x0A,
                { 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,  },       //0x0B,
                { 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x0C,
                { 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00,  },       //0x0D,
                { 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00, 0x00, 0x00,  },       //0x0E,
                { 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x0F,
                { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,  },       //0x10,
                { 0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0xFE, 0x3E, 0x1E, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,  },       //0x11,
                { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x12,
                { 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,  },       //0x13,
                { 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,  },       //0x14,
                { 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00,  },       //0x15,
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x16,
                { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,  },       //0x17,
                { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x18,
                { 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x19,
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1A,
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1B, esc
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1C,
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C, 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1D,
                { 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1E,
                { 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1F,
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x20, ' '
                { 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x21, '!'
                { 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x22, '"'
                { 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,  },       //0x23, '#'
                { 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,  },       //0x24, '


                { 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x00,  },       //0x25, '%'
                { 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,  },       //0x26, '&'
                { 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x27, '''
                { 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,  },       //0x28, '('
                { 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,  },       //0x29, ')'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x2A, '*'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x2B, '+'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,  },       //0x2C, '
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x2D, '-'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x2E, '.'
                { 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,  },       //0x2F, '/'
                { 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xD6, 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,  },       //0x30, '0'
                { 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,  },       //0x31, '1'
                { 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x32, '2'
                { 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x33, '3'
                { 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,  },       //0x34, '4'
                { 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x35, '5'
                { 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x36, '6'
                { 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,  },       //0x37, '7'
                { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x38, '8'
                { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00,  },       //0x39, '9'
                { 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x3A, ':'
                { 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,  },       //0x3B, ';'
                { 0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00,  },       //0x3C, '<'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x3D, '='
                { 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,  },       //0x3E, '>'
                { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x3F, '?'
                { 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x40, '@'
                { 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x41, 'A'
                { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,  },       //0x42, 'B'
                { 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x43, 'C'
                { 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,  },       //0x44, 'D'
                { 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x45, 'E'
                { 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,  },       //0x46, 'F'
                { 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0x66, 0x3A, 0x00, 0x00, 0x00, 0x00,  },       //0x47, 'G'
                { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x48, 'H'
                { 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x49, 'I'
                { 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,  },       //0x4A, 'J'
                { 0x00, 0x00, 0xE6, 0x66, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,  },       //0x4B, 'K'
                { 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x4C, 'L'
                { 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x4D, 'M'
                { 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x4E, 'N'
                { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x4F, 'O'
                { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,  },       //0x50, 'P'
                { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0C, 0x0E, 0x00, 0x00,  },       //0x51, 'Q'
                { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,  },       //0x52, 'R'
                { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x53, 'S'
                { 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x54, 'T'
                { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x55, 'U'
                { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,  },       //0x56, 'V'
                { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00,  },       //0x57, 'W'
                { 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x7C, 0x38, 0x38, 0x7C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x58, 'X'
                { 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x59, 'Y'
                { 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x5A, 'Z'
                { 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x5B, '['
                { 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,  },       //0x5C, '\'
                { 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x5D, ']'
                { 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x5E, '^'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,  },       //0x5F, '_'
                { 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x60, '`'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,  },       //0x61, 'a'
                { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x62, 'b'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x63, 'c'
                { 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,  },       //0x64, 'd'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x65, 'e'
                { 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,  },       //0x66, 'f'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00,  },       //0x67, 'g'
                { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,  },       //0x68, 'h'
                { 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x69, 'i'
                { 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00,  },       //0x6A, 'j'
                { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,  },       //0x6B, 'k'
                { 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x6C, 'l'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x6D, 'm'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,  },       //0x6E, 'n'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x6F, 'o'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,  },       //0x70, 'p'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00,  },       //0x71, 'q'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x66, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,  },       //0x72, 'r'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x73, 's'
                { 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,  },       //0x74, 't'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,  },       //0x75, 'u'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x76, 'v'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,  },       //0x77, 'w'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x78, 'x'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00,  },       //0x79, 'y'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xCC, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x7A, 'z'
                { 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,  },       //0x7B, '{'
                { 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x7C, '|'
                { 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,  },       //0x7D, '}'
                { 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x7E, '~'
                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x7F, delete
};


使用特权

评论回复
9
玛尼玛尼哄| | 2025-2-8 11:02 | 只看该作者
void LCD_DrawString2(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bg_color)
{
    while (*str) {
        LCD_DrawChar2(x, y, *str, color, bg_color);
        x += 8; // 每个字符宽度为8,加上0个像素的间距
        str++;
    }
}

修改这里,调整字符间距

使用特权

评论回复
10
lulugl| | 2025-2-23 08:53 | 只看该作者
楼主大佬,感谢分享!

使用特权

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

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2019

主题

16230

帖子

217

粉丝