STM32H750XB_RT-THREAD/28-电容触摸屏—触摸画板(兼容屏幕版本)/User/lcd/bsp_lcd.c

1758 lines
50 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"
#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))
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
*/
/* <20><>ͬҺ<CDAC><D2BA><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD> */
const LCD_PARAM_TypeDef lcd_param[LCD_TYPE_NUM]={
/* 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
/*<2A><><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
.hbp = 46, //HSYNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.vbp = 23, //VSYNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.hsw = 1, //HSYNC<4E><43><EFBFBD><EFBFBD>
.vsw = 3, //VSYNC<4E><43><EFBFBD><EFBFBD>
.hfp = 40, //HSYNCǰ<43><C7B0><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.vfp = 13, //VSYNCǰ<43><C7B0><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.comment_clock_2byte = 33, //rgb565/argb4444<34><34>˫<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƽ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Һ<EFBFBD><D2BA>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>
.comment_clock_4byte = 21, //Argb8888<38><38><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƽ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Һ<EFBFBD><D2BA>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>
.lcd_pixel_width = LCD_MAX_PIXEL_WIDTH,//Һ<><D2BA><EFBFBD>ֱ<EFBFBD><D6B1>ʣ<EFBFBD><CAA3><EFBFBD>
.lcd_pixel_height = LCD_MAX_PIXEL_HEIGHT,//Һ<><D2BA><EFBFBD>ֱ<EFBFBD><D6B1>ʣ<EFBFBD><CAA3><EFBFBD>
.m_palette_btn_width = 90,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B0B4><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
.m_palette_btn_height = 50,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B0B4><EFBFBD>ĸ߶<C4B8>
},
/* 7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD><35>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> */
{
/*<2A><><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
.hbp = 46, //HSYNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.vbp = 23, //VSYNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.hsw = 1, //HSYNC<4E><43><EFBFBD><EFBFBD>
.vsw = 1, //VSYNC<4E><43><EFBFBD><EFBFBD>
.hfp = 22, //HSYNCǰ<43><C7B0><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.vfp = 22, //VSYNCǰ<43><C7B0><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.comment_clock_2byte = 33, //rgb565/argb4444<34><34>˫<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƽ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Һ<EFBFBD><D2BA>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>
.comment_clock_4byte = 21, //Argb8888<38><38><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƽ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Һ<EFBFBD><D2BA>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>
.lcd_pixel_width = LCD_MAX_PIXEL_WIDTH,//Һ<><D2BA><EFBFBD>ֱ<EFBFBD><D6B1>ʣ<EFBFBD><CAA3><EFBFBD>
.lcd_pixel_height = LCD_MAX_PIXEL_HEIGHT,//Һ<><D2BA><EFBFBD>ֱ<EFBFBD><D6B1>ʣ<EFBFBD><CAA3><EFBFBD>
.m_palette_btn_width = 90,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B0B4><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
.m_palette_btn_height = 50,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B0B4><EFBFBD>ĸ߶<C4B8>
},
/* 4.3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
/*<2A><><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
.hbp = 8, //HSYNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.vbp = 2, //VSYNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.hsw = 41, //HSYNC<4E><43><EFBFBD><EFBFBD>
.vsw = 10, //VSYNC<4E><43><EFBFBD><EFBFBD>
.hfp = 4, //HSYNCǰ<43><C7B0><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.vfp = 4, //VSYNCǰ<43><C7B0><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
.comment_clock_2byte = 15, //rgb565/argb4444<34><34>˫<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƽ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Һ<EFBFBD><D2BA>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>
.comment_clock_4byte = 15, //Argb8888<38><38><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƽ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Һ<EFBFBD><D2BA>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>
.lcd_pixel_width = 480,//Һ<><D2BA><EFBFBD>ֱ<EFBFBD><D6B1>ʣ<EFBFBD><CAA3><EFBFBD>
.lcd_pixel_height = 272,//Һ<><D2BA><EFBFBD>ֱ<EFBFBD><D6B1>ʣ<EFBFBD><CAA3><EFBFBD>
.m_palette_btn_width = 50,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B0B4><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
.m_palette_btn_height = 30,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B0B4><EFBFBD>ĸ߶<C4B8>
}
};
LCD_TypeDef cur_lcd = INCH_5;
const uint8_t PIXEL_BPP[]={4,3,2,2,2,1,1,2};
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.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pin = LTDC_BL_GPIO_PIN;
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 = 1 Mhz */
/* PLL3_VCO Output = PLL3_VCO Input * PLL3N = 270 Mhz */
/* PLLLCDCLK = PLL3_VCO Output/PLL3R = 270/10 = 27Mhz */
/* LTDC clock frequency = PLLLCDCLK = 27 Mhz */
periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
periph_clk_init_struct.PLL3.PLL3M = 25;
periph_clk_init_struct.PLL3.PLL3N = 270;
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);
}
/**
* @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 <20><>ȡFLASH<53><48><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD>
// * @param pBuffer:<3A><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>
// * @param c <20><> Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// * @retval None.
// */
//int GetGBKCode_from_EXFlash( uint8_t * pBuffer, uint16_t c)
//{
// unsigned char High8bit,Low8bit;
// unsigned int pos;
// static uint8_t everRead=0;
// /*<2A><>һ<EFBFBD><D2BB>ʹ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ʼ<EFBFBD><CABC>FLASH*/
// if(everRead == 0)
// {
// QSPI_FLASH_Init();
// everRead = 1;
// }
// High8bit= c >> 8; /* ȡ<><C8A1><38><CEBB><EFBFBD><EFBFBD> */
// Low8bit= c & 0x00FF; /* ȡ<><C8A1><38><CEBB><EFBFBD><EFBFBD> */
// /*GB2312 <20><>ʽ*/
// pos = ((High8bit-0xa1)*94+Low8bit-0xa1)*24*24/8;
// BSP_QSPI_Read(pBuffer,GBKCODE_START_ADDRESS+pos,24*24/8); //<2F><>ȡ<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD>
// // printf ( "%02x %02x %02x %02x\n", pBuffer[0],pBuffer[1],pBuffer[2],pBuffer[3]);
// return 0;
//}
//#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 <20><>ȡSD<53><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD>
// * @param pBuffer:<3A><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>
// * @param c <20><> Ҫ<><D2AA>ȡ<EFBFBD><C8A1><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****/