STM32H750XB_RT-THREAD/45-DCMI—OV2640摄像头实验/User/lcd/bsp_lcd.c

1723 lines
47 KiB
C
Raw Permalink Normal View History

2025-07-21 06:34:29 +00:00
/**
******************************************************************************
* @file bsp_lcd.c
* @author fire
* @version V1.0
* @date 2016-xx-xx
* @brief LCDӦ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<EFBFBD>֧<EFBFBD><EFBFBD>ARGB888/RGB888/RGB565/ARGB4444/ARGB1555 (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ)
******************************************************************************
* @attention
*
* ʵ<EFBFBD><EFBFBD>ƽ̨:Ұ<EFBFBD><EFBFBD> STM32 H750 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
* <EFBFBD>Ա<EFBFBD> :http://firestm32.taobao.com
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "./lcd/bsp_lcd.h"
#include "./fonts//font24.c"
#include "./fonts//font20.c"
#include "./fonts//font16.c"
#include "./fonts//font12.c"
#include "./fonts//font8.c"
#include "./flash/bsp_qspi_flash.h"
#include "./delay/core_delay.h"
#include <string.h>
#include <stdlib.h>
#define POLY_X(Z) ((int32_t)((Points + Z)->X))
#define POLY_Y(Z) ((int32_t)((Points + Z)->Y))
#define ABS(X) ((X) > 0 ? (X) : -(X))
extern __IO uint8_t* qspi_addr;
static LTDC_HandleTypeDef Ltdc_Handler;
static DMA2D_HandleTypeDef Dma2d_Handler;
/* Default LCD configuration with LCD Layer 1 */
uint32_t ActiveLayer = 0;
LCD_DrawPropTypeDef DrawProp[MAX_LAYER_NUMBER];
/**
* @brief Initializes the LCD.
* @param None
* @retval None
*/
/*<2A><><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define HBP 46 //HSYNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
#define VBP 23 //VSYNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
#define HSW 1 //HSYNC<4E><43><EFBFBD><EFBFBD>
#define VSW 3 //VSYNC<4E><43><EFBFBD><EFBFBD>
#define HFP 40 //HSYNCǰ<43><C7B0><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
#define VFP 13 //VSYNCǰ<43><C7B0><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t* c);
static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3);
static void LL_FillBuffer(uint32_t LayerIndex, void* pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex);
static void LL_ConvertLineToARGB8888(void* pSrc, void* pDst, uint32_t xSize, uint32_t ColorMode);
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>IO
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* ʹ<><CAB9>LCDʹ<44>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
//<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LTDC_R0_GPIO_CLK_ENABLE(); LTDC_R1_GPIO_CLK_ENABLE(); LTDC_R2_GPIO_CLK_ENABLE(); \
LTDC_R3_GPIO_CLK_ENABLE(); LTDC_R4_GPIO_CLK_ENABLE(); LTDC_R5_GPIO_CLK_ENABLE(); \
LTDC_R6_GPIO_CLK_ENABLE(); LTDC_R7_GPIO_CLK_ENABLE(); LTDC_G0_GPIO_CLK_ENABLE(); \
LTDC_G1_GPIO_CLK_ENABLE(); LTDC_G2_GPIO_CLK_ENABLE(); LTDC_G3_GPIO_CLK_ENABLE(); \
LTDC_G3_GPIO_CLK_ENABLE(); LTDC_G5_GPIO_CLK_ENABLE(); LTDC_G6_GPIO_CLK_ENABLE(); \
LTDC_G7_GPIO_CLK_ENABLE(); LTDC_B0_GPIO_CLK_ENABLE(); LTDC_B1_GPIO_CLK_ENABLE(); \
LTDC_B2_GPIO_CLK_ENABLE(); LTDC_B3_GPIO_CLK_ENABLE(); LTDC_B4_GPIO_CLK_ENABLE(); \
LTDC_B5_GPIO_CLK_ENABLE(); LTDC_B6_GPIO_CLK_ENABLE(); LTDC_B7_GPIO_CLK_ENABLE(); \
LTDC_CLK_GPIO_CLK_ENABLE(); LTDC_HSYNC_GPIO_CLK_ENABLE(); LTDC_VSYNC_GPIO_CLK_ENABLE(); \
LTDC_DE_GPIO_CLK_ENABLE(); LTDC_BL_GPIO_CLK_ENABLE();
/* GPIO<49><4F><EFBFBD><EFBFBD> */
/* <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pin = LTDC_R0_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_R0_AF;
HAL_GPIO_Init(LTDC_R0_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_R1_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_R1_AF;
HAL_GPIO_Init(LTDC_R1_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_R2_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_R2_AF;
HAL_GPIO_Init(LTDC_R2_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_R3_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_R3_AF;
HAL_GPIO_Init(LTDC_R3_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_R4_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_R4_AF;
HAL_GPIO_Init(LTDC_R4_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_R5_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_R5_AF;
HAL_GPIO_Init(LTDC_R5_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_R6_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_R6_AF;
HAL_GPIO_Init(LTDC_R6_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_R7_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_R7_AF;
HAL_GPIO_Init(LTDC_R7_GPIO_PORT, &GPIO_InitStruct);
//<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStruct.Pin = LTDC_G0_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_G0_AF;
HAL_GPIO_Init(LTDC_G0_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_G1_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_G1_AF;
HAL_GPIO_Init(LTDC_G1_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_G2_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_G2_AF;
HAL_GPIO_Init(LTDC_G2_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_G3_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_G3_AF;
HAL_GPIO_Init(LTDC_G3_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_G4_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_G4_AF;
HAL_GPIO_Init(LTDC_G4_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_G5_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_G5_AF;
HAL_GPIO_Init(LTDC_G5_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_G6_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_G6_AF;
HAL_GPIO_Init(LTDC_G6_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_G7_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_G7_AF;
HAL_GPIO_Init(LTDC_G7_GPIO_PORT, &GPIO_InitStruct);
//<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStruct.Pin = LTDC_B0_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_B0_AF;
HAL_GPIO_Init(LTDC_B0_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_B1_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_B1_AF;
HAL_GPIO_Init(LTDC_B1_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_B2_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_B2_AF;
HAL_GPIO_Init(LTDC_B2_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_B3_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_B3_AF;
HAL_GPIO_Init(LTDC_B3_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_B4_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_B4_AF;
HAL_GPIO_Init(LTDC_B4_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_B5_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_B5_AF;
HAL_GPIO_Init(LTDC_B5_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_B6_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_B6_AF;
HAL_GPIO_Init(LTDC_B6_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_B7_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_B7_AF;
HAL_GPIO_Init(LTDC_B7_GPIO_PORT, &GPIO_InitStruct);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
GPIO_InitStruct.Pin = LTDC_CLK_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_CLK_AF;
HAL_GPIO_Init(LTDC_CLK_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_HSYNC_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_HSYNC_AF;
HAL_GPIO_Init(LTDC_HSYNC_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_VSYNC_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_VSYNC_AF;
HAL_GPIO_Init(LTDC_VSYNC_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LTDC_DE_GPIO_PIN;
GPIO_InitStruct.Alternate = LTDC_DE_AF;
HAL_GPIO_Init(LTDC_DE_GPIO_PORT, &GPIO_InitStruct);
//<2F><><EFBFBD><EFBFBD>BL
GPIO_InitStruct.Pin = LTDC_BL_GPIO_PIN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(LTDC_BL_GPIO_PORT, &GPIO_InitStruct);
}
/**
* @brief ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_ClockConfig(void)
{
static RCC_PeriphCLKInitTypeDef periph_clk_init_struct;
/* Һ<><D2BA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 5<><35><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>PCLKΪ27 MHz<48><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PLL3R<33><52><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><E1B9A9>ʱ<EFBFBD><CAB1> */
/* AMPIRE640480 LCD clock configuration */
/* PLL3_VCO Input = HSE_VALUE/PLL3M = 5 Mhz */
/* PLL3_VCO Output = PLL3_VCO Input * PLL3N = 800 Mhz */
/* PLLLCDCLK = PLL3_VCO Output/PLL3R = 800/40 = 20Mhz */
/* LTDC clock frequency = PLLLCDCLK = 20 Mhz */
periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
periph_clk_init_struct.PLL3.PLL3M = 25;
periph_clk_init_struct.PLL3.PLL3N = 150;
periph_clk_init_struct.PLL3.PLL3P = 2;
periph_clk_init_struct.PLL3.PLL3Q = 2;
periph_clk_init_struct.PLL3.PLL3R = 10;
HAL_RCCEx_PeriphCLKConfig(&periph_clk_init_struct);
}
void LCD_Init(void)
{
/* ʹ<><CAB9>LTDCʱ<43><CAB1> */
__HAL_RCC_LTDC_CLK_ENABLE();
/* ʹ<><CAB9>DMA2Dʱ<44><CAB1> */
__HAL_RCC_DMA2D_CLK_ENABLE();
/* Һ<><D2BA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
LCD_ClockConfig();
/* <20><>ʼ<EFBFBD><CABC>LCD<43><44><EFBFBD><EFBFBD> */
LCD_GPIO_Config();
/* <20><>ʼ<EFBFBD><CABC>SDRAM <20><><EFBFBD><EFBFBD>LCD <20>Դ<EFBFBD>*/
SDRAM_Init();
/* <20><><EFBFBD><EFBFBD>LTDC<44><43><EFBFBD><EFBFBD> */
Ltdc_Handler.Instance = LTDC;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>źſ<C5BA><C5BF><EFBFBD>(HSW-1) */
Ltdc_Handler.Init.HorizontalSync = HSW - 1;
/* <20><><EFBFBD>ô<EFBFBD>ֱͬ<D6B1><CDAC><EFBFBD>źſ<C5BA><C5BF><EFBFBD>(VSW-1) */
Ltdc_Handler.Init.VerticalSync = VSW - 1;
/* <20><><EFBFBD><EFBFBD>(HSW+HBP-1) */
Ltdc_Handler.Init.AccumulatedHBP = HSW + HBP - 1;
/* <20><><EFBFBD><EFBFBD>(VSW+VBP-1) */
Ltdc_Handler.Init.AccumulatedVBP = VSW + VBP - 1;
/* <20><><EFBFBD><EFBFBD>(HSW+HBP+<2B><>Ч<EFBFBD><D0A7><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>-1) */
Ltdc_Handler.Init.AccumulatedActiveW = HSW + HBP + LCD_PIXEL_WIDTH - 1;
/* <20><><EFBFBD><EFBFBD>(VSW+VBP+<2B><>Ч<EFBFBD><D0A7><EFBFBD>ظ߶<D8B8>-1) */
Ltdc_Handler.Init.AccumulatedActiveH = VSW + VBP + LCD_PIXEL_HEIGHT - 1;
/* <20><><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD>(HSW+HBP+<2B><>Ч<EFBFBD><D0A7><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>+HFP-1) */
Ltdc_Handler.Init.TotalWidth = HSW + HBP + LCD_PIXEL_WIDTH + HFP - 1;
/* <20><><EFBFBD><EFBFBD><EFBFBD>ܸ߶<DCB8>(VSW+VBP+<2B><>Ч<EFBFBD><D0A7><EFBFBD>ظ߶<D8B8>+VFP-1) */
Ltdc_Handler.Init.TotalHeigh = VSW + VBP + LCD_PIXEL_HEIGHT + VFP - 1;
/* <20><>ʼ<EFBFBD><CABC>LCD<43><44><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF>Ⱥ͸߶<CDB8> */
Ltdc_Handler.LayerCfg->ImageWidth = LCD_PIXEL_WIDTH;
Ltdc_Handler.LayerCfg->ImageHeight = LCD_PIXEL_HEIGHT;
/* <20><><EFBFBD><EFBFBD>LCD<43><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>Ĭ<EFBFBD>Ϻ<EFBFBD>ɫ */
Ltdc_Handler.Init.Backcolor.Red = 0;
Ltdc_Handler.Init.Backcolor.Green = 0;
Ltdc_Handler.Init.Backcolor.Blue = 0;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3>͵<EFBFBD>ƽ<EFBFBD><C6BD>Ч */
Ltdc_Handler.Init.HSPolarity = LTDC_HSPOLARITY_AL;
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3>͵<EFBFBD>ƽ<EFBFBD><C6BD>Ч */
Ltdc_Handler.Init.VSPolarity = LTDC_VSPOLARITY_AL;
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ԣ<EFBFBD><D4A3>͵<EFBFBD>ƽ<EFBFBD><C6BD>Ч */
Ltdc_Handler.Init.DEPolarity = LTDC_DEPOLARITY_AL;
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ӽ<EFBFBD><D3BC>ԣ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
Ltdc_Handler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
HAL_LTDC_Init(&Ltdc_Handler);
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
LCD_SetFont(&LCD_DEFAULT_FONT);
}
/**
* @brief <EFBFBD><EFBFBD>ȡLCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
* @retval X<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
*/
uint32_t LCD_GetXSize(void)
{
return Ltdc_Handler.LayerCfg[ActiveLayer].ImageWidth;
}
/**
* @brief <EFBFBD><EFBFBD>ȡLCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
* @retval Y<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
*/
uint32_t LCD_GetYSize(void)
{
return Ltdc_Handler.LayerCfg[ActiveLayer].ImageHeight;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
* @param imageWidthPixels<EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_SetXSize(uint32_t imageWidthPixels)
{
Ltdc_Handler.LayerCfg[ActiveLayer].ImageWidth = imageWidthPixels;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
* @param imageHeightPixels<EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD>
* @retval None
*/
void LCD_SetYSize(uint32_t imageHeightPixels)
{
Ltdc_Handler.LayerCfg[ActiveLayer].ImageHeight = imageHeightPixels;
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>
* @param LayerIndex: ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>1)<EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>0)
* @param FB_Address: ÿһ<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param PixelFormat: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>ʽ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_LayerInit(uint16_t LayerIndex, uint32_t FB_Address, uint32_t PixelFormat)
{
LTDC_LayerCfgTypeDef layer_cfg;
/* <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
layer_cfg.WindowX0 = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<CABC><CEBB>X<EFBFBD><58><EFBFBD><EFBFBD>
layer_cfg.WindowX1 = LCD_GetXSize(); //<2F><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>λ<EFBFBD><CEBB>X<EFBFBD><58><EFBFBD><EFBFBD>
layer_cfg.WindowY0 = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<CABC><CEBB>Y<EFBFBD><59><EFBFBD><EFBFBD>
layer_cfg.WindowY1 = LCD_GetYSize(); //<2F><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>λ<EFBFBD><CEBB>Y<EFBFBD><59><EFBFBD><EFBFBD>
layer_cfg.PixelFormat = PixelFormat; //<2F><><EFBFBD>ظ<EFBFBD>ʽ
layer_cfg.FBStartAdress = FB_Address; //<2F><><EFBFBD>Դ<EFBFBD><D4B4>׵<EFBFBD>ַ
layer_cfg.Alpha = 255; //<2F><><EFBFBD>ڻ<EFBFBD><DABB>ϵ<EFBFBD>͸<EFBFBD><CDB8><EFBFBD>ȳ<EFBFBD><C8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>0<EFBFBD><30>255<35><35><30><CEAA>ȫ͸<C8AB><CDB8>
layer_cfg.Alpha0 = 0; //Ĭ<><C4AC>͸<EFBFBD><CDB8><EFBFBD>ȳ<EFBFBD><C8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>0<EFBFBD><30>255<35><35><30><CEAA>ȫ͸<C8AB><CDB8>
layer_cfg.Backcolor.Blue = 0; //<2F><EFBFBD><E3B1B3><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
layer_cfg.Backcolor.Green = 0; //<2F><EFBFBD><E3B1B3><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
layer_cfg.Backcolor.Red = 0; //<2F><EFBFBD><E3B1B3><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>1
layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>2
layer_cfg.ImageWidth = LCD_GetXSize();//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
layer_cfg.ImageHeight = LCD_GetYSize();//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>߶<EFBFBD>
HAL_LTDC_ConfigLayer(&Ltdc_Handler, &layer_cfg, LayerIndex); //<2F><><EFBFBD><EFBFBD>ѡ<EFBFBD>еIJ<D0B5><C4B2><EFBFBD><EFBFBD><EFBFBD>
DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE;//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
DrawProp[LayerIndex].pFont = &LCD_DEFAULT_FONT;//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK; //<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B1B3><EFBFBD><EFBFBD>ɫ
__HAL_LTDC_RELOAD_CONFIG(&Ltdc_Handler);//<2F><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
}
/**
* @brief ѡ<EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>
* @param LayerIndex: ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>1)<EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>0)
* @retval <EFBFBD><EFBFBD>
*/
void LCD_SelectLayer(uint32_t LayerIndex)
{
ActiveLayer = LayerIndex;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ӻ<EFBFBD>
* @param LayerIndex: ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>1)<EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>0)
* @param State: <EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_SetLayerVisible(uint32_t LayerIndex, FunctionalState State)
{
if (State == ENABLE)
{
__HAL_LTDC_LAYER_ENABLE(&Ltdc_Handler, LayerIndex);
}
else
{
__HAL_LTDC_LAYER_DISABLE(&Ltdc_Handler, LayerIndex);
}
__HAL_LTDC_RELOAD_CONFIG(&Ltdc_Handler);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD><EFBFBD>ȳ<EFBFBD><EFBFBD><EFBFBD>
* @param LayerIndex: ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>1)<EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>0)
* @param Transparency: ͸<EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>255<EFBFBD><EFBFBD>0Ϊ<EFBFBD><EFBFBD>ȫ͸<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_SetTransparency(uint32_t LayerIndex, uint8_t Transparency)
{
HAL_LTDC_SetAlpha(&Ltdc_Handler, Transparency, LayerIndex);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param LayerIndex: ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>1)<EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>0)
* @param Address: LCD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_SetLayerAddress(uint32_t LayerIndex, uint32_t Address)
{
HAL_LTDC_SetAddress(&Ltdc_Handler, Address, LayerIndex);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param LayerIndex: ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>1)<EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>0)
* @param Xpos: LCD X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD>
* @param Ypos: LCD Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD>
* @param Width: LCD <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>С
* @param Height: LCD <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>С
* @retval None
*/
void LCD_SetLayerWindow(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>ڴ<EFBFBD>С */
HAL_LTDC_SetWindowSize(&Ltdc_Handler, Width, Height, LayerIndex);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>ڵ<EFBFBD><DAB5><EFBFBD>ʼλ<CABC><CEBB> */
HAL_LTDC_SetWindowPosition(&Ltdc_Handler, Xpos, Ypos, LayerIndex);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @param Color: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_SetTextColor(uint32_t Color)
{
DrawProp[ActiveLayer].TextColor = Color;
}
/**
* @brief <EFBFBD><EFBFBD>ȡLCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
*/
uint32_t LCD_GetTextColor(void)
{
return DrawProp[ActiveLayer].TextColor;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @param Color: <EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_SetBackColor(uint32_t Color)
{
DrawProp[ActiveLayer].BackColor = Color;
}
/**
* @brief <EFBFBD><EFBFBD>ȡLCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @retval <EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
*/
uint32_t LCD_GetBackColor(void)
{
return DrawProp[ActiveLayer].BackColor;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @param TextColor: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @param BackColor: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_SetColors(uint32_t TextColor, uint32_t BackColor)
{
LCD_SetTextColor(TextColor);
LCD_SetBackColor(BackColor);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param fonts: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval None
*/
void LCD_SetFont(sFONT* fonts)
{
DrawProp[ActiveLayer].pFont = fonts;
}
/**
* @brief <EFBFBD><EFBFBD>ȡLCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
sFONT* LCD_GetFont(void)
{
return DrawProp[ActiveLayer].pFont;
}
/**
* @brief <EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param Xpos: X <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
* @param Ypos: Y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
* @retval RGB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*/
uint32_t LCD_ReadPixel(uint16_t Xpos, uint16_t Ypos)
{
uint32_t ret = 0;
if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
{
/* <20><>SDRAM<41>Դ<EFBFBD><D4B4>ж<EFBFBD>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD> */
ret = *(__IO uint32_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (2 * (Ypos * LCD_GetXSize() + Xpos)));
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
{
/* <20><>SDRAM<41>Դ<EFBFBD><D4B4>ж<EFBFBD>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD> */
ret = (*(__IO uint8_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (3 * (Ypos * LCD_GetXSize() + Xpos)) + 2) & 0x00FFFFFF);
ret |= (*(__IO uint8_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (3 * (Ypos * LCD_GetXSize() + Xpos)) + 1) & 0x00FFFFFF);
ret |= (*(__IO uint8_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (3 * (Ypos * LCD_GetXSize() + Xpos))) & 0x00FFFFFF);
}
else if ((Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_AL88))
{
/* <20><>SDRAM<41>Դ<EFBFBD><D4B4>ж<EFBFBD>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD> */
ret = *(__IO uint16_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (2 * (Ypos * LCD_GetXSize() + Xpos)));
}
else
{
/* <20><>SDRAM<41>Դ<EFBFBD><D4B4>ж<EFBFBD>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD> */
ret = *(__IO uint8_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (2 * (Ypos * LCD_GetXSize() + Xpos)));
}
return ret;
}
/**
* @brief LCD<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Color: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @retval None
*/
void LCD_Clear(uint32_t Color)
{
/* <20><><EFBFBD><EFBFBD> */
LL_FillBuffer(ActiveLayer, (uint32_t*)(Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress), LCD_GetXSize(), LCD_GetYSize(), 0, Color);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
* @param Line: <EFBFBD><EFBFBD>
* @retval None
*/
void LCD_ClearLine(uint32_t Line)
{
uint32_t color_backup = DrawProp[ActiveLayer].TextColor;
DrawProp[ActiveLayer].TextColor = DrawProp[ActiveLayer].BackColor;
/* <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫһ<C9AB>µľ<C2B5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
LCD_FillRect(0, (Line * DrawProp[ActiveLayer].pFont->Height), LCD_GetXSize(), DrawProp[ActiveLayer].pFont->Height);
DrawProp[ActiveLayer].TextColor = color_backup;
LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
HAL_Delay(1);
}
/**
* @brief <EFBFBD><EFBFBD>ʾһ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ascii: <EFBFBD>ַ<EFBFBD> ascii <EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD> 0x20 <EFBFBD><EFBFBD>0x7E <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii)
{
DrawChar(Xpos, Ypos, &DrawProp[ActiveLayer].pFont->table[(Ascii - ' ') * \
DrawProp[ActiveLayer].pFont->Height * ((DrawProp[ActiveLayer].pFont->Width + 7) / 8)]);
}
/**
* @brief <EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Text: <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param Mode: <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CENTER_MODE<EFBFBD><EFBFBD>RIGHT_MODE<EFBFBD><EFBFBD>LEFT_MODE
* @retval None
*/
void LCD_DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t * Text, Text_AlignModeTypdef Mode)
{
uint16_t ref_column = 1, i = 0;
uint32_t size = 0, xsize = 0;
uint8_t* ptr = Text;
/* <20><>ȡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>С */
while (*ptr++) size++;
/* ÿһ<C3BF>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
xsize = (LCD_GetXSize() / DrawProp[ActiveLayer].pFont->Width);
switch (Mode)
{
case CENTER_MODE:
{
ref_column = Xpos + ((xsize - size) * DrawProp[ActiveLayer].pFont->Width) / 2;
break;
}
case LEFT_MODE:
{
ref_column = Xpos;
break;
}
case RIGHT_MODE:
{
ref_column = -Xpos + ((xsize - size) * DrawProp[ActiveLayer].pFont->Width);
break;
}
default:
{
ref_column = Xpos;
break;
}
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Χ<EFBFBD><CEA7> */
if ((ref_column < 1) || (ref_column >= 0x8000))
{
ref_column = 1;
}
/* ʹ<><CAB9><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾÿһ<C3BF><D2BB><EFBFBD>ַ<EFBFBD>*/
while ((*Text != 0) & (((LCD_GetXSize() - (i * DrawProp[ActiveLayer].pFont->Width)) & 0xFFFF)\
>= DrawProp[ActiveLayer].pFont->Width))
{
/* <20><>ʾһ<CABE><D2BB><EFBFBD>ַ<EFBFBD> */
LCD_DisplayChar(ref_column, Ypos, *Text);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ƫ<EFBFBD><C6AB>λ<EFBFBD><CEBB> */
ref_column += DrawProp[ActiveLayer].pFont->Width;
/* ָ<><D6B8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD> */
Text++;
i++;
}
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>60<EFBFBD><EFBFBD>)
* @param Line: <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ptr: <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DisplayStringLine(uint16_t Line, uint8_t * ptr)
{
LCD_DisplayStringAt(0, LINE(Line), ptr, LEFT_MODE);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
* @param usX <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼX<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param usY <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼY<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param usChar <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void LCD_DispChar_CH(uint16_t Xpos, uint16_t Ypos, uint16_t Text)
{
uint32_t i = 0, j = 0;
uint16_t height, width;
uint8_t offset;
uint8_t* pchar;
uint8_t Buffer[HEIGHT_CH_CHAR * 3];
uint32_t line;
GetGBKCode(Buffer, Text);
height = HEIGHT_CH_CHAR;//ȡ<><C8A1>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
width = WIDTH_CH_CHAR; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
offset = 8 * ((width + 7) / 8) - width;//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ƫ<EFBFBD><C6AB>ֵ<EFBFBD><D6B5>ʵ<EFBFBD>ʴ洢<CAB4><E6B4A2>С-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (i = 0; i < height; i++)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶Ȼ<DFB6><C8BB><EFBFBD>
{
pchar = ((uint8_t*)Buffer + (width + 7) / 8 * i);//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
switch (((width + 7) / 8))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
{
case 1:
line = pchar[0]; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>8<EFBFBD><38><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
break;
case 2:
line = (pchar[0] << 8) | pchar[1]; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>8С<38><D0A1>16<31><36><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
break;
case 3:
default:
line = (pchar[0] << 16) | (pchar[1] << 8) | pchar[2]; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>16С<36><D0A1>24<32><34><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
break;
}
for (j = 0; j < width; j++)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD>
{
if (line & (1 << (width - j + offset - 1))) //<2F><><EFBFBD><EFBFBD>ÿһ<C3BF>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ƫ<EFBFBD><C6AB>λ<EFBFBD>ð<EFBFBD><C3B0>յ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>л<EFBFBD><D0BB><EFBFBD>
{
LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].TextColor);
}
else//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
{
LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].BackColor);
}
}
Ypos++;
}
}
/**
* @brief <EFBFBD><EFBFBD>ʾһ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
<EFBFBD><EFBFBD>Ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFont24<EFBFBD><EFBFBD>ʽ
* @param Line: Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD>LINE(0) - LINE(N)
* @param *ptr: Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @retval None
*/
void LCD_DisplayStringLine_EN_CH(uint16_t Line, uint8_t * ptr)
{
uint16_t refcolumn = 0;
/* <20>ж<EFBFBD><D0B6><EFBFBD>ʾλ<CABE>ò<EFBFBD><C3B2>ܳ<EFBFBD><DCB3><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD>ı߽<C4B1> */
while ((refcolumn < LCD_PIXEL_WIDTH) && ((*ptr != 0) & (((refcolumn + DrawProp[ActiveLayer].pFont->Width) & 0xFFFF) >= DrawProp[ActiveLayer].pFont->Width)))
{
/* ʹ<><CAB9>LCD<43><44>ʾһ<CABE><D2BB><EFBFBD>ַ<EFBFBD> */
if (*ptr <= 126) //Ӣ<><D3A2><EFBFBD>ַ<EFBFBD>
{
LCD_DisplayChar(refcolumn, LINE(Line), *ptr);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>λ<EFBFBD><CEBB> */
refcolumn += DrawProp[ActiveLayer].pFont->Width;
/* ָ<><D6B8><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD> */
ptr++;
}
else //<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
{
uint16_t usCh;
/*һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>*/
usCh = *(uint16_t*)ptr;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>*/
usCh = (usCh << 8) + (usCh >> 8);
/*<2A><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>*/
LCD_DispChar_CH(refcolumn, LINE(Line), usCh);
/*<2A><>ʾλ<CABE><CEBB>ƫ<EFBFBD><C6AB>*/
refcolumn += WIDTH_CH_CHAR;
/* ָ<><D6B8><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD> */
ptr += 2;
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>Ӣ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
<EFBFBD><EFBFBD>Ӣ<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>ʾʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFont16x24<EFBFBD><EFBFBD>ʽ
* @param Line <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊy<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
* @param Column <EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊx<EFBFBD><EFBFBD><EFBFBD>
* @param pStr <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DispString_EN_CH(uint16_t Line, uint16_t Column, const uint8_t * pStr)
{
/* <20>ж<EFBFBD><D0B6><EFBFBD>ʾλ<CABE>ò<EFBFBD><C3B2>ܳ<EFBFBD><DCB3><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD>ı߽<C4B1> */
while ((Column < LCD_PIXEL_WIDTH) && ((*pStr != 0) & (((Column + DrawProp[ActiveLayer].pFont->Width) & 0xFFFF) >= DrawProp[ActiveLayer].pFont->Width)))
{
/* ʹ<><CAB9>LCD<43><44>ʾһ<CABE><D2BB><EFBFBD>ַ<EFBFBD> */
if (*pStr <= 126) //Ӣ<><D3A2><EFBFBD>ַ<EFBFBD>
{
LCD_DisplayChar(Column, Line, *pStr);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>λ<EFBFBD><CEBB> */
Column += DrawProp[ActiveLayer].pFont->Width;
/* ָ<><D6B8><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD> */
pStr++;
}
else //<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
{
uint16_t usCh;
/*һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>*/
usCh = *(uint16_t*)pStr;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>*/
usCh = (usCh << 8) + (usCh >> 8);
/*<2A><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>*/
LCD_DispChar_CH(Column, Line, usCh);
/*<2A><>ʾλ<CABE><CEBB>ƫ<EFBFBD><C6AB>*/
Column += WIDTH_CH_CHAR;
/* ָ<><D6B8><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD> */
pStr += 2;
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˮƽ<EFBFBD><EFBFBD>
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Length: <EFBFBD>ߵij<EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
{
uint32_t Xaddress = 0;
if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
{
Xaddress = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 4 * (LCD_GetXSize() * Ypos + Xpos);
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
{
Xaddress = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 3 * (LCD_GetXSize() * Ypos + Xpos);
}
else if ((Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_AL88))
{
Xaddress = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 2 * (LCD_GetXSize() * Ypos + Xpos);
}
else
{
Xaddress = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 2 * (LCD_GetXSize() * Ypos + Xpos);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
LL_FillBuffer(ActiveLayer, (uint32_t*)Xaddress, Length, 1, 0, DrawProp[ActiveLayer].TextColor);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD>ֱ<EFBFBD><EFBFBD>
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Length: <EFBFBD>ߵij<EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
{
uint32_t Xaddress = 0;
if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
{
Xaddress = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 4 * (LCD_GetXSize() * Ypos + Xpos);
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
{
Xaddress = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 3 * (LCD_GetXSize() * Ypos + Xpos);
}
else if ((Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_AL88))
{
Xaddress = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 2 * (LCD_GetXSize() * Ypos + Xpos);
}
else
{
Xaddress = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 2 * (LCD_GetXSize() * Ypos + Xpos);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
LL_FillBuffer(ActiveLayer, (uint32_t*)Xaddress, 1, Length, (LCD_GetXSize() - 1), DrawProp[ActiveLayer].TextColor);
}
/**
* @brief ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x1: <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param y1: <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x2: <EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param y2: <EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
yinc1 = 0, yinc2 = 0, den = 0, num = 0, num_add = 0, num_pixels = 0,
curpixel = 0;
deltax = ABS(x2 - x1); /* <20><>x<EFBFBD><78><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>ֵ */
deltay = ABS(y2 - y1); /* <20><>y<EFBFBD><79><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>ֵ */
x = x1; /* <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>x<EFBFBD><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼֵ */
y = y1; /* <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼֵ */
if (x2 >= x1) /* x<><78><EFBFBD><EFBFBD>ֵΪ<D6B5><CEAA><EFBFBD><EFBFBD> */
{
xinc1 = 1;
xinc2 = 1;
}
else /* x<><78><EFBFBD><EFBFBD>ֵΪ<D6B5>ݼ<EFBFBD> */
{
xinc1 = -1;
xinc2 = -1;
}
if (y2 >= y1) /* y<><79><EFBFBD><EFBFBD>ֵΪ<D6B5><CEAA><EFBFBD><EFBFBD> */
{
yinc1 = 1;
yinc2 = 1;
}
else /* y<><79><EFBFBD><EFBFBD>ֵΪ<D6B5>ݼ<EFBFBD> */
{
yinc1 = -1;
yinc2 = -1;
}
if (deltax >= deltay) /* ÿ<><C3BF> y <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>x<EFBFBD><78><EFBFBD><EFBFBD>ֵ*/
{
xinc1 = 0; /* <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD>ڷ<EFBFBD>ĸʱ<C4B8><CAB1>Ҫ<EFBFBD>ı<EFBFBD> x */
yinc2 = 0; /* <20><>ҪΪÿ<CEAA>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> y */
den = deltax;
num = deltax / 2;
num_add = deltay;
num_pixels = deltax; /* x<><78>y<EFBFBD><79><EFBFBD><EFBFBD>ֵ */
}
else /* ÿ<><C3BF> x <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>y<EFBFBD><79><EFBFBD><EFBFBD>ֵ */
{
xinc2 = 0; /* <20><>ҪΪÿ<CEAA>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x */
yinc1 = 0; /* <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD>ڷ<EFBFBD>ĸʱ<C4B8><CAB1>Ҫ<EFBFBD>ı<EFBFBD> y */
den = deltay;
num = deltay / 2;
num_add = deltax;
num_pixels = deltay; /* y<><79>x<EFBFBD><78><EFBFBD><EFBFBD>ֵ */
}
for (curpixel = 0; curpixel <= num_pixels; curpixel++)
{
LCD_DrawPixel(x, y, DrawProp[ActiveLayer].TextColor); /* <20><><EFBFBD>Ƶ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD> */
num += num_add; /* <20>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD> */
if (num >= den) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD>ڷ<EFBFBD>ĸ */
{
num -= den; /* <20><><EFBFBD><EFBFBD><EFBFBD>µķ<C2B5><C4B7><EFBFBD>ֵ */
x += xinc1; /* xֵ<78><D6B5><EFBFBD><EFBFBD> */
y += yinc1; /* yֵ<79><D6B5><EFBFBD><EFBFBD> */
}
x += xinc2; /* yֵ<79><D6B5><EFBFBD><EFBFBD> */
y += yinc2; /* yֵ<79><D6B5><EFBFBD><EFBFBD> */
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Width: <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><EFBFBD><EFBFBD>
* @param Height: <EFBFBD><EFBFBD><EFBFBD>θ߶<EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
/* <20><><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD> */
LCD_DrawHLine(Xpos, Ypos, Width);
LCD_DrawHLine(Xpos, (Ypos + Height), Width);
/* <20><><EFBFBD>ƴ<EFBFBD>ֱ<EFBFBD><D6B1> */
LCD_DrawVLine(Xpos, Ypos, Height);
LCD_DrawVLine((Xpos + Width), Ypos, Height);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD>
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Radius: Բ<EFBFBD>İ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
{
int32_t decision; /* <20><><EFBFBD>߱<EFBFBD><DFB1><EFBFBD> */
uint32_t current_x; /* <20><>ǰx<C7B0><78><EFBFBD><EFBFBD>ֵ */
uint32_t current_y; /* <20><>ǰy<C7B0><79><EFBFBD><EFBFBD>ֵ */
decision = 3 - (Radius << 1);
current_x = 0;
current_y = Radius;
while (current_x <= current_y)
{
LCD_DrawPixel((Xpos + current_x), (Ypos - current_y), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos - current_x), (Ypos - current_y), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos + current_y), (Ypos - current_x), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos - current_y), (Ypos - current_x), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos + current_x), (Ypos + current_y), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos - current_x), (Ypos + current_y), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos + current_y), (Ypos + current_x), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos - current_y), (Ypos + current_x), DrawProp[ActiveLayer].TextColor);
if (decision < 0)
{
decision += (current_x << 2) + 6;
}
else
{
decision += ((current_x - current_y) << 2) + 10;
current_y--;
}
current_x++;
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Points: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param PointCount: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawPolygon(pPoint Points, uint16_t PointCount)
{
int16_t x = 0, y = 0;
if (PointCount < 2)
{
return;
}
LCD_DrawLine(Points->X, Points->Y, (Points + PointCount - 1)->X, (Points + PointCount - 1)->Y);
while (--PointCount)
{
x = Points->X;
y = Points->Y;
Points++;
LCD_DrawLine(x, y, Points->X, Points->Y);
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param XRadius: <EFBFBD><EFBFBD>ԲX<EFBFBD><EFBFBD><EFBFBD>
* @param YRadius: <EFBFBD><EFBFBD>ԲY<EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius)
{
int x = 0, y = -YRadius, err = 2 - 2 * XRadius, e2;
float k = 0, rad1 = 0, rad2 = 0;
rad1 = XRadius;
rad2 = YRadius;
k = (float)(rad2 / rad1);
do {
LCD_DrawPixel((Xpos - (uint16_t)(x / k)), (Ypos + y), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos + (uint16_t)(x / k)), (Ypos + y), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos + (uint16_t)(x / k)), (Ypos - y), DrawProp[ActiveLayer].TextColor);
LCD_DrawPixel((Xpos - (uint16_t)(x / k)), (Ypos - y), DrawProp[ActiveLayer].TextColor);
e2 = err;
if (e2 <= x) {
err += ++x * 2 + 1;
if (-y == x && e2 <= y) e2 = 0;
}
if (e2 > y) err += ++y * 2 + 1;
} while (y <= 0);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param RGB_Code: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫֵ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code)
{
if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
{
*(__IO uint32_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (4 * (Ypos * LCD_GetXSize() + Xpos))) = RGB_Code;
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
{
*(__IO uint8_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (3 * (Ypos * LCD_GetXSize() + Xpos)) + 2) = 0xFF & (RGB_Code >> 16);
*(__IO uint8_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (3 * (Ypos * LCD_GetXSize() + Xpos)) + 1) = 0xFF & (RGB_Code >> 8);
*(__IO uint8_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (3 * (Ypos * LCD_GetXSize() + Xpos))) = 0xFF & RGB_Code;
}
else if ((Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_AL88))
{
*(__IO uint16_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (2 * (Ypos * LCD_GetXSize() + Xpos))) = (uint16_t)RGB_Code;
}
else
{
*(__IO uint16_t*) (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (2 * (Ypos * LCD_GetXSize() + Xpos))) = (uint16_t)RGB_Code;
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>flash<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ARGB888(32 bits per pixel)<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>ͼƬ
* @param Xpos: Bmp<EFBFBD><EFBFBD>Һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>X <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Bmp<EFBFBD><EFBFBD>Һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pbmp: ָ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>flash<EFBFBD><EFBFBD>BmpͼƬ<EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DrawBitmap(uint32_t Xpos, uint32_t Ypos, uint8_t * pbmp)
{
uint32_t index = 0, width = 0, height = 0, bit_pixel = 0;
uint32_t address;
uint32_t input_color_mode = 0;
/* <20><>ȡλͼ<CEBB><CDBC><EFBFBD>ݵĻ<DDB5><C4BB><EFBFBD>ַ */
index = *(__IO uint16_t*) (pbmp + 10);
index |= (*(__IO uint16_t*) (pbmp + 12)) << 16;
/* <20><>ȡλͼ<CEBB><CDBC><EFBFBD><EFBFBD> */
width = *(uint16_t*)(pbmp + 18);
width |= (*(uint16_t*)(pbmp + 20)) << 16;
/* <20><>ȡλͼ<CEBB>߶<EFBFBD> */
height = *(uint16_t*)(pbmp + 22);
height |= (*(uint16_t*)(pbmp + 24)) << 16;
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD> */
bit_pixel = *(uint16_t*)(pbmp + 28);
/* <20><EFBFBD><E8B6A8>ַ */
address = Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress + (((LCD_GetXSize() * Ypos) + Xpos) * (4));
/*<2A>жϲ<D0B6><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>ʽ */
if ((bit_pixel / 8) == 4)
{
input_color_mode = DMA2D_INPUT_ARGB8888;
}
else if ((bit_pixel / 8) == 2)
{
input_color_mode = DMA2D_INPUT_RGB565;
}
else
{
input_color_mode = DMA2D_INPUT_RGB888;
}
/* <20>ƹ<EFBFBD>λͼ<CEBB><CDBC>֡ͷ */
pbmp += (index + (width * (height - 1) * (bit_pixel / 8)));
/* <20><>ͼƬת<C6AC><D7AA>Ϊ ARGB8888 <20><><EFBFBD>ظ<EFBFBD>ʽ */
for (index = 0; index < height; index++)
{
/* <20><><EFBFBD>ظ<EFBFBD>ʽת<CABD><D7AA> */
LL_ConvertLineToARGB8888((uint32_t*)pbmp, (uint32_t*)address, width, input_color_mode);
/* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>Ŀ<EFBFBD><EFBFBD><EABBBA><EFBFBD><EFBFBD> */
address += (LCD_GetXSize() * 4);
pbmp -= width * (bit_pixel / 8);
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʵ<EFBFBD>ľ<EFBFBD><EFBFBD><EFBFBD>
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param Width: <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><EFBFBD><EFBFBD>
* @param Height: <EFBFBD><EFBFBD><EFBFBD>θ߶<EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
uint32_t x_address = 0;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ */
LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
/* <20><><EFBFBD>þ<EFBFBD><C3BE>ο<EFBFBD>ʼ<EFBFBD><CABC>ַ */
if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
{
x_address = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 4 * (LCD_GetXSize() * Ypos + Xpos);
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
{
x_address = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 3 * (LCD_GetXSize() * Ypos + Xpos);
}
else if ((Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_AL88))
{
x_address = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 2 * (LCD_GetXSize() * Ypos + Xpos);
}
else
{
x_address = (Ltdc_Handler.LayerCfg[ActiveLayer].FBStartAdress) + 2 * (LCD_GetXSize() * Ypos + Xpos);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
LL_FillBuffer(ActiveLayer, (uint32_t*)x_address, Width, Height, (LCD_GetXSize() - Width), DrawProp[ActiveLayer].TextColor);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>Բ
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param Radius: Բ<EFBFBD>İ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_FillCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
{
int32_t decision; /* <20><><EFBFBD>߱<EFBFBD><DFB1><EFBFBD> */
uint32_t current_x; /* <20><>ǰx<C7B0><78><EFBFBD><EFBFBD>ֵ */
uint32_t current_y; /* <20><>ǰy<C7B0><79><EFBFBD><EFBFBD>ֵ */
decision = 3 - (Radius << 1);
current_x = 0;
current_y = Radius;
LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
while (current_x <= current_y)
{
if (current_y > 0)
{
LCD_DrawHLine(Xpos - current_y, Ypos + current_x, 2 * current_y);
LCD_DrawHLine(Xpos - current_y, Ypos - current_x, 2 * current_y);
}
if (current_x > 0)
{
LCD_DrawHLine(Xpos - current_x, Ypos - current_y, 2 * current_x);
LCD_DrawHLine(Xpos - current_x, Ypos + current_y, 2 * current_x);
}
if (decision < 0)
{
decision += (current_x << 2) + 6;
}
else
{
decision += ((current_x - current_y) << 2) + 10;
current_y--;
}
current_x++;
}
LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
LCD_DrawCircle(Xpos, Ypos, Radius);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Points: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param PointCount: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_FillPolygon(pPoint Points, uint16_t PointCount)
{
int16_t X = 0, Y = 0, X2 = 0, Y2 = 0, X_center = 0, Y_center = 0, X_first = 0, Y_first = 0, pixelX = 0, pixelY = 0, counter = 0;
uint16_t image_left = 0, image_right = 0, image_top = 0, image_bottom = 0;
image_left = image_right = Points->X;
image_top = image_bottom = Points->Y;
for (counter = 1; counter < PointCount; counter++)
{
pixelX = POLY_X(counter);
if (pixelX < image_left)
{
image_left = pixelX;
}
if (pixelX > image_right)
{
image_right = pixelX;
}
pixelY = POLY_Y(counter);
if (pixelY < image_top)
{
image_top = pixelY;
}
if (pixelY > image_bottom)
{
image_bottom = pixelY;
}
}
if (PointCount < 2)
{
return;
}
X_center = (image_left + image_right) / 2;
Y_center = (image_bottom + image_top) / 2;
X_first = Points->X;
Y_first = Points->Y;
while (--PointCount)
{
X = Points->X;
Y = Points->Y;
Points++;
X2 = Points->X;
Y2 = Points->Y;
FillTriangle(X, X2, X_center, Y, Y2, Y_center);
FillTriangle(X, X_center, X2, Y, Y_center, Y2);
FillTriangle(X_center, X2, X, Y_center, Y2, Y);
}
FillTriangle(X_first, X2, X_center, Y_first, Y2, Y_center);
FillTriangle(X_first, X_center, X2, Y_first, Y_center, Y2);
FillTriangle(X_center, X2, X_first, Y_center, Y2, Y_first);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ
* @param Xpos: X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Ypos: Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param XRadius: <EFBFBD><EFBFBD>ԲX<EFBFBD><EFBFBD><EFBFBD>
* @param YRadius: <EFBFBD><EFBFBD>ԲY<EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void LCD_FillEllipse(int Xpos, int Ypos, int XRadius, int YRadius)
{
int x = 0, y = -YRadius, err = 2 - 2 * XRadius, e2;
float k = 0, rad1 = 0, rad2 = 0;
rad1 = XRadius;
rad2 = YRadius;
k = (float)(rad2 / rad1);
do
{
LCD_DrawHLine((Xpos - (uint16_t)(x / k)), (Ypos + y), (2 * (uint16_t)(x / k) + 1));
LCD_DrawHLine((Xpos - (uint16_t)(x / k)), (Ypos - y), (2 * (uint16_t)(x / k) + 1));
e2 = err;
if (e2 <= x)
{
err += ++x * 2 + 1;
if (-y == x && e2 <= y) e2 = 0;
}
if (e2 > y) err += ++y * 2 + 1;
} while (y <= 0);
}
/**
* @brief ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DisplayOn(void)
{
/* <20><><EFBFBD><EFBFBD>ʾ */
__HAL_LTDC_ENABLE(&Ltdc_Handler);
// HAL_GPIO_WritePin(LTDC_DISP_GPIO_PORT, LTDC_DISP_GPIO_PIN, GPIO_PIN_SET);/* LCD_DISPʹ<50><CAB9>*/
HAL_GPIO_WritePin(LTDC_BL_GPIO_PORT, LTDC_BL_GPIO_PIN, GPIO_PIN_SET); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
* @retval <EFBFBD><EFBFBD>
*/
void LCD_DisplayOff(void)
{
/* <20><><EFBFBD><EFBFBD>ʾ */
__HAL_LTDC_DISABLE(&Ltdc_Handler);
// HAL_GPIO_WritePin(LTDC_DISP_GPIO_PORT, LTDC_DISP_GPIO_PIN, GPIO_PIN_RESET); /* LCD_DISP<53><50><EFBFBD><EFBFBD>*/
HAL_GPIO_WritePin(LTDC_BL_GPIO_PORT, LTDC_BL_GPIO_PIN, GPIO_PIN_RESET);/*<2A>ر<EFBFBD><D8B1><EFBFBD>*/
}
/*******************************************************************************
<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
/**
* @brief <EFBFBD><EFBFBD>ʾһ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
* @param Xpos: <EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
* @param Ypos: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD>
* @param c: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t * c)
{
uint32_t i = 0, j = 0;
uint16_t height, width;
uint8_t offset;
uint8_t* pchar;
uint32_t line;
height = DrawProp[ActiveLayer].pFont->Height;//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
width = DrawProp[ActiveLayer].pFont->Width; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
offset = 8 * ((width + 7) / 8) - width;//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ƫ<EFBFBD><C6AB>ֵ<EFBFBD><D6B5>ʵ<EFBFBD>ʴ洢<CAB4><E6B4A2>С-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (i = 0; i < height; i++)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶Ȼ<DFB6><C8BB><EFBFBD>
{
pchar = ((uint8_t*)c + (width + 7) / 8 * i);//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
switch (((width + 7) / 8))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
{
case 1:
line = pchar[0]; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>8<EFBFBD><38><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
break;
case 2:
line = (pchar[0] << 8) | pchar[1]; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>8С<38><D0A1>16<31><36><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
break;
case 3:
default:
line = (pchar[0] << 16) | (pchar[1] << 8) | pchar[2]; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>16С<36><D0A1>24<32><34><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
break;
}
for (j = 0; j < width; j++)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD>
{
if (line & (1 << (width - j + offset - 1))) //<2F><><EFBFBD><EFBFBD>ÿһ<C3BF>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ƫ<EFBFBD><C6AB>λ<EFBFBD>ð<EFBFBD><C3B0>յ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>л<EFBFBD><D0BB><EFBFBD>
{
LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].TextColor);
}
else//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
{
LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].BackColor);
}
}
Ypos++;
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x1: <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param y1: <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param x2: <EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param y2: <EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param x3: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param y3: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @retval <EFBFBD><EFBFBD>
*/
static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3)
{
int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
yinc1 = 0, yinc2 = 0, den = 0, num = 0, num_add = 0, num_pixels = 0,
curpixel = 0;
deltax = ABS(x2 - x1); /* <20><>x<EFBFBD><78><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>ֵ */
deltay = ABS(y2 - y1); /* <20><>y<EFBFBD><79><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>ֵ */
x = x1; /* <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>x<EFBFBD><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼֵ */
y = y1; /* <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼֵ */
if (x2 >= x1) /* x<><78><EFBFBD><EFBFBD>ֵΪ<D6B5><CEAA><EFBFBD><EFBFBD>*/
{
xinc1 = 1;
xinc2 = 1;
}
else /* x<><78><EFBFBD><EFBFBD>ֵΪ<D6B5>ݼ<EFBFBD> */
{
xinc1 = -1;
xinc2 = -1;
}
if (y2 >= y1) /* y<><79><EFBFBD><EFBFBD>ֵΪ<D6B5><CEAA><EFBFBD><EFBFBD>*/
{
yinc1 = 1;
yinc2 = 1;
}
else /* y<><79><EFBFBD><EFBFBD>ֵΪ<D6B5>ݼ<EFBFBD> */
{
yinc1 = -1;
yinc2 = -1;
}
if (deltax >= deltay) /* ÿ<><C3BF> y <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>x<EFBFBD><78><EFBFBD><EFBFBD>ֵ*/
{
xinc1 = 0; /* <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD>ڷ<EFBFBD>ĸʱ<C4B8><CAB1>Ҫ<EFBFBD>ı<EFBFBD> x */
yinc2 = 0; /* <20><>ҪΪÿ<CEAA>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> y */
den = deltax;
num = deltax / 2;
num_add = deltay;
num_pixels = deltax; /* x<><78>y<EFBFBD><79><EFBFBD><EFBFBD>ֵ */
}
else /* ÿ<><C3BF> x <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>y<EFBFBD><79><EFBFBD><EFBFBD>ֵ */
{
xinc2 = 0; /* <20><>ҪΪÿ<CEAA>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x */
yinc1 = 0; /* <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD>ڷ<EFBFBD>ĸʱ<C4B8><CAB1>Ҫ<EFBFBD>ı<EFBFBD> y */
den = deltay;
num = deltay / 2;
num_add = deltax;
num_pixels = deltay; /* y<><79>x<EFBFBD><78><EFBFBD><EFBFBD>ֵ */
}
for (curpixel = 0; curpixel <= num_pixels; curpixel++)
{
LCD_DrawLine(x, y, x3, y3);
num += num_add; /* <20>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD> */
if (num >= den) /* <20>жϷ<D0B6><CFB7><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD>ڷ<EFBFBD>ĸ */
{
num -= den; /* <20><><EFBFBD><EFBFBD><EFBFBD>µķ<C2B5><C4B7><EFBFBD>ֵ */
x += xinc1; /* xֵ<78><D6B5><EFBFBD><EFBFBD> */
y += yinc1; /* yֵ<79><D6B5><EFBFBD><EFBFBD> */
}
x += xinc2; /* xֵ<78><D6B5><EFBFBD><EFBFBD> */
y += yinc2; /* yֵ<79><D6B5><EFBFBD><EFBFBD> */
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param LayerIndex: <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>
* @param pDst: ָ<EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param xSize: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ySize: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
* @param OffLine: ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ColorIndex: <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>ɫ
* @retval None
*/
static void LL_FillBuffer(uint32_t LayerIndex, void* pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex)
{
Dma2d_Handler.Init.Mode = DMA2D_R2M;
if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
{
Dma2d_Handler.Init.ColorMode = DMA2D_OUTPUT_RGB565;
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
{
Dma2d_Handler.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
{
Dma2d_Handler.Init.ColorMode = DMA2D_OUTPUT_RGB888;
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB1555)
{
Dma2d_Handler.Init.ColorMode = DMA2D_OUTPUT_ARGB1555;
}
else if (Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444)
{
Dma2d_Handler.Init.ColorMode = DMA2D_OUTPUT_ARGB4444;
}
Dma2d_Handler.Init.OutputOffset = OffLine;
Dma2d_Handler.Instance = DMA2D;
/* DMA2D <20><>ʼ<EFBFBD><CABC> */
if (HAL_DMA2D_Init(&Dma2d_Handler) == HAL_OK)
{
if (HAL_DMA2D_ConfigLayer(&Dma2d_Handler, LayerIndex) == HAL_OK)
{
if (HAL_DMA2D_Start(&Dma2d_Handler, ColorIndex, (uint32_t)pDst, xSize, ySize) == HAL_OK)
{
/* DMA<4D><41>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD> */
HAL_DMA2D_PollForTransfer(&Dma2d_Handler, 10);
}
}
}
}
/**
* @brief ת<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ΪARGB8888<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>ʽ
* @param pSrc: ָ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param pDst: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @param xSize: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ColorMode: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫģʽ
* @retval <EFBFBD><EFBFBD>
*/
static void LL_ConvertLineToARGB8888(void* pSrc, void* pDst, uint32_t xSize, uint32_t ColorMode)
{
/* <20><><EFBFBD><EFBFBD>DMA2Dģʽ,<2C><>ɫģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> */
Dma2d_Handler.Init.Mode = DMA2D_M2M_PFC;
Dma2d_Handler.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
Dma2d_Handler.Init.OutputOffset = 0;
/* Foreground Configuration */
Dma2d_Handler.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
Dma2d_Handler.LayerCfg[1].InputAlpha = 0xFF;
Dma2d_Handler.LayerCfg[1].InputColorMode = ColorMode;
Dma2d_Handler.LayerCfg[1].InputOffset = 0;
Dma2d_Handler.Instance = DMA2D;
/* DMA2D <20><>ʼ<EFBFBD><CABC> */
if (HAL_DMA2D_Init(&Dma2d_Handler) == HAL_OK)
{
if (HAL_DMA2D_ConfigLayer(&Dma2d_Handler, 1) == HAL_OK)
{
if (HAL_DMA2D_Start(&Dma2d_Handler, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
{
/* DMA<4D><41>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>*/
HAL_DMA2D_PollForTransfer(&Dma2d_Handler, 10);
}
}
}
}
#if GBKCODE_FLASH
/*ʹ<><CAB9>FLASH<53><48>ģ*/
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><E6B4A2>FLASH<53><48><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ <20><>
//GBKCODE_START_ADDRESS <20><>fonts.h<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
/**
* @brief <EFBFBD><EFBFBD>ȡFLASH<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ֿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pBuffer:<EFBFBD><EFBFBD>ֿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param c <EFBFBD><EFBFBD> Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval None.
*/
int GetGBKCode_from_EXFlash( uint8_t * pBuffer, uint16_t c)
{
unsigned char High8bit,Low8bit;
unsigned int pos;
int offset, GBKCODE_START_ADDRESS;
static uint8_t everRead=0;
if(everRead == 0)
{
QSPI_FLASH_Init();
everRead = 1;
}
High8bit= c >> 8; /* ȡ<><C8A1><38><CEBB><EFBFBD><EFBFBD> */
Low8bit= c & 0x00FF; /* ȡ<><C8A1><38><CEBB><EFBFBD><EFBFBD> */
offset = GetResOffset("GB2312_H2424.FON");
if(offset == -1)
printf("<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>FLASH<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ֿ<EFBFBD><EFBFBD>ļ<EFBFBD>\r\n");
else
GBKCODE_START_ADDRESS = offset + RESOURCE_BASE_ADDR;
/*GB2312 <20><>ʽ*/
pos = ((High8bit-0xa1)*94+Low8bit-0xa1)*24*24/8;
memcpy(pBuffer, (uint8_t *)qspi_addr+GBKCODE_START_ADDRESS+pos, 24*24/8);
// BSP_QSPI_FastRead(pBuffer,GBKCODE_START_ADDRESS+pos,24*24/8); //<2F><>ȡ<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
/**
* @brief <EFBFBD><EFBFBD>FLASH<EFBFBD>е<EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դλ<EFBFBD><EFBFBD>
* @param res_base Ŀ¼<EFBFBD><EFBFBD>FLASH<EFBFBD>еĻ<EFBFBD><EFBFBD><EFBFBD>ַ
* @param res_name[in] Ҫ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval -1<EFBFBD><EFBFBD>ʾ<EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>FLASH<EFBFBD>еĻ<EFBFBD><EFBFBD><EFBFBD>ַ
*/
int GetResOffset(const char *res_name)
{
int i,len;
CatalogTypeDef dir;
uint8_t CATALOG_BUF[CATALOG_SIZE];
len =strlen(res_name);
for(i=0;i<CATALOG_SIZE;i+=sizeof(CatalogTypeDef))
{
memcpy((uint8_t*)&dir, (uint8_t *)qspi_addr+RESOURCE_BASE_ADDR+i, sizeof(CatalogTypeDef));
// BSP_QSPI_FastRead((uint8_t*)&dir,RESOURCE_BASE_ADDR+i,sizeof(CatalogTypeDef));
if(strncasecmp(dir.name,res_name,len)==0)
{
return dir.offset;
}
}
return -1;
}
#else
/*ʹ<><CAB9>SD<53><44>ģ*/
static FIL fnew; /* file objects */
static FATFS fs; /* Work area (file system object) for logical drives */
static FRESULT res_sd;
static UINT br; /* File R/W count */
//<2F>ֿ<EFBFBD><D6BF>ļ<EFBFBD><C4BC>洢λ<E6B4A2>ã<EFBFBD>fonts.h<>еĺ꣺
//#define GBKCODE_FILE_NAME "0:/Font/GB2312_H2424.FON"
/**
* @brief <EFBFBD><EFBFBD>ȡSD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ֿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pBuffer:<EFBFBD><EFBFBD>ֿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param c <EFBFBD><EFBFBD> Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval None.
*/
int GetGBKCode_from_sd(uint8_t * pBuffer, uint16_t c)
{
unsigned char High8bit, Low8bit;
unsigned int pos;
static uint8_t everRead = 0;
High8bit = c >> 8; /* ȡ<><C8A1><38><CEBB><EFBFBD><EFBFBD> */
Low8bit = c & 0x00FF; /* ȡ<><C8A1><38><CEBB><EFBFBD><EFBFBD> */
pos = ((High8bit - 0xa1) * 94 + Low8bit - 0xa1) * 24 * 24 / 8;
/*<2A><>һ<EFBFBD><D2BB>ʹ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>sd*/
if (everRead == 0)
{
res_sd = f_mount(&fs, "0:", 1);
everRead = 1;
}
res_sd = f_open(&fnew, GBKCODE_FILE_NAME, FA_OPEN_EXISTING | FA_READ);
if (res_sd == FR_OK)
{
f_lseek(&fnew, pos); //ָ<><D6B8>ƫ<EFBFBD><C6AB>
res_sd = f_read(&fnew, pBuffer, 24 * 24 / 8, &br); //24*24<32><34>С<EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD> <20><><EFBFBD><EFBFBD>ģ ռ<><D5BC>24*24/8<><38><EFBFBD>ֽ<EFBFBD>
f_close(&fnew);
return 0;
}
else
return -1;
}
#endif
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/