Stm32Project/Src/lcd.c

859 lines
17 KiB
C
Raw Normal View History

2024-11-06 22:26:06 +08:00
#include "sys.h"
#include "lcd.h"
#include "font.h"
#include "spi3.h"
#include "alientek_log.h"
/*********************************************************************************
___ _ _____ _____ _ _ _____ _____ _ __
/ _ \ | | |_ _|| ___|| \ | ||_ _|| ___|| | / /
/ /_\ \| | | | | |__ | \| | | | | |__ | |/ /
| _ || | | | | __| | . ` | | | | __| | \
| | | || |_____| |_ | |___ | |\ | | | | |___ | |\ \
\_| |_/\_____/\___/ \____/ \_| \_/ \_/ \____/ \_| \_/
* ******************************************************************************
* <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>;
* ALIENTEK Pandora STM32L475 IOT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* LCD TFT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2018/10/27
* <EFBFBD><EFBFBD><EFBFBD>V1.0
* <EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>
* Copyright(C) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾ 2014-2024
* All rights reserved
* ******************************************************************************
* <EFBFBD><EFBFBD>ʼ<EFBFBD>
* ******************************************************************************/
//LCD<43><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ã<EFBFBD><C3A3>޸Ĵ<DEB8>ֵʱ<D6B5><CAB1>ע<EFBFBD><EFBFBD><E2A3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵʱ<D6B5><CAB1><EFBFBD>ܻ<EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD>º<EFBFBD><C2BA><EFBFBD> LCD_Clear/LCD_Fill/LCD_DrawLine
#define LCD_TOTAL_BUF_SIZE (240*240*2)
#define LCD_Buf_Size 1152
static u8 lcd_buf[LCD_Buf_Size];
u16 POINT_COLOR = BLACK; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ Ĭ<><C4AC>Ϊ<EFBFBD><CEAA>ɫ
u16 BACK_COLOR = WHITE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ Ĭ<><C4AC>Ϊ<EFBFBD><CEAA>ɫ
/**
* @brief LCD<EFBFBD><EFBFBD><EFBFBD>ƽӿڳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
*
* @param void
*
* @return void
*/
static void LCD_Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/*
LCD_PWR: PB7
LCD_RST: PB6
LCD_DC: PB4
LCD_CS: PD7
*/
GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);
LCD_CS(0);
LCD_PWR(0);
LCD_RST(0);
HAL_Delay(120);
LCD_RST(1);
SPI3_Init(); //<2F><>ʼ<EFBFBD><CABC>SPI3<49>ӿ<EFBFBD>
}
/**
* @brief LCD<EFBFBD>ײ<EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><EFBFBD><EFBFBD>
*
* @param data <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
* @param size <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
*
* @return void
*/
static void LCD_SPI_Send(u8 *data, u32 size)
{
u32 i;
u32 delta;
delta = size/0xFFFF;
for(i = 0; i<=delta; i++)
{
if( i==delta ) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD> */
SPI3_WriteByte(&data[i*0xFFFF], size%0xFFFF);
else /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>η<EFBFBD><CEB7><EFBFBD>0xFFFF<46>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD> */
SPI3_WriteByte(&data[i*0xFFFF], 0xFFFF);
}
}
/**
* @brief д<EFBFBD><EFBFBD><EFBFBD>LCD
*
* @param cmd <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
static void LCD_Write_Cmd(u8 cmd)
{
LCD_DC(0);
LCD_SPI_Send(&cmd, 1);
}
/**
* @brief д<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>LCD
*
* @param cmd <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
static void LCD_Write_Data(u8 data)
{
LCD_DC(1);
LCD_SPI_Send(&data, 1);
}
/**
* @brief д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>LCD
*
* @param cmd <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
void LCD_Write_HalfWord(const u16 da)
{
u8 data[2] = {0};
data[0] = da >> 8;
data[1] = da;
LCD_DC(1);
LCD_SPI_Send(data, 2);
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param x1,y1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x2,y2 <EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
void LCD_Address_Set(u16 x1, u16 y1, u16 x2, u16 y2)
{
LCD_Write_Cmd(0x2a);
LCD_Write_Data(x1 >> 8);
LCD_Write_Data(x1);
LCD_Write_Data(x2 >> 8);
LCD_Write_Data(x2);
LCD_Write_Cmd(0x2b);
LCD_Write_Data(y1 >> 8);
LCD_Write_Data(y1);
LCD_Write_Data(y2 >> 8);
LCD_Write_Data(y2);
LCD_Write_Cmd(0x2C);
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>ʾ
*
* @param void
*
* @return void
*/
void LCD_DisplayOn(void)
{
LCD_PWR(1);
}
/**
* <EFBFBD>ر<EFBFBD>LCD<EFBFBD><EFBFBD>ʾ
*
* @param void
*
* @return void
*/
void LCD_DisplayOff(void)
{
LCD_PWR(0);
}
/**
* <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<EFBFBD><EFBFBD>
*
* @param color <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
*
* @return void
*/
void LCD_Clear(u16 color)
{
u16 i, j;
u8 data[2] = {0};
data[0] = color >> 8;
data[1] = color;
LCD_Address_Set(0, 0, LCD_Width - 1, LCD_Height - 1);
for(j = 0; j < LCD_Buf_Size / 2; j++)
{
lcd_buf[j * 2] = data[0];
lcd_buf[j * 2 + 1] = data[1];
}
LCD_DC(1);
for(i = 0; i < (LCD_TOTAL_BUF_SIZE / LCD_Buf_Size); i++)
{
LCD_SPI_Send(lcd_buf, LCD_Buf_Size);
}
}
/**
* <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param x_start,y_start <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x_end,y_end <EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param color <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
*
* @return void
*/
void LCD_Fill(u16 x_start, u16 y_start, u16 x_end, u16 y_end, u16 color)
{
u16 i = 0;
u32 size = 0, size_remain = 0;
size = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;
if(size > LCD_Buf_Size)
{
size_remain = size - LCD_Buf_Size;
size = LCD_Buf_Size;
}
LCD_Address_Set(x_start, y_start, x_end, y_end);
while(1)
{
for(i = 0; i < size / 2; i++)
{
lcd_buf[2 * i] = color >> 8;
lcd_buf[2 * i + 1] = color;
}
LCD_DC(1);
LCD_SPI_Send(lcd_buf, size);
if(size_remain == 0)
break;
if(size_remain > LCD_Buf_Size)
{
size_remain = size_remain - LCD_Buf_Size;
}
else
{
size = size_remain;
size_remain = 0;
}
}
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param x_start,y_start <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x_end,y_end <EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param clr_buf <EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
void LCD_Fill_Buf(u16 x_start, u16 y_start, u16 x_end, u16 y_end, u16* clr_buf)
{
u16 i = 0;
u32 size = 0, size_remain = 0;
size = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;
if(size > LCD_Buf_Size)
{
size_remain = size - LCD_Buf_Size;
size = LCD_Buf_Size;
}
LCD_Address_Set(x_start, y_start, x_end, y_end);
while(1)
{
for(i = 0; i < size / 2; i++)
{
lcd_buf[2 * i] = clr_buf[i] >> 8;
lcd_buf[2 * i + 1] = clr_buf[i];
}
LCD_DC(1);
LCD_SPI_Send(lcd_buf, size);
if(size_remain == 0)
break;
if(size_remain > LCD_Buf_Size)
{
size_remain = size_remain - LCD_Buf_Size;
}
else
{
size = size_remain;
size_remain = 0;
}
}
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param x,y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
void LCD_Draw_Point(u16 x, u16 y)
{
LCD_Address_Set(x, y, x, y);
LCD_Write_HalfWord(POINT_COLOR);
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param x,y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
void LCD_Draw_ColorPoint(u16 x, u16 y,u16 color)
{
LCD_Address_Set(x, y, x, y);
LCD_Write_HalfWord(color);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ߺ<EFBFBD><EFBFBD><EFBFBD>(ֱ<EFBFBD>ߡ<EFBFBD>б<EFBFBD><EFBFBD>)
*
* @param x1,y1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x2,y2 <EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
u16 t;
int xerr = 0, yerr = 0, delta_x, delta_y, distance;
int incx, incy, row, col;
u32 i = 0;
if(y1 == y2)
{
/*<2A><><EFBFBD>ٻ<EFBFBD>ˮƽ<CBAE><C6BD>*/
LCD_Address_Set(x1, y1, x2, y2);
for(i = 0; i < x2 - x1; i++)
{
lcd_buf[2 * i] = POINT_COLOR >> 8;
lcd_buf[2 * i + 1] = POINT_COLOR;
}
LCD_DC(1);
LCD_SPI_Send(lcd_buf, (x2 - x1) * 2);
return;
}
delta_x = x2 - x1;
delta_y = y2 - y1;
row = x1;
col = y1;
if(delta_x > 0)incx = 1;
else if(delta_x == 0)incx = 0;
else
{
incx = -1;
delta_x = -delta_x;
}
if(delta_y > 0)incy = 1;
else if(delta_y == 0)incy = 0;
else
{
incy = -1;
delta_y = -delta_y;
}
if(delta_x > delta_y)distance = delta_x;
else distance = delta_y;
for(t = 0; t <= distance + 1; t++)
{
LCD_Draw_Point(row, col);
xerr += delta_x ;
yerr += delta_y ;
if(xerr > distance)
{
xerr -= distance;
row += incx;
}
if(yerr > distance)
{
yerr -= distance;
col += incy;
}
}
}
/**
* @brief <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param x1,y1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x2,y2 <EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
{
LCD_DrawLine(x1, y1, x2, y1);
LCD_DrawLine(x1, y1, x1, y2);
LCD_DrawLine(x1, y2, x2, y2);
LCD_DrawLine(x2, y1, x2, y2);
}
/**
* @brief <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Բ
*
* @param x0,y0 Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param r Բ<EFBFBD>
*
* @return void
*/
void LCD_Draw_Circle(u16 x0, u16 y0, u8 r)
{
int a, b;
int di;
a = 0;
b = r;
di = 3 - (r << 1);
while(a <= b)
{
LCD_Draw_Point(x0 - b, y0 - a);
LCD_Draw_Point(x0 + b, y0 - a);
LCD_Draw_Point(x0 - a, y0 + b);
LCD_Draw_Point(x0 - b, y0 - a);
LCD_Draw_Point(x0 - a, y0 - b);
LCD_Draw_Point(x0 + b, y0 + a);
LCD_Draw_Point(x0 + a, y0 - b);
LCD_Draw_Point(x0 + a, y0 + b);
LCD_Draw_Point(x0 - b, y0 + a);
a++;
if(di < 0)di += 4 * a + 6;
else
{
di += 10 + 4 * (a - b);
b--;
}
LCD_Draw_Point(x0 + a, y0 + b);
}
}
/**
* @brief <EFBFBD><EFBFBD>ʾһ<EFBFBD><EFBFBD>ASCII<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
*
* @param x,y <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param chr <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
* @param size <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(֧<EFBFBD><EFBFBD>16/24/32<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
*
* @return void
*/
void LCD_ShowChar(u16 x, u16 y, char chr, u8 size)
{
u8 temp, t1, t;
u8 csize; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
u16 colortemp;
u8 sta;
chr = chr - ' '; //<2F>õ<EFBFBD>ƫ<EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD>ֵ<EFBFBD><D6B5>ASCII<49>ֿ<EFBFBD><D6BF>Ǵӿո<D3BF><D5B8><EFBFBD>ʼȡģ<C8A1><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-' '<27><><EFBFBD>Ƕ<EFBFBD>Ӧ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ֿ⣩
if((x > (LCD_Width - size / 2)) || (y > (LCD_Height - size))) return;
LCD_Address_Set(x, y, x + size / 2 - 1, y + size - 1);//(x,y,x+8-1,y+16-1)
if((size == 16) || (size == 32) ) //16<31><36>32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2);
for(t = 0; t < csize; t++)
{
if(size == 16)temp = asc2_1608[chr][t]; //<2F><><EFBFBD><EFBFBD>1608<30><38><EFBFBD><EFBFBD>
else if(size == 32)temp = asc2_3216[chr][t]; //<2F><><EFBFBD><EFBFBD>3216<31><36><EFBFBD><EFBFBD>
else return; //û<>е<EFBFBD><D0B5>ֿ<EFBFBD>
for(t1 = 0; t1 < 8; t1++)
{
if(temp & 0x80) colortemp = POINT_COLOR;
else colortemp = BACK_COLOR;
LCD_Write_HalfWord(colortemp);
temp <<= 1;
}
}
}
else if (size == 12) //12<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2);
for(t = 0; t < csize; t++)
{
temp = asc2_1206[chr][t];
for(t1 = 0; t1 < 6; t1++)
{
if(temp & 0x80) colortemp = POINT_COLOR;
else colortemp = BACK_COLOR;
LCD_Write_HalfWord(colortemp);
temp <<= 1;
}
}
}
else if(size == 24) //24<32><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
csize = (size * 16) / 8;
for(t = 0; t < csize; t++)
{
temp = asc2_2412[chr][t];
if(t % 2 == 0)sta = 8;
else sta = 4;
for(t1 = 0; t1 < sta; t1++)
{
if(temp & 0x80) colortemp = POINT_COLOR;
else colortemp = BACK_COLOR;
LCD_Write_HalfWord(colortemp);
temp <<= 1;
}
}
}
}
/**
* @brief m^n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param m,n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return m^n<EFBFBD>η<EFBFBD>
*/
static u32 LCD_Pow(u8 m, u8 n)
{
u32 result = 1;
while(n--)result *= m;
return result;
}
/**
* @brief <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>λΪ0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
*
* @param x,y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param num <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>Χ(0~4294967295)
* @param len <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
* @param size <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
*
* @return void
*/
void LCD_ShowNum(u16 x, u16 y, u32 num, u8 len, u8 size)
{
u8 t, temp;
u8 enshow = 0;
for(t = 0; t < len; t++)
{
temp = (num / LCD_Pow(10, len - t - 1)) % 10;
if(enshow == 0 && t < (len - 1))
{
if(temp == 0)
{
LCD_ShowChar(x + (size / 2)*t, y, ' ', size);
continue;
}
else enshow = 1;
}
LCD_ShowChar(x + (size / 2)*t, y, temp + '0', size);
}
}
/**
* @brief <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>λΪ0,<EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾΪ0<EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD>ʾ
*
* @param x,y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param num <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>Χ(0~999999999)
* @param len <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
* @param size <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
* @param mode 1:<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ʾ0 0:<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
*
* @return void
*/
void LCD_ShowxNum(u16 x, u16 y, u32 num, u8 len, u8 size, u8 mode)
{
u8 t, temp;
u8 enshow = 0;
for(t = 0; t < len; t++)
{
temp = (num / LCD_Pow(10, len - t - 1)) % 10;
if(enshow == 0 && t < (len - 1))
{
if(temp == 0)
{
if(mode)LCD_ShowChar(x + (size / 2)*t, y, '0', size);
else
LCD_ShowChar(x + (size / 2)*t, y, ' ', size);
continue;
}
else enshow = 1;
}
LCD_ShowChar(x + (size / 2)*t, y, temp + '0', size);
}
}
/**
* @brief <EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
*
* @param x,y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param width <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param height <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
* @param size <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
* @param p <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
*
* @return void
*/
void LCD_ShowString(u16 x, u16 y, u16 width, u16 height, u8 size, char *p)
{
u8 x0 = x;
width += x;
height += y;
while((*p <= '~') && (*p >= ' ')) //<2F>ж<EFBFBD><D0B6>Dz<EFBFBD><C7B2>ǷǷ<C7B7><C7B7>ַ<EFBFBD>!
{
if(x >= width)
{
x = x0;
y += size;
}
if(y >= height)break; //<2F>˳<EFBFBD>
LCD_ShowChar(x, y, *p, size);
x += size / 2;
p++;
}
}
/**
* @brief <EFBFBD><EFBFBD>ʾͼƬ
*
* @remark Image2Lcdȡģ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD> C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/ˮƽɨ<EFBFBD><EFBFBD>/16λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ(RGB565)/<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ǰ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>Ҫѡ
*
* @param x,y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param width ͼƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param height ͼƬ<EFBFBD>߶<EFBFBD>
* @param p ͼƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
*
* @return void
*/
void LCD_Show_Image(u16 x, u16 y, u16 width, u16 height, const u8 *p)
{
if(x + width > LCD_Width || y + height > LCD_Height)
{
return;
}
LCD_Address_Set(x, y, x + width - 1, y + height - 1);
LCD_DC(1);
LCD_SPI_Send((u8 *)p, width * height * 2);
}
/**
* @brief LCD<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*
* @param x,y <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return void
*/
void Display_ALIENTEK_LOGO(u16 x, u16 y)
{
LCD_Show_Image(x, y, 240, 82, ALIENTEK_LOGO);
}
/**
* @brief LCD<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*
* @param void
*
* @return void
*/
void LCD_Init(void)
{
LCD_Gpio_Init(); //Ӳ<><D3B2><EFBFBD>ӿڳ<D3BF>ʼ<EFBFBD><CABC>
HAL_Delay(120);
/* Sleep Out */
LCD_Write_Cmd(0x11);
/* wait for power stability */
HAL_Delay(120);
/* Memory Data Access Control */
LCD_Write_Cmd(0x36);
LCD_Write_Data(0x00);
/* RGB 5-6-5-bit */
LCD_Write_Cmd(0x3A);
LCD_Write_Data(0x65);
/* Porch Setting */
LCD_Write_Cmd(0xB2);
LCD_Write_Data(0x0C);
LCD_Write_Data(0x0C);
LCD_Write_Data(0x00);
LCD_Write_Data(0x33);
LCD_Write_Data(0x33);
/* Gate Control */
LCD_Write_Cmd(0xB7);
LCD_Write_Data(0x72);
/* VCOM Setting */
LCD_Write_Cmd(0xBB);
LCD_Write_Data(0x3D); //Vcom=1.625V
/* LCM Control */
LCD_Write_Cmd(0xC0);
LCD_Write_Data(0x2C);
/* VDV and VRH Command Enable */
LCD_Write_Cmd(0xC2);
LCD_Write_Data(0x01);
/* VRH Set */
LCD_Write_Cmd(0xC3);
LCD_Write_Data(0x19);
/* VDV Set */
LCD_Write_Cmd(0xC4);
LCD_Write_Data(0x20);
/* Frame Rate Control in Normal Mode */
LCD_Write_Cmd(0xC6);
LCD_Write_Data(0x0F); //60MHZ
/* Power Control 1 */
LCD_Write_Cmd(0xD0);
LCD_Write_Data(0xA4);
LCD_Write_Data(0xA1);
/* Positive Voltage Gamma Control */
LCD_Write_Cmd(0xE0);
LCD_Write_Data(0xD0);
LCD_Write_Data(0x04);
LCD_Write_Data(0x0D);
LCD_Write_Data(0x11);
LCD_Write_Data(0x13);
LCD_Write_Data(0x2B);
LCD_Write_Data(0x3F);
LCD_Write_Data(0x54);
LCD_Write_Data(0x4C);
LCD_Write_Data(0x18);
LCD_Write_Data(0x0D);
LCD_Write_Data(0x0B);
LCD_Write_Data(0x1F);
LCD_Write_Data(0x23);
/* Negative Voltage Gamma Control */
LCD_Write_Cmd(0xE1);
LCD_Write_Data(0xD0);
LCD_Write_Data(0x04);
LCD_Write_Data(0x0C);
LCD_Write_Data(0x11);
LCD_Write_Data(0x13);
LCD_Write_Data(0x2C);
LCD_Write_Data(0x3F);
LCD_Write_Data(0x44);
LCD_Write_Data(0x51);
LCD_Write_Data(0x2F);
LCD_Write_Data(0x1F);
LCD_Write_Data(0x1F);
LCD_Write_Data(0x20);
LCD_Write_Data(0x23);
/* Display Inversion On */
LCD_Write_Cmd(0x21);
LCD_Write_Cmd(0x29);
LCD_Address_Set(0, 0, LCD_Width - 1, LCD_Height - 1);
LCD_Clear(WHITE);
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ*/
LCD_PWR(1);
}