2026-07-15 15:57:37 +08:00
# include "lcd.h"
# include "lcd_font.h"
# include "../App/config.h"
# include "intrins.h"
2026-07-17 19:43:02 +08:00
// ====== LHS114TC-IF03 (ST7789V) <20> <> Ļ SPI <20> <> <EFBFBD> <EFBFBD> ӳ<EFBFBD> <D3B3> ======
sbit LCD_RST = P1 ^ 0 ; // <20> <> ĻӲ<C4BB> <D3B2> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB> <EFBFBD> <EFBFBD> (RESET)<29> <> <EFBFBD> ͵<EFBFBD> ƽ <EFBFBD> <C6BD> λ
sbit LCD_DCX = P1 ^ 1 ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> / <20> <> <EFBFBD> <EFBFBD> ѡ <EFBFBD> <D1A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (1:<3A> <> <EFBFBD> <EFBFBD> , 0:ָ<> <D6B8> )
sbit LCD_SDI = P1 ^ 4 ; // SPI <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ӻ<EFBFBD> <D3BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (MOSI)
sbit LCD_SCL = P1 ^ 5 ; // SPI <20> <> <EFBFBD> й<EFBFBD> <D0B9> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> (SCLK)
sbit LCD_CS = P1 ^ 6 ; // SPI <20> <> <EFBFBD> <EFBFBD> Ƭѡ ѡ <D1A1> <D1A1> <EFBFBD> <EFBFBD> (CS)<29> <> <EFBFBD> ͵<EFBFBD> ƽ ѡ ͨ<D1A1> <CDA8> Ļ
2026-07-15 15:57:37 +08:00
2026-07-17 19:43:02 +08:00
// ====== LHS114TC-IF03 LEDA <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ======
sbit SGM_CTRL = P1 ^ 7 ; // LEDA <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (0:<3A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> , 1:<3A> ر<EFBFBD> Ϩ <EFBFBD> <CFA8> - PMOS<4F> <53> <EFBFBD> <EFBFBD> )
2026-07-15 15:57:37 +08:00
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ⲿ<EFBFBD> <E2B2BF> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> (<28> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> system.c <20> <> )
2026-07-15 15:57:37 +08:00
extern void Delay_ms ( u16 ms ) ;
extern void Delay10us ( void ) ;
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģ <EFBFBD> <EFBFBD> 8 λ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> SPI <EFBFBD> ֽ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݷ <EFBFBD> <EFBFBD> <EFBFBD>
* @ param dat <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͵ <EFBFBD> 1 <EFBFBD> ֽ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void SPI_SendData ( u8 dat )
{
u8 i ;
for ( i = 0 ; i < 8 ; i + + )
{
2026-07-17 19:43:02 +08:00
LCD_SCL = 0 ; // <20> <> <EFBFBD> <EFBFBD> ʱ<EFBFBD> ӣ<EFBFBD> <EFBFBD> <D7BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-15 15:57:37 +08:00
if ( dat & 0x80 )
LCD_SDI = 1 ;
else
LCD_SDI = 0 ;
_nop_ ( ) ;
2026-07-17 19:43:02 +08:00
LCD_SCL = 1 ; // <20> <> <EFBFBD> <EFBFBD> ʱ<EFBFBD> ӣ<EFBFBD> <D3A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ<EFBFBD> <C4BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ز<EFBFBD> <D8B2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ
2026-07-15 15:57:37 +08:00
_nop_ ( ) ;
2026-07-17 19:43:02 +08:00
dat < < = 1 ; // <20> <> <EFBFBD> <EFBFBD> һ λ<D2BB> <CEBB> <EFBFBD> <D7BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ λ
2026-07-15 15:57:37 +08:00
}
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> д <EFBFBD> 뵥 <EFBFBD> ֽ ڿ <EFBFBD> <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> ( DCX = 0 )
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void WriteComm ( u8 cmd )
{
2026-07-17 19:43:02 +08:00
LCD_CS = 0 ; // <20> <> <EFBFBD> <EFBFBD> Ƭѡ
LCD_DCX = 0 ; // <20> л<EFBFBD> Ϊָ<CEAA> <EFBFBD> <EEB4AB> ģʽ
2026-07-15 15:57:37 +08:00
SPI_SendData ( cmd ) ;
2026-07-17 19:43:02 +08:00
LCD_CS = 1 ; // <20> ر<EFBFBD> Ƭѡ
2026-07-15 15:57:37 +08:00
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> д <EFBFBD> 뵥 <EFBFBD> ֽ <EFBFBD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ( DCX = 1 )
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void WriteData ( u8 dat )
{
2026-07-17 19:43:02 +08:00
LCD_CS = 0 ; // <20> <> <EFBFBD> <EFBFBD> Ƭѡ
LCD_DCX = 1 ; // <20> л<EFBFBD> Ϊ<EFBFBD> <CEAA> <EFBFBD> ݴ<EFBFBD> <DDB4> <EFBFBD> ģʽ
2026-07-15 15:57:37 +08:00
SPI_SendData ( dat ) ;
2026-07-17 19:43:02 +08:00
LCD_CS = 1 ; // <20> ر<EFBFBD> Ƭѡ
2026-07-15 15:57:37 +08:00
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ <EFBFBD> <EFBFBD> ִ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ Ӳ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_Reset ( void )
{
LCD_RST = 1 ;
Delay_ms ( 10 ) ;
2026-07-17 19:43:02 +08:00
LCD_RST = 0 ; // <20> <> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB> <EFBFBD> Ž<EFBFBD> <C5BD> <EFBFBD> Ӳ<EFBFBD> <D3B2> <EFBFBD> <EFBFBD> λ״̬
2026-07-15 15:57:37 +08:00
Delay_ms ( 20 ) ;
2026-07-17 19:43:02 +08:00
LCD_RST = 1 ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
Delay_ms ( 120 ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ȴ<EFBFBD> <C8B4> <EFBFBD> <EFBFBD> <EFBFBD> 120ms <20> <> <EFBFBD> <EFBFBD> ִ<EFBFBD> к<EFBFBD> <D0BA> <EFBFBD> <EFBFBD> ij<EFBFBD> ʼ <EFBFBD> <CABC>
2026-07-15 15:57:37 +08:00
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> LHS114TC - IF03 ( ST7789V ) <EFBFBD> <EFBFBD> Ļ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_Init ( void )
{
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> չ SFR <20> <> <EFBFBD> <EFBFBD> Ȩ<EFBFBD> <C8A8> (EAXFR = 1)<29> <> ȷ<EFBFBD> <C8B7> <EFBFBD> <EFBFBD> <EFBFBD> Բ<EFBFBD> <D4B2> <EFBFBD> P1M1 <20> <> P1M0 ģʽ <C4A3> Ĵ<EFBFBD> <C4B4> <EFBFBD>
P_SW2 | = 0x80 ;
2026-07-15 15:57:37 +08:00
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> <EFBFBD> P1 <20> ˿ڵ<CBBF> LCD_RST(P1.0)/DCX(P1.1)/SDI(P1.4)/SCL(P1.5)/CS(P1.6)/LEDA(P1.7) Ϊ<> <CEAA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ (M1=0, M0=1)
P1M1 & = ~ ( ( 1 < < 0 ) | ( 1 < < 1 ) | ( 1 < < 4 ) | ( 1 < < 5 ) | ( 1 < < 6 ) | ( 1 < < 7 ) ) ;
P1M0 | = ( ( 1 < < 0 ) | ( 1 < < 1 ) | ( 1 < < 4 ) | ( 1 < < 5 ) | ( 1 < < 6 ) | ( 1 < < 7 ) ) ;
2026-07-15 15:57:37 +08:00
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> ø<EFBFBD> <C3B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ų<EFBFBD> ʼ Ĭ<CABC> ϵ<EFBFBD> ƽ
SGM_CTRL = 0 ; // PMOS<4F> ͵<EFBFBD> ƽ <EFBFBD> <C6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (LEDA = 0)
2026-07-15 15:57:37 +08:00
LCD_CS = 1 ;
LCD_SCL = 1 ;
LCD_RST = 1 ;
LCD_DCX = 1 ;
2026-07-17 19:43:02 +08:00
LCD_Reset ( ) ; // Ӳ<> <D3B2> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB> Ļ
2026-07-15 15:57:37 +08:00
2026-07-17 19:43:02 +08:00
// ====== д<> <D0B4> ST7789V ԭ<> <D4AD> <EFBFBD> Ĵ<EFBFBD> <C4B4> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> ָ<EFBFBD> <D6B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ======
WriteComm ( 0x11 ) ; // Sleep Out <20> ˳<EFBFBD> ˯<EFBFBD> <CBAF>
Delay_ms ( 120 ) ; // <20> ˳<EFBFBD> ˯<EFBFBD> ߺ <EFBFBD> <DFBA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> 120ms
// Memory Data Access Control (MADCTL) ɨ<> 跽<EFBFBD> <E8B7BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// 0x00: <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> £<EFBFBD> <C2A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ң<EFBFBD> RGB <20> <> ʽ
WriteComm ( 0x36 ) ;
WriteData ( 0x00 ) ;
// Interface Pixel Format (COLMOD)
// 0x05 <20> <> <EFBFBD> <EFBFBD> 16-bit/pixel (RGB565<36> <35> ʽ )
WriteComm ( 0x3A ) ;
WriteData ( 0x05 ) ;
// Porch Setting (B2h)
WriteComm ( 0xB2 ) ;
WriteData ( 0x0C ) ;
WriteData ( 0x0C ) ;
WriteData ( 0x00 ) ;
WriteData ( 0x33 ) ;
WriteData ( 0x33 ) ;
// Gate Control (B7h)
// VGH=13.65V, VGL=-10.43V
WriteComm ( 0xB7 ) ;
WriteData ( 0x35 ) ;
// VCOM Setting (BBh)
// VCOM=1.175V
WriteComm ( 0xBB ) ;
WriteData ( 0x19 ) ;
// LCM Control (C0h)
WriteComm ( 0xC0 ) ;
WriteData ( 0x2C ) ;
// VDV and VRH Command Enable (C2h)
WriteComm ( 0xC2 ) ;
WriteData ( 0x01 ) ;
// VRH Set (C3h)
// VRH=4.3V
WriteComm ( 0xC3 ) ;
WriteData ( 0x12 ) ;
// VDV Set (C4h)
// VDV=0V
WriteComm ( 0xC4 ) ;
WriteData ( 0x20 ) ;
// Frame Rate Control in Normal Mode (C6h)
// 0x0F: 60Hz
WriteComm ( 0xC6 ) ;
WriteData ( 0x0F ) ;
// Power Control 1 (D0h)
WriteComm ( 0xD0 ) ;
WriteData ( 0xA4 ) ;
WriteData ( 0xA1 ) ;
// Positive Gamma Correction (E0h) <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ٤<EFBFBD> <D9A4>
WriteComm ( 0xE0 ) ;
WriteData ( 0xD0 ) ; WriteData ( 0x04 ) ; WriteData ( 0x0D ) ; WriteData ( 0x11 ) ;
WriteData ( 0x13 ) ; WriteData ( 0x2B ) ; WriteData ( 0x3F ) ; WriteData ( 0x54 ) ;
WriteData ( 0x4C ) ; WriteData ( 0x18 ) ; WriteData ( 0x0D ) ; WriteData ( 0x0B ) ;
WriteData ( 0x1F ) ; WriteData ( 0x23 ) ;
// Negative Gamma Correction (E1h) <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ٤<EFBFBD> <D9A4>
WriteComm ( 0xE1 ) ;
WriteData ( 0xD0 ) ; WriteData ( 0x04 ) ; WriteData ( 0x0C ) ; WriteData ( 0x11 ) ;
WriteData ( 0x13 ) ; WriteData ( 0x2C ) ; WriteData ( 0x3F ) ; WriteData ( 0x44 ) ;
WriteData ( 0x51 ) ; WriteData ( 0x2F ) ; WriteData ( 0x1F ) ; WriteData ( 0x1F ) ;
WriteData ( 0x20 ) ; WriteData ( 0x23 ) ;
// Display Inversion On (21h) <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ԣ<EFBFBD> ST7789 IPS <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
WriteComm ( 0x21 ) ;
// Display On (29h) <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
WriteComm ( 0x29 ) ;
2026-07-15 15:57:37 +08:00
Delay_ms ( 20 ) ;
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȫ<EFBFBD> <C8AB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֹ<EFBFBD> <D6B9> Ļ<EFBFBD> <C4BB> <EFBFBD> <EFBFBD> ˲<EFBFBD> <CBB2> <EFBFBD> <EFBFBD> <EFBFBD> ֻ<EFBFBD> <D6BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
LCD_Clear ( COLOR_BLACK ) ;
2026-07-15 15:57:37 +08:00
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> 趨 <EFBFBD> <EFBFBD> Ļ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݸ <EFBFBD> <EFBFBD> » <EFBFBD> <EFBFBD> ƴ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_SetWindow ( u16 x_start , u16 x_end , u16 y_start , u16 y_end )
{
2026-07-17 19:43:02 +08:00
// <20> ڵײ㴰<D7B2> <E3B4B0> <EFBFBD> 趨<EFBFBD> У <EFBFBD> ͳһ <CDB3> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƫ<EFBFBD> õ<EFBFBD> <EFBFBD> <CDB8> У <EFBFBD> <D0A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϲ <EFBFBD> <CFB2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֹ<EFBFBD> <D6B9> <EFBFBD> <EFBFBD> <EFBFBD>
x_start + = LCD_X_OFFSET ;
x_end + = LCD_X_OFFSET ;
y_start + = LCD_Y_OFFSET ;
y_end + = LCD_Y_OFFSET ;
// д<> <D0B4> Column Address Set <20> е <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD> üĴ<C3BC> <C4B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (0x2A)
2026-07-15 15:57:37 +08:00
WriteComm ( 0x2A ) ;
WriteData ( ( u8 ) ( x_start > > 8 ) ) ;
WriteData ( ( u8 ) ( x_start & 0xFF ) ) ;
WriteData ( ( u8 ) ( x_end > > 8 ) ) ;
WriteData ( ( u8 ) ( x_end & 0xFF ) ) ;
2026-07-17 19:43:02 +08:00
// д<> <D0B4> Row Address Set <20> е <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD> üĴ<C3BC> <C4B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (0x2B)
2026-07-15 15:57:37 +08:00
WriteComm ( 0x2B ) ;
WriteData ( ( u8 ) ( y_start > > 8 ) ) ;
WriteData ( ( u8 ) ( y_start & 0xFF ) ) ;
WriteData ( ( u8 ) ( y_end > > 8 ) ) ;
WriteData ( ( u8 ) ( y_end & 0xFF ) ) ;
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> ɫ <EFBFBD> <EFBFBD> ˢ д <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȫ <EFBFBD> <EFBFBD> Ļ
* @ param color 16 λ RGB565 <EFBFBD> <EFBFBD> ɫ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_Clear ( u16 color )
{
u16 i , j ;
2026-07-17 19:43:02 +08:00
LCD_SetWindow ( 0 , LCD_WIDTH - 1 , 0 , LCD_HEIGHT - 1 ) ;
WriteComm ( 0x2C ) ; // <20> <> <EFBFBD> <EFBFBD> RAM Write (0x2C) <20> Դ<EFBFBD> д<EFBFBD> <D0B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
for ( i = 0 ; i < LCD_WIDTH ; i + + )
2026-07-15 15:57:37 +08:00
{
2026-07-17 19:43:02 +08:00
for ( j = 0 ; j < LCD_HEIGHT ; j + + )
2026-07-15 15:57:37 +08:00
{
2026-07-17 19:43:02 +08:00
WriteData ( ( u8 ) ( color > > 8 ) ) ; // <20> <> <EFBFBD> <EFBFBD> RGB565 <20> <> 8 λ<> ֽ<EFBFBD>
WriteData ( ( u8 ) ( color & 0xFF ) ) ; // <20> <> <EFBFBD> <EFBFBD> RGB565 <20> <> 8 λ<> ֽ<EFBFBD>
2026-07-15 15:57:37 +08:00
}
}
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ ָ <EFBFBD> <EFBFBD> <EFBFBD> ӿ ڻ <EFBFBD> <EFBFBD> <EFBFBD> ʵ <EFBFBD> ľ <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_FillRect ( u16 x , u16 y , u16 w , u16 h , u16 color )
{
u16 i , count ;
u8 ch = ( u8 ) ( color > > 8 ) ;
u8 cl = ( u8 ) ( color & 0xFF ) ;
2026-07-16 17:52:52 +08:00
2026-07-17 19:43:02 +08:00
LCD_SetWindow ( x , x + w - 1 , y , y + h - 1 ) ;
WriteComm ( 0x2C ) ; // д<> <D0B4> <EFBFBD> Դ<EFBFBD>
count = w * h ; // ʵ<> ľ<EFBFBD> <C4BE> ΰ<EFBFBD> <CEB0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-15 15:57:37 +08:00
for ( i = 0 ; i < count ; i + + )
{
WriteData ( ch ) ;
WriteData ( cl ) ;
}
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> ƿ <EFBFBD> <EFBFBD> ľ <EFBFBD> <EFBFBD> α ߽ <EFBFBD> <EFBFBD> <EFBFBD>
* @ details ͨ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϵ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĵ <EFBFBD> LCD_FillRect ʵ <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>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_DrawRectBorder ( u16 x , u16 y , u16 w , u16 h , u16 color )
{
2026-07-17 19:43:02 +08:00
LCD_FillRect ( x , y , w , 1 , color ) ; // <20> ϱ ߿<CFB1> <DFBF> <EFBFBD>
LCD_FillRect ( x , y + h - 1 , w , 1 , color ) ; // <20> ±߿<C2B1> <DFBF> <EFBFBD>
LCD_FillRect ( x , y , 1 , h , color ) ; // <20> <> <EFBFBD> ߿<EFBFBD> <DFBF> <EFBFBD>
LCD_FillRect ( x + w - 1 , y , 1 , h , color ) ; // <20> ұ߿<D2B1> <DFBF> <EFBFBD>
2026-07-15 15:57:37 +08:00
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> Ⱦ <EFBFBD> <EFBFBD> ʾ һ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɫ <EFBFBD> <EFBFBD> ģ λ ͼ <EFBFBD> <EFBFBD> Դ
* @ param x <EFBFBD> <EFBFBD> Ⱦ <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> X
* @ param y <EFBFBD> <EFBFBD> Ⱦ <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Y
* @ param w λ ͼ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ( <EFBFBD> <EFBFBD> λ : <EFBFBD> <EFBFBD> <EFBFBD> ص <EFBFBD> <EFBFBD> <EFBFBD> )
* @ param h λ ͼ <EFBFBD> ߶ <EFBFBD> ( <EFBFBD> <EFBFBD> λ : <EFBFBD> <EFBFBD> <EFBFBD> ص <EFBFBD> <EFBFBD> <EFBFBD> )
* @ param bmp FLASH <EFBFBD> е ĵ <EFBFBD> ɫ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> ( 1 <EFBFBD> <EFBFBD> ʾ <EFBFBD> <EFBFBD> ǰ <EFBFBD> <EFBFBD> ɫ <EFBFBD> <EFBFBD> 0 <EFBFBD> <EFBFBD> ʾ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɫ )
* @ param color 16 λ ǰ <EFBFBD> <EFBFBD> ɫ
* @ param bg_color 16 λ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɫ
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_DrawMonoBitmap ( u16 x , u16 y , u16 w , u16 h , unsigned char code * bmp , u16 color , u16 bg_color )
{
u16 r , c ;
2026-07-17 19:43:02 +08:00
u16 byte_width = ( w + 7 ) / 8 ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ڵ<EFBFBD> ɫ<EFBFBD> <C9AB> <EFBFBD> <EFBFBD> <EFBFBD> У <EFBFBD> һ <EFBFBD> <D2BB> ͼ<EFBFBD> <CDBC> ռ <EFBFBD> õ<EFBFBD> ʵ<EFBFBD> <CAB5> <EFBFBD> ֽ<EFBFBD> <D6BD> <EFBFBD>
2026-07-15 15:57:37 +08:00
u8 ch = ( u8 ) ( color > > 8 ) ;
u8 cl = ( u8 ) ( color & 0xFF ) ;
u8 bgh = ( u8 ) ( bg_color > > 8 ) ;
u8 bgl = ( u8 ) ( bg_color & 0xFF ) ;
2026-07-17 19:43:02 +08:00
LCD_SetWindow ( x , x + w - 1 , y , y + h - 1 ) ; // <20> <> <EFBFBD> ƻ<EFBFBD> <C6BB> <EFBFBD> <EFBFBD> Դ洰<D4B4> <E6B4B0>
2026-07-15 15:57:37 +08:00
WriteComm ( 0x2C ) ;
2026-07-16 17:52:52 +08:00
2026-07-17 19:43:02 +08:00
// Ƕ<> <C7B6> ѭ<EFBFBD> <D1AD> <EFBFBD> <EFBFBD> <EFBFBD> ӵ<EFBFBD> 0 <20> е <EFBFBD> 0 <20> п<EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> ÿ<EFBFBD> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB>
2026-07-15 15:57:37 +08:00
for ( r = 0 ; r < h ; r + + )
{
for ( c = 0 ; c < w ; c + + )
{
2026-07-17 19:43:02 +08:00
u16 byte_idx = r * byte_width + ( c / 8 ) ; // <20> <> λ<EFBFBD> <CEBB> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڵ<EFBFBD> ɫͼ<C9AB> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD>
u8 bit_shift = 7 - ( c % 8 ) ; // <20> <> λ<EFBFBD> <CEBB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڸ<EFBFBD> <DAB8> ֽ<EFBFBD> <D6BD> ж<EFBFBD> Ӧ<EFBFBD> <D3A6> bit λ<> <CEBB> (<28> <> λ<EFBFBD> <CEBB> ǰ)
2026-07-16 17:52:52 +08:00
2026-07-15 15:57:37 +08:00
if ( bmp [ byte_idx ] & ( 1 < < bit_shift ) )
{
2026-07-17 19:43:02 +08:00
WriteData ( ch ) ; // <20> <> λΪ 1<> <31> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> ɫ
2026-07-15 15:57:37 +08:00
WriteData ( cl ) ;
}
else
{
2026-07-17 19:43:02 +08:00
WriteData ( bgh ) ; // <20> <> λΪ 0<> <30> <EFBFBD> <EFBFBD> <EFBFBD> ͱ<EFBFBD> <CDB1> <EFBFBD> ɫ
2026-07-15 15:57:37 +08:00
WriteData ( bgl ) ;
}
}
}
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ⱦ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <EFBFBD> 8 x16 <EFBFBD> ߴ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͨ Ӣ <EFBFBD> <EFBFBD> ASCII <EFBFBD> ַ <EFBFBD>
* @ param ch ASCII <EFBFBD> ַ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_ShowChar8x16 ( u16 x , u16 y , char ch , u16 color , u16 bg_color )
{
u8 r , c ;
2026-07-17 19:43:02 +08:00
u8 char_idx = ch - 0x20 ; // ƫ<> Ƽ <EFBFBD> <C6BC> 㣺ASCII <20> ɴ<EFBFBD> ӡ<EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD> 0x20 (<28> ո <EFBFBD> ) <20> <> ʼ
2026-07-15 15:57:37 +08:00
u8 f_h = ( u8 ) ( color > > 8 ) ;
u8 f_l = ( u8 ) ( color & 0xFF ) ;
u8 b_h = ( u8 ) ( bg_color > > 8 ) ;
u8 b_l = ( u8 ) ( bg_color & 0xFF ) ;
2026-07-17 19:43:02 +08:00
if ( ch < 0x20 | | ch > 0x7E ) return ; // <20> <> <EFBFBD> ˲<EFBFBD> <CBB2> ɼ<EFBFBD> <C9BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ַ<EFBFBD>
2026-07-15 15:57:37 +08:00
2026-07-17 19:43:02 +08:00
LCD_SetWindow ( x , x + 8 - 1 , y , y + 16 - 1 ) ;
2026-07-15 15:57:37 +08:00
WriteComm ( 0x2C ) ;
2026-07-16 17:52:52 +08:00
2026-07-17 19:43:02 +08:00
// ѭ<> <D1AD> 16 <20> У <EFBFBD> <D0A3> <EFBFBD> <EFBFBD> <EFBFBD> 8x16 <20> <> <EFBFBD> <EFBFBD>
2026-07-15 15:57:37 +08:00
for ( r = 0 ; r < 16 ; r + + )
{
2026-07-17 19:43:02 +08:00
u8 line = FONT_8x16 [ char_idx ] [ r ] ; // <20> <> ȡ<EFBFBD> <C8A1> ǰ<EFBFBD> ж<EFBFBD> Ӧ<EFBFBD> <D3A6> 8 λ<> <CEBB> ɫ<EFBFBD> <C9AB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ
2026-07-15 15:57:37 +08:00
for ( c = 0 ; c < 8 ; c + + )
{
2026-07-17 19:43:02 +08:00
// <20> Ӹߵ <D3B8> <DFB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> ص<EFBFBD>
2026-07-15 15:57:37 +08:00
if ( line & ( 0x80 > > c ) )
{
WriteData ( f_h ) ;
WriteData ( f_l ) ;
}
else
{
WriteData ( b_h ) ;
WriteData ( b_l ) ;
}
}
}
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ӡ һ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͨ Ӣ <EFBFBD> <EFBFBD> ASCII <EFBFBD> ַ <EFBFBD> <EFBFBD> <EFBFBD> ( <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> )
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_ShowString ( u16 x , u16 y , char * str , u16 color , u16 bg_color )
{
while ( * str )
{
2026-07-17 19:43:02 +08:00
LCD_ShowChar8x16 ( x , y , * str , color , bg_color ) ; // <20> <> Ⱦ<EFBFBD> <C8BE> ǰ<EFBFBD> ַ<EFBFBD>
x + = 8 ; // X <20> <> <EFBFBD> <EFBFBD> ʼ λ<CABC> <CEBB> ƫ<EFBFBD> <C6AB> 8 <20> <> <EFBFBD> أ<EFBFBD> <EFBFBD> <D7BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> ַ<EFBFBD>
str + + ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> ַ<EFBFBD>
2026-07-15 15:57:37 +08:00
}
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> Y <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> ʾ
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_ShowStringCentered ( u16 y , char * str , u16 color , u16 bg_color )
{
u16 len = 0 ;
char * p = str ;
2026-07-17 19:43:02 +08:00
while ( * p + + ) len + + ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-16 17:52:52 +08:00
2026-07-17 19:43:02 +08:00
if ( len * 8 > = LCD_WIDTH )
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> Ļ<EFBFBD> <C4BB> Ч<EFBFBD> <D0A7> <EFBFBD> ȣ <EFBFBD> ǿ<EFBFBD> ƴ<EFBFBD> <C6B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0 <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-15 15:57:37 +08:00
LCD_ShowString ( 0 , y , str , color , bg_color ) ;
else
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> <EFBFBD> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> ʽ (LCD_WIDTH - <20> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> <EFBFBD> ) / 2 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˮƽ <CBAE> <C6BD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ ƫ<CABC> <C6AB> X <20> <> <EFBFBD> 겢<EFBFBD> <EAB2A2> Ⱦ
LCD_ShowString ( ( LCD_WIDTH - len * 8 ) / 2 , y , str , color , bg_color ) ;
2026-07-15 15:57:37 +08:00
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> Ⱦ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ش <EFBFBD> 16 x32 <EFBFBD> ߴ <EFBFBD> <EFBFBD> <EFBFBD> Ӣ <EFBFBD> <EFBFBD> / <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ַ <EFBFBD>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_ShowChar16x32 ( u16 x , u16 y , char ch , u16 color , u16 bg_color )
{
u8 r , c , i , j ;
2026-07-17 19:43:02 +08:00
u8 val_bit ;
2026-07-15 15:57:37 +08:00
u8 char_idx = ch - 0x20 ;
u8 f_h = ( u8 ) ( color > > 8 ) ;
u8 f_l = ( u8 ) ( color & 0xFF ) ;
u8 b_h = ( u8 ) ( bg_color > > 8 ) ;
u8 b_l = ( u8 ) ( bg_color & 0xFF ) ;
if ( ch < 0x20 | | ch > 0x7E ) return ;
2026-07-17 19:43:02 +08:00
LCD_SetWindow ( x , x + 16 - 1 , y , y + 32 - 1 ) ; // <20> <> <EFBFBD> <EFBFBD> 16x32 <20> Ļ<EFBFBD> ͼ<EFBFBD> Ӵ<EFBFBD>
2026-07-15 15:57:37 +08:00
WriteComm ( 0x2C ) ;
2026-07-16 17:52:52 +08:00
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͵<EFBFBD> 16 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> data
2026-07-15 15:57:37 +08:00
for ( r = 0 ; r < 16 ; r + + )
{
u8 line = FONT_8x16 [ char_idx ] [ r ] ;
2026-07-16 17:52:52 +08:00
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 㷭<EFBFBD> <E3B7AD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (i = 0 <20> <> i = 1)
2026-07-15 15:57:37 +08:00
for ( i = 0 ; i < 2 ; i + + )
{
2026-07-17 19:43:02 +08:00
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڵ<EFBFBD> 8 <20> <> bit <20> <> <EFBFBD> ص<EFBFBD>
2026-07-15 15:57:37 +08:00
for ( c = 0 ; c < 8 ; c + + )
{
2026-07-17 19:43:02 +08:00
val_bit = ( line & ( 0x80 > > c ) ) ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 㷭<EFBFBD> <E3B7AD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ص<EFBFBD> <D8B5> ظ<EFBFBD> <D8B8> <EFBFBD> <EFBFBD> <EFBFBD> д<EFBFBD> <D0B4> 2 <20> <> (j = 0 <20> <> j = 1)
2026-07-15 15:57:37 +08:00
for ( j = 0 ; j < 2 ; j + + )
{
if ( val_bit )
{
WriteData ( f_h ) ;
WriteData ( f_l ) ;
}
else
{
WriteData ( b_h ) ;
WriteData ( b_l ) ;
}
}
}
}
}
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ش <EFBFBD> 16 x32 <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> / Ӣ <EFBFBD> <EFBFBD> <EFBFBD> ִ <EFBFBD>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_ShowString16x32 ( u16 x , u16 y , char * str , u16 color , u16 bg_color )
{
while ( * str )
{
LCD_ShowChar16x32 ( x , y , * str , color , bg_color ) ;
2026-07-17 19:43:02 +08:00
x + = 16 ; // ÿ<> <C3BF> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> ƫ<EFBFBD> <C6AB> 16 <20> <> <EFBFBD> <EFBFBD>
2026-07-15 15:57:37 +08:00
str + + ;
}
}
2026-07-16 17:52:52 +08:00
/**
2026-07-17 19:43:02 +08:00
* @ brief <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> Y <EFBFBD> <EFBFBD> <EFBFBD> ߶ <EFBFBD> <EFBFBD> ϣ <EFBFBD> ˮ ƽ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ⱦ <EFBFBD> <EFBFBD> ʾ <EFBFBD> ش <EFBFBD> 16 x32 <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ַ <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-16 17:52:52 +08:00
*/
2026-07-15 15:57:37 +08:00
void LCD_ShowString16x32Centered ( u16 y , char * str , u16 color , u16 bg_color )
{
u16 len = 0 ;
char * p = str ;
2026-07-17 19:43:02 +08:00
while ( * p + + ) len + + ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-16 17:52:52 +08:00
2026-07-17 19:43:02 +08:00
if ( len * 16 > = LCD_WIDTH )
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ<EFBFBD> <C4BB> <EFBFBD> ȣ <EFBFBD> <C8A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2026-07-15 15:57:37 +08:00
LCD_ShowString16x32 ( 0 , y , str , color , bg_color ) ;
else
2026-07-17 19:43:02 +08:00
// ˮƽ <CBAE> <C6BD> <EFBFBD> м<EFBFBD> <D0BC> <EFBFBD>
LCD_ShowString16x32 ( ( LCD_WIDTH - len * 16 ) / 2 , y , str , color , bg_color ) ;
2026-07-15 15:57:37 +08:00
}