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

[复制链接]
 楼主| gaoyang9992006 发表于 2025-2-7 12:12 | 显示全部楼层 |阅读模式
<
学习了@yuyy1989https://bbs.21ic.com/icview-3429636-1-1.html
的贴
新建cubeMX工程
时钟设置为100MHz,方便计算
8408867a581c9a8b1d.png
设置为这个值方便计算,实际上,这么算就是1个周期是10nS
2410567a58238dfcda.png
实测,手册规定最低是10ns,那么你一定不能用10ns,要大于它,这里设置2个周期就是20ns就可以满足要求了
启用FMC,配置如下图所示
88167a5811479540.png
查看GPIO配置
4347867a5813f69492.png
发现GPIO就是按照开发板的手册原理图默认的,那么就不用再修改了
生成工程
完善代码
参考了yuyy1989的测试代码
并学习,在头文件main.h中,MX已经自动设置好了对应的引脚宏,跟原理图是一样的。应该原理图就是按照默认配置来做的。
7661767a5860c88ca6.png
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * [url=home.php?mod=space&uid=288409]@file[/url]           : main.c
  5.   * [url=home.php?mod=space&uid=247401]@brief[/url]          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * Copyright (c) 2025 STMicroelectronics.
  10.   * All rights reserved.
  11.   *
  12.   * This software is licensed under terms that can be found in the LICENSE file
  13.   * in the root directory of this software component.
  14.   * If no LICENSE file comes with this software, it is provided AS-IS.
  15.   *
  16.   ******************************************************************************
  17.   */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"

  21. /* Private includes ----------------------------------------------------------*/
  22. /* USER CODE BEGIN Includes */
  23. #define LCD_CMD_ADDR  0x60000000
  24. #define LCD_DATA_ADDR 0x60000002
  25. void LCD_WriteData(uint16_t data)
  26. {
  27.     *(__IO uint16_t *)LCD_DATA_ADDR = data;
  28. }
  29. void LCD_WriteCMD(uint16_t cmd)
  30. {
  31.     *(__IO uint16_t *)LCD_CMD_ADDR = cmd;
  32. }
  33. uint16_t ReadData(void)
  34. {
  35.     uint16_t data;
  36.     data = *(__IO uint16_t *)LCD_DATA_ADDR;
  37.     return data;
  38. }
  39. /* USER CODE END Includes */

  40. /* Private typedef -----------------------------------------------------------*/
  41. /* USER CODE BEGIN PTD */

  42. /* USER CODE END PTD */

  43. /* Private define ------------------------------------------------------------*/
  44. /* USER CODE BEGIN PD */

  45. /* USER CODE END PD */

  46. /* Private macro -------------------------------------------------------------*/
  47. /* USER CODE BEGIN PM */

  48. /* USER CODE END PM */

  49. /* Private variables ---------------------------------------------------------*/

  50. SRAM_HandleTypeDef hsram1;

  51. /* USER CODE BEGIN PV */

  52. /* USER CODE END PV */

  53. /* Private function prototypes -----------------------------------------------*/
  54. void SystemClock_Config(void);
  55. static void MX_GPIO_Init(void);
  56. static void MX_FMC_Init(void);
  57. static void MX_ICACHE_Init(void);
  58. /* USER CODE BEGIN PFP */

  59. /* USER CODE END PFP */

  60. /* Private user code ---------------------------------------------------------*/
  61. /* USER CODE BEGIN 0 */

  62. void LCD_Init(void)
  63. {
  64.     LL_GPIO_ResetOutputPin(LCD_PWR_ON_GPIO_Port,LCD_PWR_ON_Pin);
  65.    
  66.     LL_GPIO_ResetOutputPin(LCD_RST_GPIO_Port,LCD_RST_Pin);
  67.     LL_mDelay(1);
  68.     LL_GPIO_SetOutputPin(LCD_RST_GPIO_Port,LCD_RST_Pin);
  69.     LL_mDelay(120);
  70.    
  71.     LCD_WriteCMD(0x10);
  72.     LL_mDelay(10);
  73.     //软复位
  74.     LCD_WriteCMD(0x01);
  75.     LL_mDelay(200);
  76.     LCD_WriteCMD(0x11);
  77.     LL_mDelay(120);
  78.     //屏幕方向 0竖 0xA0横 0xC0倒竖 0x60倒横
  79.     LCD_WriteCMD(0x36);
  80.     LCD_WriteData(0x00);
  81.     //颜色格式 0x03 444 0x05 565 0x06 666
  82.     LCD_WriteCMD(0x3A);
  83.     LCD_WriteData(0x06);
  84.     //反色显示
  85.     LCD_WriteCMD(0x21);
  86.     //列地址
  87.     LCD_WriteCMD(0x2A);
  88.     LCD_WriteData(0x00);
  89.     LCD_WriteData(0x00);
  90.     LCD_WriteData(0x00);
  91.     LCD_WriteData(0xEF);
  92.     //行地址
  93.     LCD_WriteCMD(0x2B);
  94.     LCD_WriteData(0x00);
  95.     LCD_WriteData(0x00);
  96.     LCD_WriteData(0x00);
  97.     LCD_WriteData(0xEF);
  98.     //颜色数据格式
  99.     LCD_WriteCMD(0xB0);
  100.     LCD_WriteData(0x00);
  101.     LCD_WriteData(0xF1);
  102.     //porch
  103.     LCD_WriteCMD(0xB2);
  104.     LCD_WriteData(0x0C);
  105.     LCD_WriteData(0x0C);
  106.     LCD_WriteData(0x00);
  107.     LCD_WriteData(0x33);
  108.     LCD_WriteData(0x33);
  109.     //gate
  110.     LCD_WriteCMD(0xB7);
  111.     LCD_WriteData(0x35);
  112.     //vcom
  113.     LCD_WriteCMD(0xBB);
  114.     LCD_WriteData(0x1F);
  115.     //lcm
  116.     LCD_WriteCMD(0xC0);
  117.     LCD_WriteData(0x2C);
  118.     //VDV and VRH Command Enable
  119.     LCD_WriteCMD(0xC2);
  120.     LCD_WriteData(0x01);
  121.     LCD_WriteData(0xC3);
  122.     //VDV
  123.     LCD_WriteCMD(0xC4);
  124.     LCD_WriteData(0x20);
  125.     //Frame Rate Control in normal mode
  126.     LCD_WriteCMD(0xC6);
  127.     LCD_WriteData(0x0F);
  128.     //Power
  129.     LCD_WriteCMD(0xD0);
  130.     LCD_WriteData(0xA4);
  131.     LCD_WriteData(0xA1);
  132.     //Positive Voltage Gamma
  133.     LCD_WriteCMD(0xE0);
  134.     LCD_WriteData(0xD0);
  135.     LCD_WriteData(0x08);
  136.     LCD_WriteData(0x11);
  137.     LCD_WriteData(0x08);
  138.     LCD_WriteData(0x0C);
  139.     LCD_WriteData(0x15);
  140.     LCD_WriteData(0x39);
  141.     LCD_WriteData(0x33);
  142.     LCD_WriteData(0x50);
  143.     LCD_WriteData(0x36);
  144.     LCD_WriteData(0x13);
  145.     LCD_WriteData(0x14);
  146.     LCD_WriteData(0x29);
  147.     LCD_WriteData(0x2D);
  148.     //Negative Voltage Gamma
  149.     LCD_WriteCMD(0xE1);
  150.     LCD_WriteData(0xD0);
  151.     LCD_WriteData(0x08);
  152.     LCD_WriteData(0x10);
  153.     LCD_WriteData(0x08);
  154.     LCD_WriteData(0x06);
  155.     LCD_WriteData(0x06);
  156.     LCD_WriteData(0x39);
  157.     LCD_WriteData(0x44);
  158.     LCD_WriteData(0x51);
  159.     LCD_WriteData(0x0B);
  160.     LCD_WriteData(0x16);
  161.     LCD_WriteData(0x14);
  162.     LCD_WriteData(0x2F);
  163.     LCD_WriteData(0x31);
  164.     //TE
  165.     LCD_WriteCMD(0x35);
  166.     LCD_WriteData(0x01);
  167.     //开启显示
  168.     LCD_WriteCMD(0x29);
  169. }

  170. void LCD_SetPos(uint16_t x,uint16_t y)
  171. {
  172.     LCD_WriteCMD(0x2A);
  173.     LCD_WriteData((x>>8)&0xFF);
  174.     LCD_WriteData(x&0xFF);
  175.     LCD_WriteData(0x00);
  176.     LCD_WriteData(0xEF);
  177.    
  178.     LCD_WriteCMD(0x2B);
  179.     LCD_WriteData((y>>8)&0xFF);
  180.     LCD_WriteData(y&0xFF);
  181.     LCD_WriteData(0x00);
  182.     LCD_WriteData(0xEF);
  183. }

  184. void LCD_Test(void)
  185. {
  186.     uint8_t r,g,b;
  187.     uint16_t rgb[2];
  188.     uint8_t i = 0;
  189.     uint8_t j = 0;
  190.     while(i < 240)
  191.     {
  192.         LCD_SetPos(0,i);
  193.         if(i<63 || i >188)
  194.         {
  195.             r = 252 - 4*(i%63);
  196.             g = 252 - r;
  197.             b = 0;
  198.         }
  199.         else if(i<126)
  200.         {
  201.             g = 252 - 4*(i%63);
  202.             b = 252 - g;
  203.             r = 0;
  204.         }
  205.         else if(i<189)
  206.         {
  207.             b = 252 - 4*(i%63);
  208.             r = 252 - b;
  209.             g = 0;
  210.         }
  211.         rgb[0] = (r<<8)|g;
  212.         rgb[1] = (b<<8);
  213.         j = 0;
  214.         LCD_WriteCMD(0x2C);
  215.         while(j < 240)
  216.         {
  217.             LCD_WriteData(rgb[0]);
  218.             LCD_WriteData(rgb[1]);
  219.             j+=1;
  220.         }
  221.         i+=1;
  222.     }
  223. }
  224. /* USER CODE END 0 */

  225. /**
  226.   * @brief  The application entry point.
  227.   * @retval int
  228.   */
  229. int main(void)
  230. {

  231.   /* USER CODE BEGIN 1 */

  232.   /* USER CODE END 1 */

  233.   /* MCU Configuration--------------------------------------------------------*/

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

  236.   /* USER CODE BEGIN Init */

  237.   /* USER CODE END Init */

  238.   /* Configure the system clock */
  239.   SystemClock_Config();

  240.   /* USER CODE BEGIN SysInit */

  241.   /* USER CODE END SysInit */

  242.   /* Initialize all configured peripherals */
  243.   MX_GPIO_Init();
  244.   MX_FMC_Init();
  245.   MX_ICACHE_Init();
  246.   /* USER CODE BEGIN 2 */
  247.         LCD_Init();
  248.         LCD_Test();
  249.   /* USER CODE END 2 */

  250.   /* Infinite loop */
  251.   /* USER CODE BEGIN WHILE */
  252.   while (1)
  253.   {
  254.     /* USER CODE END WHILE */

  255.     /* USER CODE BEGIN 3 */
  256.   }
  257.   /* USER CODE END 3 */
  258. }

  259. /**
  260.   * @brief System Clock Configuration
  261.   * @retval None
  262.   */
  263. void SystemClock_Config(void)
  264. {
  265.   LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);
  266.   while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)
  267.   {
  268.   }

  269.   LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE0);
  270.   LL_RCC_MSI_Enable();

  271.    /* Wait till MSI is ready */
  272.   while(LL_RCC_MSI_IsReady() != 1)
  273.   {
  274.   }

  275.   LL_RCC_MSI_EnableRangeSelection();
  276.   LL_RCC_MSI_SetRange(LL_RCC_MSIRANGE_11);
  277.   LL_RCC_MSI_SetCalibTrimming(0);
  278.   LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_12, 50, LL_RCC_PLLR_DIV_2);
  279.   LL_RCC_PLL_EnableDomain_SYS();
  280.   LL_RCC_PLL_Enable();

  281.    /* Wait till PLL is ready */
  282.   while(LL_RCC_PLL_IsReady() != 1)
  283.   {
  284.   }

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

  287.   LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);

  288.    /* Wait till System clock is ready */
  289.   while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
  290.   {
  291.   }

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

  294.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
  295.   LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
  296.   LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
  297.   LL_SetSystemCoreClock(100000000);

  298.    /* Update the time base */
  299.   if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK)
  300.   {
  301.     Error_Handler();
  302.   }
  303. }

  304. /**
  305.   * @brief ICACHE Initialization Function
  306.   * @param None
  307.   * @retval None
  308.   */
  309. static void MX_ICACHE_Init(void)
  310. {

  311.   /* USER CODE BEGIN ICACHE_Init 0 */

  312.   /* USER CODE END ICACHE_Init 0 */

  313.   /* USER CODE BEGIN ICACHE_Init 1 */

  314.   /* USER CODE END ICACHE_Init 1 */

  315.   /** Enable instruction cache in 1-way (direct mapped cache)
  316.   */
  317.   if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
  318.   {
  319.     Error_Handler();
  320.   }
  321.   if (HAL_ICACHE_Enable() != HAL_OK)
  322.   {
  323.     Error_Handler();
  324.   }
  325.   /* USER CODE BEGIN ICACHE_Init 2 */

  326.   /* USER CODE END ICACHE_Init 2 */

  327. }

  328. /* FMC initialization function */
  329. static void MX_FMC_Init(void)
  330. {

  331.   /* USER CODE BEGIN FMC_Init 0 */

  332.   /* USER CODE END FMC_Init 0 */

  333.   FMC_NORSRAM_TimingTypeDef Timing = {0};
  334.   FMC_NORSRAM_TimingTypeDef ExtTiming = {0};

  335.   /* USER CODE BEGIN FMC_Init 1 */

  336.   /* USER CODE END FMC_Init 1 */

  337.   /** Perform the SRAM1 memory initialization sequence
  338.   */
  339.   hsram1.Instance = FMC_NORSRAM_DEVICE;
  340.   hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  341.   /* hsram1.Init */
  342.   hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  343.   hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  344.   hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  345.   hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  346.   hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  347.   hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  348.   hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  349.   hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  350.   hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  351.   hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
  352.   hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  353.   hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  354.   hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  355.   hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
  356.   hsram1.Init.NBLSetupTime = 0;
  357.   hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  358.   hsram1.Init.MaxChipSelectPulse = DISABLE;
  359.   /* Timing */
  360.   Timing.AddressSetupTime = 0;
  361.   Timing.AddressHoldTime = 15;
  362.   Timing.DataSetupTime = 2;
  363.   Timing.DataHoldTime = 2;
  364.   Timing.BusTurnAroundDuration = 2;
  365.   Timing.CLKDivision = 16;
  366.   Timing.DataLatency = 17;
  367.   Timing.AccessMode = FMC_ACCESS_MODE_A;
  368.   /* ExtTiming */
  369.   ExtTiming.AddressSetupTime = 0;
  370.   ExtTiming.AddressHoldTime = 15;
  371.   ExtTiming.DataSetupTime = 2;
  372.   ExtTiming.DataHoldTime = 1;
  373.   ExtTiming.BusTurnAroundDuration = 2;
  374.   ExtTiming.CLKDivision = 16;
  375.   ExtTiming.DataLatency = 17;
  376.   ExtTiming.AccessMode = FMC_ACCESS_MODE_A;

  377.   if (HAL_SRAM_Init(&hsram1, &Timing, &ExtTiming) != HAL_OK)
  378.   {
  379.     Error_Handler( );
  380.   }

  381.   /* USER CODE BEGIN FMC_Init 2 */

  382.   /* USER CODE END FMC_Init 2 */
  383. }

  384. /**
  385.   * @brief GPIO Initialization Function
  386.   * @param None
  387.   * @retval None
  388.   */
  389. static void MX_GPIO_Init(void)
  390. {
  391.   LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
  392.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  393. /* USER CODE BEGIN MX_GPIO_Init_1 */
  394. /* USER CODE END MX_GPIO_Init_1 */

  395.   /* GPIO Ports Clock Enable */
  396.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE);
  397.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
  398.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOG);
  399.   LL_PWR_EnableVddIO2();
  400.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
  401.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
  402.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
  403.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOF);
  404.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH);

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

  407.   /**/
  408.   LL_GPIO_ResetOutputPin(LED_RED_GPIO_Port, LED_RED_Pin);

  409.   /**/
  410.   LL_GPIO_ResetOutputPin(UCPD_DBn_GPIO_Port, UCPD_DBn_Pin);

  411.   /**/
  412.   LL_GPIO_ResetOutputPin(LCD_TE_GPIO_Port, LCD_TE_Pin);

  413.   /**/
  414.   LL_GPIO_ResetOutputPin(LCD_PWR_ON_GPIO_Port, LCD_PWR_ON_Pin);

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

  417.   /**/
  418.   GPIO_InitStruct.Pin = LL_GPIO_PIN_5|LL_GPIO_PIN_3|LL_GPIO_PIN_4|LL_GPIO_PIN_2
  419.                           |LL_GPIO_PIN_6;
  420.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  421.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  422.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  423.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  424.   GPIO_InitStruct.Alternate = LL_GPIO_AF_13;
  425.   LL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  426.   /**/
  427.   GPIO_InitStruct.Pin = LCD_BL_PWM_Pin;
  428.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  429.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  430.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  431.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  432.   GPIO_InitStruct.Alternate = LL_GPIO_AF_14;
  433.   LL_GPIO_Init(LCD_BL_PWM_GPIO_Port, &GPIO_InitStruct);

  434.   /**/
  435.   GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7;
  436.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  437.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  438.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  439.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  440.   GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
  441.   LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  442.   /**/
  443.   GPIO_InitStruct.Pin = LED_GREEN_Pin|BLE_RSTN_Pin|AUDIO_RESETN_Pin;
  444.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  445.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  446.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  447.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  448.   LL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  449.   /**/
  450.   GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
  451.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  452.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  453.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  454.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  455.   GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
  456.   LL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  457.   /**/
  458.   GPIO_InitStruct.Pin = LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_10|LL_GPIO_PIN_9
  459.                           |LL_GPIO_PIN_8;
  460.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  461.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  462.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  463.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  464.   GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
  465.   LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

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

  471.   /**/
  472.   GPIO_InitStruct.Pin = LL_GPIO_PIN_12|LL_GPIO_PIN_11;
  473.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  474.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  475.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  476.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  477.   GPIO_InitStruct.Alternate = LL_GPIO_AF_10;
  478.   LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  479.   /**/
  480.   GPIO_InitStruct.Pin = USER_BUTTON_Pin;
  481.   GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  482.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  483.   LL_GPIO_Init(USER_BUTTON_GPIO_Port, &GPIO_InitStruct);

  484.   /**/
  485.   GPIO_InitStruct.Pin = LED_RED_Pin;
  486.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  487.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  488.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  489.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  490.   LL_GPIO_Init(LED_RED_GPIO_Port, &GPIO_InitStruct);

  491.   /**/
  492.   GPIO_InitStruct.Pin = UCPD_DBn_Pin;
  493.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  494.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  495.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  496.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  497.   LL_GPIO_Init(UCPD_DBn_GPIO_Port, &GPIO_InitStruct);

  498.   /**/
  499.   GPIO_InitStruct.Pin = USART1_TX_Pin|USART1_RX_Pin;
  500.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  501.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  502.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  503.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  504.   GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
  505.   LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  506.   /**/
  507.   GPIO_InitStruct.Pin = LCD_TE_Pin;
  508.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  509.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  510.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  511.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  512.   LL_GPIO_Init(LCD_TE_GPIO_Port, &GPIO_InitStruct);

  513.   /**/
  514.   GPIO_InitStruct.Pin = LCD_PWR_ON_Pin;
  515.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  516.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  517.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  518.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  519.   LL_GPIO_Init(LCD_PWR_ON_GPIO_Port, &GPIO_InitStruct);

  520.   /**/
  521.   GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_3|LL_GPIO_PIN_1;
  522.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  523.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  524.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  525.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  526.   GPIO_InitStruct.Alternate = LL_GPIO_AF_10;
  527.   LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  528.   /**/
  529.   GPIO_InitStruct.Pin = LL_GPIO_PIN_7;
  530.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  531.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  532.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  533.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  534.   GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  535.   LL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  536.   /**/
  537.   GPIO_InitStruct.Pin = LL_GPIO_PIN_4|LL_GPIO_PIN_2|LL_GPIO_PIN_3|BLE_CSN_Pin;
  538.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  539.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  540.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  541.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  542.   GPIO_InitStruct.Alternate = LL_GPIO_AF_5;
  543.   LL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  544.   /**/
  545.   GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
  546.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  547.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  548.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  549.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  550.   GPIO_InitStruct.Alternate = LL_GPIO_AF_3;
  551.   LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  552.   /**/
  553.   GPIO_InitStruct.Pin = LCD_RST_Pin|STMOD_SEL_12_Pin|STMOD_SEL_34_Pin|CTP_RST_Pin;
  554.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  555.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  556.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  557.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  558.   LL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  559.   /**/
  560.   GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_7|LL_GPIO_PIN_3|LL_GPIO_PIN_6;
  561.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  562.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  563.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  564.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  565.   GPIO_InitStruct.Alternate = LL_GPIO_AF_10;
  566.   LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  567.   /**/
  568.   GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_1|LL_GPIO_PIN_0;
  569.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  570.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  571.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  572.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  573.   GPIO_InitStruct.Alternate = LL_GPIO_AF_10;
  574.   LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  575.   /**/
  576.   GPIO_InitStruct.Pin = LL_GPIO_PIN_10|LL_GPIO_PIN_11;
  577.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  578.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  579.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  580.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  581.   GPIO_InitStruct.Alternate = LL_GPIO_AF_8;
  582.   LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  583.   /**/
  584.   GPIO_InitStruct.Pin = UCPD_FLT_Pin;
  585.   GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  586.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  587.   LL_GPIO_Init(UCPD_FLT_GPIO_Port, &GPIO_InitStruct);

  588.   /**/
  589.   GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
  590.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  591.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  592.   LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  593.   /**/
  594.   GPIO_InitStruct.Pin = LL_GPIO_PIN_12;
  595.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  596.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  597.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  598.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  599.   GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  600.   LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  601.   /**/
  602.   LL_EXTI_SetEXTISource(LL_EXTI_EXTI_PORTF, LL_EXTI_EXTI_LINE3);

  603.   /**/
  604.   LL_EXTI_SetEXTISource(LL_EXTI_EXTI_PORTF, LL_EXTI_EXTI_LINE2);

  605.   /**/
  606.   LL_EXTI_SetEXTISource(LL_EXTI_EXTI_PORTF, LL_EXTI_EXTI_LINE1);

  607.   /**/
  608.   LL_EXTI_SetEXTISource(LL_EXTI_EXTI_PORTG, LL_EXTI_EXTI_LINE6);

  609.   /**/
  610.   EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_3;
  611.   EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  612.   EXTI_InitStruct.LineCommand = ENABLE;
  613.   EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  614.   EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  615.   LL_EXTI_Init(&EXTI_InitStruct);

  616.   /**/
  617.   EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_2;
  618.   EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  619.   EXTI_InitStruct.LineCommand = ENABLE;
  620.   EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  621.   EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  622.   LL_EXTI_Init(&EXTI_InitStruct);

  623.   /**/
  624.   EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_1;
  625.   EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  626.   EXTI_InitStruct.LineCommand = ENABLE;
  627.   EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  628.   EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  629.   LL_EXTI_Init(&EXTI_InitStruct);

  630.   /**/
  631.   EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_6;
  632.   EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  633.   EXTI_InitStruct.LineCommand = ENABLE;
  634.   EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  635.   EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  636.   LL_EXTI_Init(&EXTI_InitStruct);

  637.   /**/
  638.   LL_GPIO_SetPinPull(GYRO_ACC_INT_GPIO_Port, GYRO_ACC_INT_Pin, LL_GPIO_PULL_NO);

  639.   /**/
  640.   LL_GPIO_SetPinPull(SDIO_DETECT_GPIO_Port, SDIO_DETECT_Pin, LL_GPIO_PULL_NO);

  641.   /**/
  642.   LL_GPIO_SetPinPull(CTP_INT_GPIO_Port, CTP_INT_Pin, LL_GPIO_PULL_NO);

  643.   /**/
  644.   LL_GPIO_SetPinPull(BLE_INT_GPIO_Port, BLE_INT_Pin, LL_GPIO_PULL_NO);

  645.   /**/
  646.   LL_GPIO_SetPinMode(GYRO_ACC_INT_GPIO_Port, GYRO_ACC_INT_Pin, LL_GPIO_MODE_INPUT);

  647.   /**/
  648.   LL_GPIO_SetPinMode(SDIO_DETECT_GPIO_Port, SDIO_DETECT_Pin, LL_GPIO_MODE_INPUT);

  649.   /**/
  650.   LL_GPIO_SetPinMode(CTP_INT_GPIO_Port, CTP_INT_Pin, LL_GPIO_MODE_INPUT);

  651.   /**/
  652.   LL_GPIO_SetPinMode(BLE_INT_GPIO_Port, BLE_INT_Pin, LL_GPIO_MODE_INPUT);

  653. /* USER CODE BEGIN MX_GPIO_Init_2 */
  654. /* USER CODE END MX_GPIO_Init_2 */
  655. }

  656. /* USER CODE BEGIN 4 */

  657. /* USER CODE END 4 */

  658. /**
  659.   * @brief  This function is executed in case of error occurrence.
  660.   * @retval None
  661.   */
  662. void Error_Handler(void)
  663. {
  664.   /* USER CODE BEGIN Error_Handler_Debug */
  665.   /* User can add his own implementation to report the HAL error return state */
  666.   __disable_irq();
  667.   while (1)
  668.   {
  669.   }
  670.   /* USER CODE END Error_Handler_Debug */
  671. }

  672. #ifdef  USE_FULL_ASSERT
  673. /**
  674.   * @brief  Reports the name of the source file and the source line number
  675.   *         where the assert_param error has occurred.
  676.   * @param  file: pointer to the source file name
  677.   * @param  line: assert_param error line source number
  678.   * @retval None
  679.   */
  680. void assert_failed(uint8_t *file, uint32_t line)
  681. {
  682.   /* USER CODE BEGIN 6 */
  683.   /* User can add his own implementation to report the file name and line number,
  684.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  685.   /* USER CODE END 6 */
  686. }
  687. #endif /* USE_FULL_ASSERT */
编译烧录,可以看到红绿蓝色条了
9609867a586e745aad.png
原来使用8080接口这么容易
关于写数据和写指令地址也可以参考BSP示例里的,
#define LCD_REGISTER_ADDR FMC_BANK1_1
#define LCD_DATA_ADDR     (FMC_BANK1_1 | 0x00000002UL)

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

  4. #define FMC_BANK1             FMC_BASE
  5. #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 | 显示全部楼层
试了一下可以。
 楼主| gaoyang9992006 发表于 2025-2-7 20:15 | 显示全部楼层
完善几个绘图函数
  1. #define ST77XX_BLACK 0x0000
  2. #define ST77XX_WHITE 0xFFFF
  3. #define ST77XX_RED 0xF800
  4. #define ST77XX_GREEN 0x07E0
  5. #define ST77XX_BLUE 0x001F
  6. #define ST77XX_CYAN 0x07FF
  7. #define ST77XX_MAGENTA 0xF81F
  8. #define ST77XX_YELLOW 0xFFE0
  9. #define ST77XX_ORANGE 0xFC00

  10. void test(void)
  11. {
  12.         for(int i=0;i<240;i++)
  13.         for(int j=0;j<240;j++)
  14.         {
  15.                 LCD_SetPos(i,j);
  16.                 LCD_WriteCMD(0x2C);
  17.                 LCD_WriteData(ST77XX_YELLOW);
  18.         }
  19. }

  20. #define LCD_WIDTH  240
  21. #define LCD_HEIGHT 240

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

  28. void LCD_DrawHLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
  29.     for (uint16_t i = 0; i < length; i++) {
  30.         LCD_DrawPixel(x + i, y, color);
  31.     }
  32. }

  33. void LCD_DrawVLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
  34.     for (uint16_t i = 0; i < length; i++) {
  35.         LCD_DrawPixel(x, y + i, color);
  36.     }
  37. }

  38. void LCD_DrawRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) {
  39.     LCD_DrawHLine(x, y, width, color);
  40.     LCD_DrawHLine(x, y + height - 1, width, color);
  41.     LCD_DrawVLine(x, y, height, color);
  42.     LCD_DrawVLine(x + width - 1, y, height, color);
  43. }

  44. void LCD_FillRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) {
  45.     for (uint16_t i = 0; i < height; i++) {
  46.         LCD_DrawHLine(x, y + i, width, color);
  47.     }
  48. }

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

  52.     while (x >= y) {
  53.         LCD_DrawPixel(x0 + x, y0 + y, color);
  54.         LCD_DrawPixel(x0 + y, y0 + x, color);
  55.         LCD_DrawPixel(x0 - y, y0 + x, color);
  56.         LCD_DrawPixel(x0 - x, y0 + y, color);
  57.         LCD_DrawPixel(x0 - x, y0 - y, color);
  58.         LCD_DrawPixel(x0 - y, y0 - x, color);
  59.         LCD_DrawPixel(x0 + y, y0 - x, color);
  60.         LCD_DrawPixel(x0 + x, y0 - y, color);
  61.         
  62.         y++;
  63.         if (err <= 0) {
  64.             err += 2 * y + 1;
  65.         } else {
  66.             x--;
  67.             err += 2 * (y - x) + 1;
  68.         }
  69.     }
  70. }

  71. void LCD_FillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
  72.     for (int16_t y = -r; y <= r; y++) {
  73.         for (int16_t x = -r; x <= r; x++) {
  74.             if (x * x + y * y <= r * r) {
  75.                 LCD_DrawPixel(x0 + x, y0 + y, color);
  76.             }
  77.         }
  78.     }
  79. }


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


运行效果
微信图片_20250207201217.png
 楼主| gaoyang9992006 发表于 2025-2-7 20:20 | 显示全部楼层
跟GPT沟通优化相关函数
  1. void LCD_DrawHLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
  2.     if (x + length > LCD_WIDTH) length = LCD_WIDTH - x; // 防止越界
  3.     LCD_SetPos(x, y);
  4.     LCD_WriteCMD(0x2C);
  5.     for (uint16_t i = 0; i < length; i++) {
  6.         LCD_WriteData(color);
  7.     }
  8. }

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


 楼主| gaoyang9992006 发表于 2025-2-7 21:29 | 显示全部楼层
完善字符显示函数


  1. // 6x8点阵字符集
  2. const char font6x8_ascii[128][6] = {
  3.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x00
  4.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x01
  5.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x02
  6.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x03
  7.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x04
  8.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x05
  9.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x06
  10.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x07
  11.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x08
  12.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x09
  13.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0A
  14.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0B
  15.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0C
  16.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0D
  17.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0E
  18.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x0F
  19.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x10
  20.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x11
  21.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x12
  22.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x13
  23.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x14
  24.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x15
  25.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x16
  26.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x17
  27.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x18
  28.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x19
  29.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1A
  30.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1B
  31.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1C
  32.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1D
  33.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1E
  34.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x1F
  35.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0x20 (space)
  36.     {0x00, 0x00, 0x00, 0x2F, 0x00, 0x00},  // 0x21 (!)
  37.     {0x00, 0x00, 0x03, 0x00, 0x03, 0x00},  // 0x22 (")
  38.     {0x00, 0x14, 0x3E, 0x14, 0x3E, 0x14},  // 0x23 (#)
  39.     {0x00, 0x04, 0x2A, 0x7F, 0x2A, 0x10},  // 0x24 ($)
  40.     {0x00, 0x26, 0x10, 0x08, 0x04, 0x32},  // 0x25 (%)
  41.     {0x00, 0x1A, 0x25, 0x29, 0x10, 0x28},  // 0x26 (&)
  42.     {0x00, 0x00, 0x00, 0x03, 0x00, 0x00},  // 0x27 (')
  43.     {0x00, 0x00, 0x3E, 0x41, 0x41, 0x00},  // 0x28 (()
  44.     {0x00, 0x00, 0x41, 0x41, 0x3E, 0x00},  // 0x29 ())
  45.     {0x00, 0x28, 0x18, 0x0E, 0x18, 0x28},  // 0x2A (*)
  46.     {0x00, 0x08, 0x08, 0x3E, 0x08, 0x08},  // 0x2B (+)
  47.     {0x00, 0x00, 0x20, 0x10, 0x00, 0x00},  // 0x2C (,)
  48.     {0x00, 0x08, 0x08, 0x08, 0x08, 0x08},  // 0x2D (-)
  49.     {0x00, 0x00, 0x00, 0x10, 0x00, 0x00},  // 0x2E (.)
  50.     {0x00, 0x20, 0x10, 0x08, 0x04, 0x02},  // 0x2F (/)
  51.     {0x00, 0x00, 0x1E, 0x21, 0x21, 0x1E},  // 0x30 (0)
  52.     {0x00, 0x00, 0x00, 0x22, 0x3F, 0x20},  // 0x31 (1)
  53.     {0x00, 0x00, 0x22, 0x31, 0x29, 0x26},  // 0x32 (2)
  54.     {0x00, 0x00, 0x12, 0x21, 0x25, 0x1A},  // 0x33 (3)
  55.     {0x00, 0x00, 0x0C, 0x0A, 0x3F, 0x08},  // 0x34 (4)
  56.     {0x00, 0x00, 0x17, 0x25, 0x25, 0x19},  // 0x35 (5)
  57.     {0x00, 0x00, 0x1C, 0x26, 0x25, 0x18},  // 0x36 (6)
  58.     {0x00, 0x00, 0x01, 0x39, 0x05, 0x03},  // 0x37 (7)
  59.     {0x00, 0x00, 0x1A, 0x25, 0x25, 0x1A},  // 0x38 (8)
  60.     {0x00, 0x00, 0x06, 0x09, 0x29, 0x1E},  // 0x39 (9)
  61.     {0x00, 0x00, 0x00, 0x14, 0x00, 0x00},  // 0x3A (:)
  62.     {0x00, 0x00, 0x20, 0x14, 0x00, 0x00},  // 0x3B (;)
  63.     {0x00, 0x00, 0x08, 0x14, 0x22, 0x00},  // 0x3C (<)
  64.     {0x00, 0x00, 0x14, 0x14, 0x14, 0x00},  // 0x3D (=)
  65.     {0x00, 0x00, 0x22, 0x14, 0x08, 0x00},  // 0x3E (>)
  66.     {0x00, 0x02, 0x01, 0x29, 0x06, 0x00},  // 0x3F (?)
  67.     {0x00, 0x1E, 0x21, 0x2D, 0x2E, 0x00},  // 0x40 (@)
  68.     {0x00, 0x30, 0x0C, 0x0B, 0x0C, 0x30},  // 0x41 (A)
  69.     {0x00, 0x00, 0x3F, 0x25, 0x25, 0x1A},  // 0x42 (B)
  70.     {0x00, 0x00, 0x1E, 0x21, 0x21, 0x12},  // 0x43 (C)
  71.     {0x00, 0x00, 0x3F, 0x21, 0x21, 0x1E},  // 0x44 (D)
  72.     {0x00, 0x00, 0x3F, 0x25, 0x25, 0x25},  // 0x45 (E)
  73.     {0x00, 0x00, 0x3F, 0x05, 0x05, 0x05},  // 0x46 (F)
  74.     {0x00, 0x00, 0x1E, 0x21, 0x29, 0x1A},  // 0x47 (G)
  75.     {0x00, 0x00, 0x3F, 0x04, 0x04, 0x3F},  // 0x48 (H)
  76.     {0x00, 0x00, 0x21, 0x3F, 0x21, 0x00},  // 0x49 (I)
  77.     {0x00, 0x18, 0x20, 0x21, 0x1F, 0x00},  // 0x4A (J)
  78.     {0x00, 0x00, 0x3F, 0x0C, 0x12, 0x21},  // 0x4B (K)
  79.     {0x00, 0x00, 0x3F, 0x20, 0x20, 0x20},  // 0x4C (L)
  80.     {0x00, 0x3F, 0x06, 0x08, 0x06, 0x3F},  // 0x4D (M)
  81.     {0x00, 0x00, 0x3F, 0x06, 0x18, 0x3F},  // 0x4E (N)
  82.     {0x00, 0x00, 0x1E, 0x21, 0x21, 0x1E},  // 0x4F (O)
  83.     {0x00, 0x00, 0x3F, 0x09, 0x09, 0x06},  // 0x50 (P)
  84.     {0x00, 0x1E, 0x21, 0x21, 0x5E, 0x00},  // 0x51 (Q)
  85.     {0x00, 0x00, 0x3F, 0x09, 0x19, 0x26},  // 0x52 (R)
  86.     {0x00, 0x00, 0x12, 0x25, 0x29, 0x12},  // 0x53 (S)
  87.     {0x00, 0x01, 0x01, 0x3F, 0x01, 0x01},  // 0x54 (T)
  88.     {0x00, 0x1F, 0x20, 0x20, 0x20, 0x1F},  // 0x55 (U)
  89.     {0x00, 0x0F, 0x10, 0x20, 0x10, 0x0F},  // 0x56 (V)
  90.     {0x00, 0x1F, 0x20, 0x1C, 0x20, 0x1F},  // 0x57 (W)
  91.     {0x00, 0x21, 0x12, 0x0C, 0x12, 0x21},  // 0x58 (X)
  92.     {0x00, 0x03, 0x04, 0x38, 0x04, 0x03},  // 0x59 (Y)
  93.     {0x00, 0x00, 0x31, 0x29, 0x25, 0x23},  // 0x5A (Z)
  94.     {0x00, 0x00, 0x3F, 0x21, 0x21, 0x00},  // 0x5B ([)
  95.     {0x00, 0x02, 0x04, 0x08, 0x10, 0x20},  // 0x5C (\)
  96.     {0x00, 0x00, 0x21, 0x21, 0x3F, 0x00},  // 0x5D (])
  97.     {0x00, 0x04, 0x02, 0x01, 0x02, 0x04},  // 0x5E (^)
  98.     {0x00, 0x40, 0x40, 0x40, 0x40, 0x40},  // 0x5F (_)
  99.     {0x00, 0x00, 0x00, 0x01, 0x02, 0x00},  // 0x60 (`)
  100.     {0x00, 0x18, 0x24, 0x24, 0x18, 0x20},  // 0x61 (a)
  101.     {0x00, 0x00, 0x3F, 0x24, 0x24, 0x18},  // 0x62 (b)
  102.     {0x00, 0x00, 0x18, 0x24, 0x24, 0x00},  // 0x63 (c)
  103.     {0x00, 0x00, 0x18, 0x24, 0x24, 0x3F},  // 0x64 (d)
  104.     {0x00, 0x00, 0x1C, 0x2A, 0x2A, 0x0C},  // 0x65 (e)
  105.     {0x00, 0x04, 0x04, 0x3E, 0x05, 0x05},  // 0x66 (f)
  106.     {0x00, 0x00, 0x0C, 0x52, 0x52, 0x3E},  // 0x67 (g)
  107.     {0x00, 0x00, 0x3F, 0x04, 0x04, 0x38},  // 0x68 (h)
  108.     {0x00, 0x00, 0x24, 0x3D, 0x20, 0x00},  // 0x69 (i)
  109.     {0x00, 0x20, 0x40, 0x44, 0x3D, 0x00},  // 0x6A (j)
  110.     {0x00, 0x00, 0x3F, 0x08, 0x14, 0x22},  // 0x6B (k)
  111.     {0x00, 0x00, 0x1F, 0x20, 0x20, 0x10},  // 0x6C (l)
  112.     {0x00, 0x3E, 0x04, 0x18, 0x04, 0x3E},  // 0x6D (m)
  113.     {0x00, 0x00, 0x3C, 0x02, 0x02, 0x3C},  // 0x6E (n)
  114.     {0x00, 0x00, 0x1C, 0x22, 0x22, 0x1C},  // 0x6F (o)
  115.     {0x00, 0x00, 0x7E, 0x12, 0x12, 0x0C},  // 0x70 (p)
  116.     {0x00, 0x00, 0x0C, 0x12, 0x12, 0x7E},  // 0x71 (q)
  117.     {0x00, 0x00, 0x04, 0x38, 0x04, 0x04},  // 0x72 (r)
  118.     {0x00, 0x00, 0x04, 0x2A, 0x2A, 0x10},  // 0x73 (s)
  119.     {0x00, 0x00, 0x04, 0x1E, 0x24, 0x10},  // 0x74 (t)
  120.     {0x00, 0x1C, 0x20, 0x20, 0x20, 0x1C},  // 0x75 (u)
  121.     {0x00, 0x0C, 0x10, 0x20, 0x10, 0x0C},  // 0x76 (v)
  122.     {0x00, 0x1C, 0x20, 0x18, 0x20, 0x1C},  // 0x77 (w)
  123.     {0x00, 0x22, 0x14, 0x08, 0x14, 0x22},  // 0x78 (x)
  124.     {0x00, 0x04, 0x48, 0x30, 0x08, 0x04},  // 0x79 (y)
  125.     {0x00, 0x00, 0x24, 0x34, 0x2C, 0x24},  // 0x7A (z)
  126.     {0x00, 0x08, 0x08, 0x36, 0x41, 0x41},  // 0x7B ({)
  127.     {0x00, 0x00, 0x00, 0x7F, 0x00, 0x00},  // 0x7C (|)
  128.     {0x00, 0x41, 0x41, 0x36, 0x08, 0x08},  // 0x7D (})
  129.     {0x00, 0x08, 0x04, 0x08, 0x10, 0x08},  // 0x7E (~)
  130.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}   // 0x7F
  131. };
  132. #include <stdint.h>
  133. #include <string.h>
  134. void LCD_DrawChar(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bg_color)
  135. {
  136.     if (ch < ' ' || ch > '~') return; // 检查字符范围

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

  139.     for (uint8_t row = 0; row < 8; row++) {
  140.         for (uint8_t col = 0; col < 6; col++) {
  141.             if (char_data[col] & (1 << row)) {
  142.                 LCD_DrawPixel(x + col, y + row, color);
  143.             } else {
  144.                 LCD_DrawPixel(x + col, y + row, bg_color);
  145.             }
  146.         }
  147.     }
  148. }

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


 楼主| gaoyang9992006 发表于 2025-2-7 21:50 | 显示全部楼层
  1. void LCD_DrawChar2(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bg_color)
  2. {
  3.     if (ch < ' ' || ch > '~') return; // 检查字符范围

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

  6.     for (uint8_t row = 0; row < 16; row++) {
  7.         for (uint8_t col = 0; col < 8; col++) {
  8.             if (char_data[row] & (1 << (7 - col))) {
  9.                 LCD_DrawPixel(x + col, y + row, color);
  10.             } else {
  11.                 LCD_DrawPixel(x + col, y + row, bg_color);
  12.             }
  13.         }
  14.     }
  15. }

  16. void LCD_DrawString2(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bg_color)
  17. {
  18.     while (*str) {
  19.         LCD_DrawChar2(x, y, *str, color, bg_color);
  20.         x += 7; // 每个字符宽度为6,加上1个像素的间距
  21.         str++;
  22.     }
  23. }
完善8*16点阵字符显示
  1. unsigned char font8x16[][16] = {
  2.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x00,
  3.                 { 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD, 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,  },       //0x01,
  4.                 { 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF, 0xFF, 0xC3, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00,  },       //0x02,
  5.                 { 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,  },       //0x03,
  6.                 { 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x04,
  7.                 { 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7, 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x05,
  8.                 { 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x06,
  9.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x07,
  10.                 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  },       //0x08,
  11.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x09,
  12.                 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  },       //0x0A,
  13.                 { 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,  },       //0x0B,
  14.                 { 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x0C,
  15.                 { 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00,  },       //0x0D,
  16.                 { 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00, 0x00, 0x00,  },       //0x0E,
  17.                 { 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x0F,
  18.                 { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,  },       //0x10,
  19.                 { 0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0xFE, 0x3E, 0x1E, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,  },       //0x11,
  20.                 { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x12,
  21.                 { 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,  },       //0x13,
  22.                 { 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,  },       //0x14,
  23.                 { 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00,  },       //0x15,
  24.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x16,
  25.                 { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,  },       //0x17,
  26.                 { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x18,
  27.                 { 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x19,
  28.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1A,
  29.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1B, esc
  30.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1C,
  31.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C, 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1D,
  32.                 { 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1E,
  33.                 { 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x1F,
  34.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x20, ' '
  35.                 { 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x21, '!'
  36.                 { 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x22, '"'
  37.                 { 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,  },       //0x23, '#'
  38.                 { 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,  },       //0x24, '


  39.                 { 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x00,  },       //0x25, '%'
  40.                 { 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,  },       //0x26, '&'
  41.                 { 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x27, '''
  42.                 { 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,  },       //0x28, '('
  43.                 { 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,  },       //0x29, ')'
  44.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x2A, '*'
  45.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x2B, '+'
  46.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,  },       //0x2C, '
  47.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x2D, '-'
  48.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x2E, '.'
  49.                 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,  },       //0x2F, '/'
  50.                 { 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xD6, 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,  },       //0x30, '0'
  51.                 { 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,  },       //0x31, '1'
  52.                 { 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x32, '2'
  53.                 { 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x33, '3'
  54.                 { 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,  },       //0x34, '4'
  55.                 { 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x35, '5'
  56.                 { 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x36, '6'
  57.                 { 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,  },       //0x37, '7'
  58.                 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x38, '8'
  59.                 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00,  },       //0x39, '9'
  60.                 { 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x3A, ':'
  61.                 { 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,  },       //0x3B, ';'
  62.                 { 0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00,  },       //0x3C, '<'
  63.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x3D, '='
  64.                 { 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,  },       //0x3E, '>'
  65.                 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x3F, '?'
  66.                 { 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x40, '@'
  67.                 { 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x41, 'A'
  68.                 { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,  },       //0x42, 'B'
  69.                 { 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x43, 'C'
  70.                 { 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,  },       //0x44, 'D'
  71.                 { 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x45, 'E'
  72.                 { 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,  },       //0x46, 'F'
  73.                 { 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0x66, 0x3A, 0x00, 0x00, 0x00, 0x00,  },       //0x47, 'G'
  74.                 { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x48, 'H'
  75.                 { 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x49, 'I'
  76.                 { 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,  },       //0x4A, 'J'
  77.                 { 0x00, 0x00, 0xE6, 0x66, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,  },       //0x4B, 'K'
  78.                 { 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x4C, 'L'
  79.                 { 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x4D, 'M'
  80.                 { 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x4E, 'N'
  81.                 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x4F, 'O'
  82.                 { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,  },       //0x50, 'P'
  83.                 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0C, 0x0E, 0x00, 0x00,  },       //0x51, 'Q'
  84.                 { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,  },       //0x52, 'R'
  85.                 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x53, 'S'
  86.                 { 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x54, 'T'
  87.                 { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x55, 'U'
  88.                 { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,  },       //0x56, 'V'
  89.                 { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00,  },       //0x57, 'W'
  90.                 { 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x7C, 0x38, 0x38, 0x7C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x58, 'X'
  91.                 { 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x59, 'Y'
  92.                 { 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x5A, 'Z'
  93.                 { 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x5B, '['
  94.                 { 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,  },       //0x5C, '\'
  95.                 { 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x5D, ']'
  96.                 { 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x5E, '^'
  97.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,  },       //0x5F, '_'
  98.                 { 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x60, '`'
  99.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,  },       //0x61, 'a'
  100.                 { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x62, 'b'
  101.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x63, 'c'
  102.                 { 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,  },       //0x64, 'd'
  103.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x65, 'e'
  104.                 { 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,  },       //0x66, 'f'
  105.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00,  },       //0x67, 'g'
  106.                 { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,  },       //0x68, 'h'
  107.                 { 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x69, 'i'
  108.                 { 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00,  },       //0x6A, 'j'
  109.                 { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,  },       //0x6B, 'k'
  110.                 { 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,  },       //0x6C, 'l'
  111.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x6D, 'm'
  112.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,  },       //0x6E, 'n'
  113.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x6F, 'o'
  114.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,  },       //0x70, 'p'
  115.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00,  },       //0x71, 'q'
  116.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x66, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,  },       //0x72, 'r'
  117.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,  },       //0x73, 's'
  118.                 { 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,  },       //0x74, 't'
  119.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,  },       //0x75, 'u'
  120.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x76, 'v'
  121.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,  },       //0x77, 'w'
  122.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,  },       //0x78, 'x'
  123.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00,  },       //0x79, 'y'
  124.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xCC, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,  },       //0x7A, 'z'
  125.                 { 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,  },       //0x7B, '{'
  126.                 { 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  },       //0x7C, '|'
  127.                 { 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,  },       //0x7D, '}'
  128.                 { 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x7E, '~'
  129.                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  },       //0x7F, delete
  130. };


玛尼玛尼哄 发表于 2025-2-8 11:02 | 显示全部楼层
  1. void LCD_DrawString2(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bg_color)
  2. {
  3.     while (*str) {
  4.         LCD_DrawChar2(x, y, *str, color, bg_color);
  5.         x += 8; // 每个字符宽度为8,加上0个像素的间距
  6.         str++;
  7.     }
  8. }

修改这里,调整字符间距
lulugl 发表于 2025-2-23 08:53 | 显示全部楼层
楼主大佬,感谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2045

主题

16350

帖子

222

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