2026-03-20 21:16:58 +08:00
# include "../main/SystemInclude.h"
# include "../Device/oledfont.h"
// --- 1. <20> Դ涨<D4B4> <E6B6A8> ---
// ǰ̨<C7B0> <CCA8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> д<EFBFBD> <D0B4> <EFBFBD> µ<EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
u8 OLED_GRAM [ 144 ] [ 8 ] ;
// <20> <> ̨<EFBFBD> <CCA8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڴ洢<DAB4> <E6B4A2> ǰ<EFBFBD> <C7B0> Ļ<EFBFBD> <C4BB> ʵ<EFBFBD> <CAB5> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> ݣ<EFBFBD> <DDA3> <EFBFBD> <EFBFBD> ڶԱȲ<D4B1> <C8B2> <EFBFBD>
u8 OLED_GRAM_Back [ 144 ] [ 8 ] ;
//<2F> <> <EFBFBD> Ժ<EFBFBD> <D4BA> <EFBFBD>
void OLED_ColorTurn ( u8 i )
{
if ( i = = 0 )
{
OLED_WR_Byte ( 0xA6 , OLED_CMD ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
}
if ( i = = 1 )
{
OLED_WR_Byte ( 0xA7 , OLED_CMD ) ; //<2F> <> ɫ<EFBFBD> <C9AB> ʾ
}
}
//<2F> <> Ļ<EFBFBD> <C4BB> ת180<38> <30>
void OLED_DisplayTurn ( u8 i )
{
if ( i = = 0 )
{
OLED_WR_Byte ( 0xC8 , OLED_CMD ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
OLED_WR_Byte ( 0xA1 , OLED_CMD ) ;
}
if ( i = = 1 )
{
OLED_WR_Byte ( 0xC0 , OLED_CMD ) ; //<2F> <> ת<EFBFBD> <D7AA> ʾ
OLED_WR_Byte ( 0xA0 , OLED_CMD ) ;
}
}
//<2F> <> ʱ
void IIC_delay ( void )
{
u8 t = 3 ;
while ( t - - ) ;
}
//<2F> <> ʼ <EFBFBD> ź<EFBFBD>
void I2C_Start ( void )
{
OLED_SDA_Set ( ) ;
OLED_SCL_Set ( ) ;
IIC_delay ( ) ;
OLED_SDA_Clr ( ) ;
IIC_delay ( ) ;
OLED_SCL_Clr ( ) ;
IIC_delay ( ) ;
}
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> ź<EFBFBD>
void I2C_Stop ( void )
{
OLED_SDA_Clr ( ) ;
OLED_SCL_Set ( ) ;
IIC_delay ( ) ;
OLED_SDA_Set ( ) ;
}
//<2F> ȴ<EFBFBD> <C8B4> ź<EFBFBD> <C5BA> <EFBFBD> Ӧ
void I2C_WaitAck ( void ) //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> źŵĵ<C5B5> ƽ
{
OLED_SDA_Set ( ) ;
IIC_delay ( ) ;
OLED_SCL_Set ( ) ;
IIC_delay ( ) ;
OLED_SCL_Clr ( ) ;
IIC_delay ( ) ;
}
//д<> <D0B4> һ <EFBFBD> <D2BB> <EFBFBD> ֽ<EFBFBD>
void Send_Byte ( u8 dat )
{
u8 i ;
for ( i = 0 ; i < 8 ; i + + )
{
if ( dat & 0x80 ) //<2F> <> dat<61> <74> 8λ<38> <CEBB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB> <EFBFBD> <EFBFBD> д<EFBFBD> <D0B4>
{
OLED_SDA_Set ( ) ;
}
else
{
OLED_SDA_Clr ( ) ;
}
IIC_delay ( ) ;
OLED_SCL_Set ( ) ;
IIC_delay ( ) ;
OLED_SCL_Clr ( ) ; //<2F> <> ʱ<EFBFBD> <CAB1> <EFBFBD> ź<EFBFBD> <C5BA> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> ͵<EFBFBD> ƽ
dat < < = 1 ;
}
}
//<2F> <> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> ֽ<EFBFBD>
//mode:<3A> <> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ־ 0,<2C> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> ;1,<2C> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> ;
void OLED_WR_Byte ( u8 dat , u8 mode )
{
I2C_Start ( ) ;
Send_Byte ( 0x78 ) ; //д<> <D0B4> <EFBFBD> 豸<EFBFBD> <E8B1B8> ַ
I2C_WaitAck ( ) ;
if ( mode ) { Send_Byte ( 0x40 ) ; }
else { Send_Byte ( 0x00 ) ; }
I2C_WaitAck ( ) ;
Send_Byte ( dat ) ;
I2C_WaitAck ( ) ;
I2C_Stop ( ) ;
}
//<2F> <> <EFBFBD> <EFBFBD> OLED<45> <44> ʾ
void OLED_DisPlay_On ( void )
{
OLED_WR_Byte ( 0x8D , OLED_CMD ) ; //<2F> <> <EFBFBD> ɱ<EFBFBD> ʹ <EFBFBD> <CAB9>
OLED_WR_Byte ( 0x14 , OLED_CMD ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɱ<EFBFBD>
OLED_WR_Byte ( 0xAF , OLED_CMD ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ
}
//<2F> ر<EFBFBD> OLED<45> <44> ʾ
void OLED_DisPlay_Off ( void )
{
OLED_WR_Byte ( 0x8D , OLED_CMD ) ; //<2F> <> <EFBFBD> ɱ<EFBFBD> ʹ <EFBFBD> <CAB9>
OLED_WR_Byte ( 0x10 , OLED_CMD ) ; //<2F> رյ<D8B1> <D5B5> ɱ<EFBFBD>
OLED_WR_Byte ( 0xAE , OLED_CMD ) ; //<2F> ر<EFBFBD> <D8B1> <EFBFBD> Ļ
}
/**
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˢ <EFBFBD> <EFBFBD> ȫ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ч <EFBFBD> <EFBFBD>
* @ note <EFBFBD> Ա <EFBFBD> OLED_GRAM <EFBFBD> <EFBFBD> OLED_GRAM_Back <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˢ <EFBFBD> ± 仯 <EFBFBD> <EFBFBD> <EFBFBD> ֽ <EFBFBD>
*/
void OLED_Refresh_Diff ( void )
{
u8 i , n ;
for ( i = 0 ; i < 8 ; i + + )
{
// <20> <> <EFBFBD> <EFBFBD> ҳ<EFBFBD> <D2B3> ַ
OLED_WR_Byte ( 0xb0 + i , OLED_CMD ) ;
OLED_WR_Byte ( 0x02 , OLED_CMD ) ; // Low Col Start Addr
OLED_WR_Byte ( 0x10 , OLED_CMD ) ; // High Col Start Addr
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
I2C_Start ( ) ;
Send_Byte ( 0x78 ) ;
I2C_WaitAck ( ) ;
Send_Byte ( 0x40 ) ;
I2C_WaitAck ( ) ;
for ( n = 0 ; n < 128 ; n + + )
{
// <20> Ա<EFBFBD> ǰ<EFBFBD> <C7B0> ̨<EFBFBD> <CCA8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( OLED_GRAM [ n ] [ i ] ! = OLED_GRAM_Back [ n ] [ i ] )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݱ仯<DDB1> <E4BBAF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݵ<EFBFBD> Ӳ<EFBFBD> <D3B2>
Send_Byte ( OLED_GRAM [ n ] [ i ] ) ;
// <20> <> <EFBFBD> º<EFBFBD> ̨<EFBFBD> <CCA8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC>
OLED_GRAM_Back [ n ] [ i ] = OLED_GRAM [ n ] [ i ] ;
}
else
{
}
}
I2C_Stop ( ) ;
}
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʵ<EFBFBD> ֵIJ<D6B5> <C4B2> <EFBFBD> ˢ<EFBFBD> ¡<EFBFBD> <C2A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> Ż<EFBFBD>
void OLED_Refresh_Line_Diff ( u8 line ) // line 0-7
{
u8 n ;
u8 x_start = 0 ;
u8 is_diff = 0 ;
// 1. <20> <> ɨ<EFBFBD> <C9A8> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> û<EFBFBD> б 仯
for ( n = 0 ; n < 128 ; n + + )
{
if ( OLED_GRAM [ n ] [ line ] ! = OLED_GRAM_Back [ n ] [ line ] )
{
is_diff = 1 ;
break ;
}
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD> û<EFBFBD> 䣬ֱ<E4A3AC> ӷ<EFBFBD> <D3B7> أ<EFBFBD> ʡȥ<CAA1> <C8A5> <EFBFBD> <EFBFBD> I2C<32> <43> <EFBFBD> <EFBFBD>
if ( ! is_diff ) return ;
// 2. <20> <> <EFBFBD> <EFBFBD> ҳ<EFBFBD> <D2B3> ַ
OLED_WR_Byte ( 0xb0 + line , OLED_CMD ) ;
OLED_WR_Byte ( 0x02 , OLED_CMD ) ;
OLED_WR_Byte ( 0x10 , OLED_CMD ) ;
I2C_Start ( ) ;
Send_Byte ( 0x78 ) ;
I2C_WaitAck ( ) ;
Send_Byte ( 0x40 ) ;
I2C_WaitAck ( ) ;
// 3. <20> <> <EFBFBD> ֽڶԱȲ<D4B1> <C8B2> <EFBFBD> <EFBFBD> <EFBFBD>
for ( n = 0 ; n < 128 ; n + + )
{
if ( OLED_GRAM [ n ] [ line ] ! = OLED_GRAM_Back [ n ] [ line ] )
{
Send_Byte ( OLED_GRAM [ n ] [ line ] ) ;
// ͬ<> <CDAC> <EFBFBD> <EFBFBD> ̨
OLED_GRAM_Back [ n ] [ line ] = OLED_GRAM [ n ] [ line ] ;
}
else
{
// <20> <> ע<EFBFBD> ⡿<EFBFBD> <E2A1BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> I2C<32> <43> <EFBFBD> <EFBFBD> ģʽ <C4A3> £<EFBFBD> <C2A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֽڣ<D6BD> <DAA3> ӻ<EFBFBD> <D3BB> <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD>
// <20> <> <EFBFBD> º<EFBFBD> <C2BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> д<EFBFBD> <D0B4> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB>
// <20> <> <EFBFBD> 뷢<EFBFBD> ͵<EFBFBD> ǰ<EFBFBD> <C7B0> Ļ<EFBFBD> ϵ<EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> Back <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> "ռλ"<22> <>
Send_Byte ( OLED_GRAM_Back [ n ] [ line ] ) ;
}
I2C_WaitAck ( ) ;
}
I2C_Stop ( ) ;
}
// <20> <> <EFBFBD> ݾɽӿڵ<D3BF> ȫ<EFBFBD> <C8AB> ˢ<EFBFBD> <CBA2>
void OLED_Refresh ( void )
{
u8 i , n ;
for ( i = 0 ; i < 8 ; i + + )
{
OLED_WR_Byte ( 0xb0 + i , OLED_CMD ) ;
OLED_WR_Byte ( 0x02 , OLED_CMD ) ;
OLED_WR_Byte ( 0x10 , OLED_CMD ) ;
I2C_Start ( ) ;
Send_Byte ( 0x78 ) ;
I2C_WaitAck ( ) ;
Send_Byte ( 0x40 ) ;
I2C_WaitAck ( ) ;
for ( n = 0 ; n < 128 ; n + + )
{
Send_Byte ( OLED_GRAM [ n ] [ i ] ) ;
I2C_WaitAck ( ) ;
}
I2C_Stop ( ) ;
}
// ȫ<> <C8AB> ˢ<EFBFBD> º<EFBFBD> <C2BA> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> ̨
memcpy ( OLED_GRAM_Back , OLED_GRAM , sizeof ( OLED_GRAM ) ) ;
}
// <20> ɰ<EFBFBD> ˢ<EFBFBD> <CBA2> <EFBFBD> нӿڣ<D3BF> <DAA3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݣ<EFBFBD>
void OLED_Refresh_Line ( u8 line )
{
u8 n ;
OLED_WR_Byte ( 0xb0 + line , OLED_CMD ) ;
OLED_WR_Byte ( 0x02 , OLED_CMD ) ;
OLED_WR_Byte ( 0x10 , OLED_CMD ) ;
I2C_Start ( ) ;
Send_Byte ( 0x78 ) ;
I2C_WaitAck ( ) ;
Send_Byte ( 0x40 ) ;
I2C_WaitAck ( ) ;
for ( n = 0 ; n < 128 ; n + + )
{
Send_Byte ( OLED_GRAM [ n ] [ line ] ) ;
I2C_WaitAck ( ) ;
}
I2C_Stop ( ) ;
// ͬ<> <CDAC> <EFBFBD> <EFBFBD> <EFBFBD> к<EFBFBD> ̨
memcpy ( OLED_GRAM_Back [ 0 ] + line * 128 , OLED_GRAM [ 0 ] + line * 128 , 128 ) ; // <20> <EFBFBD> <F2B5A5B4> <EFBFBD> <EFBFBD> <EFBFBD> ʵ<EFBFBD> <CAB5> <EFBFBD> 谴ά<E8B0B4> ȿ<EFBFBD> <C8BF> <EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> memcpyд<79> <D0B4> <EFBFBD> <EFBFBD> <EFBFBD> Զ<EFBFBD> ά<EFBFBD> <CEAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ܲ<EFBFBD> ֱ<EFBFBD> ۣ<EFBFBD> <DBA3> <EFBFBD> <EFBFBD> <EFBFBD> ѭ<EFBFBD> <D1AD> :
for ( n = 0 ; n < 128 ; n + + ) OLED_GRAM_Back [ n ] [ line ] = OLED_GRAM [ n ] [ line ] ;
}
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
void OLED_Clear ( void )
{
u8 i , n ;
for ( i = 0 ; i < 8 ; i + + )
{
for ( n = 0 ; n < 128 ; n + + )
OLED_GRAM [ n ] [ i ] = 0 ;
}
// <20> <> <EFBFBD> ﲻ<EFBFBD> <EFB2BB> <EFBFBD> <EFBFBD> OLED_Refresh<73> <68> <EFBFBD> <EFBFBD> <EFBFBD> ⲿ<EFBFBD> <E2B2BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˢ<EFBFBD> <CBA2>
}
//<2F> <> <EFBFBD> <EFBFBD>
//x:0~127
//y:0~63
//t:1 <20> <> <EFBFBD> <EFBFBD> 0,<2C> <> <EFBFBD> <EFBFBD>
//<2F> <> <EFBFBD> <EFBFBD>
void OLED_DrawPoint ( u8 x , u8 y , u8 t )
{
u8 i , m , n ;
i = y / 8 ;
m = y % 8 ;
n = 1 < < m ;
if ( t ) { OLED_GRAM [ x ] [ i ] | = n ; }
else
{
OLED_GRAM [ x ] [ i ] = ~ OLED_GRAM [ x ] [ i ] ;
OLED_GRAM [ x ] [ i ] | = n ;
OLED_GRAM [ x ] [ i ] = ~ OLED_GRAM [ x ] [ i ] ;
}
}
//<2F> <> <EFBFBD> <EFBFBD>
//x1,y1:<3A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//x2,y2:<3A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
void OLED_DrawLine ( u8 x1 , u8 y1 , u8 x2 , u8 y2 , u8 mode )
{
u16 t ;
int xerr = 0 , yerr = 0 , delta_x , delta_y , distance ;
int incx , incy , uRow , uCol ;
delta_x = x2 - x1 ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
delta_y = y2 - y1 ;
uRow = x1 ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
uCol = y1 ;
if ( delta_x > 0 ) incx = 1 ; //<2F> <> <EFBFBD> õ<EFBFBD> <C3B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
else if ( delta_x = = 0 ) incx = 0 ; //<2F> <> ֱ<EFBFBD> <D6B1>
else { incx = - 1 ; delta_x = - delta_x ; }
if ( delta_y > 0 ) incy = 1 ;
else if ( delta_y = = 0 ) incy = 0 ; //ˮƽ <CBAE> <C6BD>
else { incy = - 1 ; delta_y = - delta_x ; }
if ( delta_x > delta_y ) distance = delta_x ; //ѡ ȡ<D1A1> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
else distance = delta_y ;
for ( t = 0 ; t < distance + 1 ; t + + )
{
OLED_DrawPoint ( uRow , uCol , mode ) ; //<2F> <> <EFBFBD> <EFBFBD>
xerr + = delta_x ;
yerr + = delta_y ;
if ( xerr > distance )
{
xerr - = distance ;
uRow + = incx ;
}
if ( yerr > distance )
{
yerr - = distance ;
uCol + = incy ;
}
}
}
//x,y:Բ<> <D4B2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//r:Բ<> İ뾶
void OLED_DrawCircle ( u8 x , u8 y , u8 r )
{
int a , b , num ;
a = 0 ;
b = r ;
while ( 2 * b * b > = r * r )
{
OLED_DrawPoint ( x + a , y - b , 1 ) ;
OLED_DrawPoint ( x - a , y - b , 1 ) ;
OLED_DrawPoint ( x - a , y + b , 1 ) ;
OLED_DrawPoint ( x + a , y + b , 1 ) ;
OLED_DrawPoint ( x + b , y + a , 1 ) ;
OLED_DrawPoint ( x + b , y - a , 1 ) ;
OLED_DrawPoint ( x - b , y - a , 1 ) ;
OLED_DrawPoint ( x - b , y + a , 1 ) ;
a + + ;
num = ( a * a + b * b ) - r * r ; //<2F> <> <EFBFBD> 㻭<EFBFBD> ĵ<EFBFBD> <C4B5> <EFBFBD> Բ<EFBFBD> ĵľ<C4B5> <C4BE> <EFBFBD>
if ( num > 0 )
{
b - - ;
a - - ;
}
}
}
//<2F> <> ָ<EFBFBD> <D6B8> λ<EFBFBD> <CEBB> <EFBFBD> <EFBFBD> ʾ һ <CABE> <D2BB> <EFBFBD> ַ<EFBFBD> ,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ַ<EFBFBD>
//x:0~127
//y:0~63
//size1:ѡ <> <D1A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 6x8/6x12/8x16/12x24
//mode:0,<2C> <> ɫ<EFBFBD> <C9AB> ʾ ;1,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
void OLED_ShowChar ( u8 x , u8 y , u8 chr , u8 size1 , u8 mode )
{
u8 i , m , temp , size2 , chr1 ;
u8 x0 = x , y0 = y ;
if ( size1 = = 8 ) size2 = 6 ;
else size2 = ( size1 / 8 + ( ( size1 % 8 ) ? 1 : 0 ) ) * ( size1 / 2 ) ; //<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>
chr1 = chr - ' ' ; //<2F> <> <EFBFBD> <EFBFBD> ƫ<EFBFBD> ƺ<EFBFBD> <C6BA> <EFBFBD> ֵ
for ( i = 0 ; i < size2 ; i + + )
{
if ( size1 = = 8 )
{ temp = asc2_0806 [ chr1 ] [ i ] ; } //<2F> <> <EFBFBD> <EFBFBD> 0806<30> <36> <EFBFBD> <EFBFBD>
else if ( size1 = = 12 )
{ temp = asc2_1206 [ chr1 ] [ i ] ; } //<2F> <> <EFBFBD> <EFBFBD> 1206<30> <36> <EFBFBD> <EFBFBD>
else if ( size1 = = 16 )
{ temp = asc2_1608 [ chr1 ] [ i ] ; } //<2F> <> <EFBFBD> <EFBFBD> 1608<30> <38> <EFBFBD> <EFBFBD>
else if ( size1 = = 24 )
{ temp = asc2_2412 [ chr1 ] [ i ] ; } //<2F> <> <EFBFBD> <EFBFBD> 2412<31> <32> <EFBFBD> <EFBFBD>
else return ;
for ( m = 0 ; m < 8 ; m + + )
{
if ( temp & 0x01 ) OLED_DrawPoint ( x , y , mode ) ;
else OLED_DrawPoint ( x , y , ! mode ) ;
temp > > = 1 ;
y + + ;
}
x + + ;
if ( ( size1 ! = 8 ) & & ( ( x - x0 ) = = size1 / 2 ) )
{ x = x0 ; y0 = y0 + 8 ; }
y = y0 ;
}
}
//<2F> <> ʾ <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD>
//x,y:<3A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//size1:<3A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> С
//*chr:<3A> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> ַ
//mode:0,<2C> <> ɫ<EFBFBD> <C9AB> ʾ ;1,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
//<2F> <> ʾ <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD>
void OLED_ShowString ( u8 x , u8 y , u8 * chr , u8 size1 , u8 mode )
{
while ( ( * chr > = ' ' ) & & ( * chr < = ' ~ ' ) )
{
OLED_ShowChar ( x , y , * chr , size1 , mode ) ;
if ( size1 = = 8 ) x + = 6 ;
else x + = size1 / 2 ;
chr + + ;
}
}
//m^n
u32 OLED_Pow ( u8 m , u8 n )
{
u32 result = 1 ;
while ( n - - ) result * = m ;
return result ;
}
//<2F> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD>
//x,y :<3A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//num :Ҫ<> <D2AA> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//len :<3A> <> <EFBFBD> ֵ<EFBFBD> λ<EFBFBD> <CEBB>
//size:<3A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> С
//mode:0,<2C> <> ɫ<EFBFBD> <C9AB> ʾ ;1,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
void OLED_ShowNum ( u8 x , u8 y , u32 num , u8 len , u8 size1 , u8 mode )
{
u8 t , temp , m = 0 ;
if ( size1 = = 8 ) m = 2 ;
for ( t = 0 ; t < len ; t + + )
{
temp = ( num / OLED_Pow ( 10 , len - t - 1 ) ) % 10 ;
if ( temp = = 0 ) OLED_ShowChar ( x + ( size1 / 2 + m ) * t , y , ' 0 ' , size1 , mode ) ;
else OLED_ShowChar ( x + ( size1 / 2 + m ) * t , y , temp + ' 0 ' , size1 , mode ) ;
}
}
//<2F> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD>
//x,y:<3A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//num:<3A> <> <EFBFBD> ֶ<EFBFBD> Ӧ<EFBFBD> <D3A6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//mode:0,<2C> <> ɫ<EFBFBD> <C9AB> ʾ ;1,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
void OLED_ShowChinese ( u8 x , u8 y , u8 num , u8 size1 , u8 mode )
{
u8 m , temp ;
u8 x0 = x , y0 = y ;
u16 i , size3 = ( size1 / 8 + ( ( size1 % 8 ) ? 1 : 0 ) ) * size1 ; //<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>
for ( i = 0 ; i < size3 ; i + + )
{
if ( size1 = = 16 )
{ temp = Hzk1 [ num ] [ i ] ; } //<2F> <> <EFBFBD> <EFBFBD> 16*16<31> <36> <EFBFBD> <EFBFBD>
else if ( size1 = = 24 )
{ temp = Hzk2 [ num ] [ i ] ; } //<2F> <> <EFBFBD> <EFBFBD> 24*24<32> <34> <EFBFBD> <EFBFBD>
else if ( size1 = = 32 )
{ temp = Hzk3 [ num ] [ i ] ; } //<2F> <> <EFBFBD> <EFBFBD> 32*32<33> <32> <EFBFBD> <EFBFBD>
else if ( size1 = = 64 )
{ temp = Hzk4 [ num ] [ i ] ; } //<2F> <> <EFBFBD> <EFBFBD> 64*64<36> <34> <EFBFBD> <EFBFBD>
else return ;
for ( m = 0 ; m < 8 ; m + + )
{
if ( temp & 0x01 ) OLED_DrawPoint ( x , y , mode ) ;
else OLED_DrawPoint ( x , y , ! mode ) ;
temp > > = 1 ;
y + + ;
}
x + + ;
if ( ( x - x0 ) = = size1 )
{ x = x0 ; y0 = y0 + 8 ; }
y = y0 ;
}
}
//num <20> <> ʾ <EFBFBD> <CABE> <EFBFBD> ֵĸ<D6B5> <C4B8> <EFBFBD>
//space ÿһ <C3BF> <D2BB> <EFBFBD> <EFBFBD> ʾ <EFBFBD> ļ<EFBFBD> <C4BC> <EFBFBD>
//mode:0,<2C> <> ɫ<EFBFBD> <C9AB> ʾ ;1,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
void OLED_ScrollDisplay ( u8 num , u8 space , u8 mode )
{
u8 i , n , t = 0 , m = 0 , r ;
while ( 1 )
{
if ( m = = 0 )
{
OLED_ShowChinese ( 128 , 24 , t , 16 , mode ) ; //д<> <D0B4> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> ֱ<EFBFBD> <D6B1> <EFBFBD> <EFBFBD> <EFBFBD> OLED_GRAM[][]<5D> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
t + + ;
}
if ( t = = num )
{
for ( r = 0 ; r < 16 * space ; r + + ) //<2F> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD>
{
for ( i = 1 ; i < 144 ; i + + )
{
for ( n = 0 ; n < 8 ; n + + )
{
OLED_GRAM [ i - 1 ] [ n ] = OLED_GRAM [ i ] [ n ] ;
}
}
OLED_Refresh ( ) ;
}
t = 0 ;
}
m + + ;
if ( m = = 16 ) { m = 0 ; }
for ( i = 1 ; i < 144 ; i + + ) //ʵ<> <CAB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
{
for ( n = 0 ; n < 8 ; n + + )
{
OLED_GRAM [ i - 1 ] [ n ] = OLED_GRAM [ i ] [ n ] ;
}
}
OLED_Refresh ( ) ;
}
}
//x,y<> <79> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//sizex,sizey,ͼƬ<CDBC> <C6AC> <EFBFBD> <EFBFBD>
//BMP[]<5D> <> Ҫд<D2AA> <D0B4> <EFBFBD> <EFBFBD> ͼƬ<CDBC> <C6AC> <EFBFBD> <EFBFBD>
//mode:0,<2C> <> ɫ<EFBFBD> <C9AB> ʾ ;1,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ
void OLED_ShowPicture ( u8 x , u8 y , u8 sizex , u8 sizey , u8 BMP [ ] , u8 mode )
{
u16 j = 0 ;
u8 i , n , temp , m ;
u8 x0 = x , y0 = y ;
sizey = sizey / 8 + ( ( sizey % 8 ) ? 1 : 0 ) ;
for ( n = 0 ; n < sizey ; n + + )
{
for ( i = 0 ; i < sizex ; i + + )
{
temp = BMP [ j ] ;
j + + ;
for ( m = 0 ; m < 8 ; m + + )
{
if ( temp & 0x01 ) OLED_DrawPoint ( x , y , mode ) ;
else OLED_DrawPoint ( x , y , ! mode ) ;
temp > > = 1 ;
y + + ;
}
x + + ;
if ( ( x - x0 ) = = sizex )
{
x = x0 ;
y0 = y0 + 8 ;
}
y = y0 ;
}
}
}
//OLED<45> ij<EFBFBD> ʼ <EFBFBD> <CABC>
void OLED_Init ( void )
{
2026-03-20 21:19:04 +08:00
GPIO_InitTypeDef GPIO_InitStruct ;
2026-03-20 21:16:58 +08:00
/* 1. <20> <> <EFBFBD> <EFBFBD> GPIO1<4F> <31> <EFBFBD> <EFBFBD> 4<EFBFBD> IJ<EFBFBD> <C4B2> <EFBFBD> */ //P1.4<EFBFBD> <EFBFBD> SDA<EFBFBD> <EFBFBD>
GPIO_InitStruct . Pin = GPIO_PIN_4 ; // ѡ <> <D1A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 4<EFBFBD> <34> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʵ<EFBFBD> <CAB5> Ӳ<EFBFBD> <D3B2> <EFBFBD> ģ<DEB8>
GPIO_InitStruct . Mode = GPIO_MODE_OUTPUT_OD ; // <20> <> <EFBFBD> <EFBFBD> ģʽ <C4A3> <CABD> <EFBFBD> Ǹ<EFBFBD> <C7B8> ù<EFBFBD> <C3B9> ܣ<EFBFBD>
GPIO_InitStruct . Current = GPIO_CURRENT_4mA ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 4mA<6D> <41> <EFBFBD> <EFBFBD> <EFBFBD> ݸ<EFBFBD> <DDB8> ص<EFBFBD> <D8B5> <EFBFBD> <EFBFBD> <EFBFBD>
GPIO_InitStruct . Pull = GPIO_NOPULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
GPIO_InitStruct . SchmittTrigger = ENABLE ;
GPIO_InitStruct . Alternate = GPIOx_AF_GPIO ; // // AFΪ<46> <CEAA> ͨIO
/* 2. Ӧ<> <D3A6> GPIO<49> <4F> <EFBFBD> <EFBFBD> */
LHL_GPIO_Init ( pGPIO1 , & GPIO_InitStruct ) ; // <20> <> ʼ <EFBFBD> <CABC> GPIO1
/* <20> <> <EFBFBD> <EFBFBD> GPIO2<4F> <32> <EFBFBD> <EFBFBD> 0<EFBFBD> IJ<EFBFBD> <C4B2> <EFBFBD> */ //P2.0<EFBFBD> <EFBFBD> SCL<EFBFBD> <EFBFBD>
GPIO_InitStruct . Pin = GPIO_PIN_0 ; // ѡ <> <D1A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 4<EFBFBD> <34> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʵ<EFBFBD> <CAB5> Ӳ<EFBFBD> <D3B2> <EFBFBD> ģ<DEB8>
GPIO_InitStruct . Mode = GPIO_MODE_OUTPUT_OD ; // <20> <> <EFBFBD> <EFBFBD> ģʽ <C4A3> <CABD> <EFBFBD> Ǹ<EFBFBD> <C7B8> ù<EFBFBD> <C3B9> ܣ<EFBFBD>
GPIO_InitStruct . Current = GPIO_CURRENT_4mA ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 4mA<6D> <41> <EFBFBD> <EFBFBD> <EFBFBD> ݸ<EFBFBD> <DDB8> ص<EFBFBD> <D8B5> <EFBFBD> <EFBFBD> <EFBFBD>
GPIO_InitStruct . Pull = GPIO_NOPULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
GPIO_InitStruct . SchmittTrigger = ENABLE ;
GPIO_InitStruct . Alternate = GPIOx_AF_GPIO ; // // AFΪ<46> <CEAA> ͨIO
LHL_GPIO_Init ( pGPIO2 , & GPIO_InitStruct ) ; // <20> <> ʼ <EFBFBD> <CABC> GPIO2
/* 5. <20> <> <EFBFBD> <EFBFBD> GPIO1<4F> <31> <EFBFBD> <EFBFBD> 6<EFBFBD> IJ<EFBFBD> <C4B2> <EFBFBD> */ //P1.6<EFBFBD> <EFBFBD> RES<EFBFBD> <EFBFBD>
GPIO_InitStruct . Pin = GPIO_PIN_6 ; // ѡ <> <D1A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 4<EFBFBD> <34> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʵ<EFBFBD> <CAB5> Ӳ<EFBFBD> <D3B2> <EFBFBD> ģ<DEB8>
GPIO_InitStruct . Mode = GPIO_MODE_OUTPUT_PP ; // <20> <> <EFBFBD> <EFBFBD> ģʽ <C4A3> <CABD> <EFBFBD> Ǹ<EFBFBD> <C7B8> ù<EFBFBD> <C3B9> ܣ<EFBFBD>
GPIO_InitStruct . Current = GPIO_CURRENT_4mA ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 4mA<6D> <41> <EFBFBD> <EFBFBD> <EFBFBD> ݸ<EFBFBD> <DDB8> ص<EFBFBD> <D8B5> <EFBFBD> <EFBFBD> <EFBFBD>
GPIO_InitStruct . Pull = GPIO_NOPULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
GPIO_InitStruct . SchmittTrigger = ENABLE ;
GPIO_InitStruct . Alternate = GPIOx_AF_GPIO ; // // AFΪ<46> <CEAA> ͨIO
LHL_GPIO_Init ( pGPIO1 , & GPIO_InitStruct ) ; // <20> <> ʼ <EFBFBD> <CABC> GPIO2
2026-03-20 21:19:04 +08:00
// --- <20> <> λ<EFBFBD> <CEBB> <EFBFBD> <EFBFBD> ---
OLED_RES_Clr ( ) ; // <20> <> <EFBFBD> <EFBFBD> RES <20> <> <EFBFBD> <EFBFBD>
delay_ms ( 200 ) ; // <20> <> ʱ 200ms
OLED_RES_Set ( ) ; // <20> <> <EFBFBD> <EFBFBD> RES <20> <> <EFBFBD> ţ<EFBFBD> <C5A3> <EFBFBD> <EFBFBD> <EFBFBD> Ӳ<EFBFBD> <D3B2> <EFBFBD> <EFBFBD> λ
// --- OLED <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ---
// 1. <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD>
OLED_WR_Byte ( 0xAE , OLED_CMD ) ; // **[0xAE] <20> ر<EFBFBD> <D8B1> <EFBFBD> ʾ **
// <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͨ<EFBFBD> <CDA8> <EFBFBD> ȹر<C8B9> <D8B1> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɺ<EFBFBD> <C9BA> ٿ<EFBFBD> <D9BF> <EFBFBD> <EFBFBD> <EFBFBD>
// [<5B> <> <EFBFBD> <EFBFBD> ]<5D> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˳<EFBFBD> <CBB3> <EFBFBD> <EFBFBD>
OLED_WR_Byte ( 0x02 , OLED_CMD ) ; // **[0x00~0x0F] <20> <> <EFBFBD> õ<EFBFBD> <C3B5> е <EFBFBD> ַ**
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Դ<EFBFBD> <D4B4> е <EFBFBD> ַ<EFBFBD> ĵ<EFBFBD> 4λ<34> <CEBB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ 0x02<30> <32>
// [<5B> <> <EFBFBD> <EFBFBD> ]<5D> <> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> Ϊ 0x00<30> <30> <EFBFBD> <EFBFBD> Ϊ 0x02 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> <EFBFBD> <CEA2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˮƽ λ<C6BD> á<EFBFBD>
OLED_WR_Byte ( 0x10 , OLED_CMD ) ; // **[0x10~0x1F] <20> <> <EFBFBD> ø<EFBFBD> <C3B8> е <EFBFBD> ַ**
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Դ<EFBFBD> <D4B4> е <EFBFBD> ַ<EFBFBD> ĸ<EFBFBD> 4λ<34> <CEBB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ 0x10 (<28> <> <EFBFBD> <EFBFBD> ַ0)<29> <>
// [<5B> <> <EFBFBD> <EFBFBD> ]<5D> <> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> <EFBFBD> ϵ<EFBFBD> <CFB5> е <EFBFBD> ַʹ <D6B7> ã<EFBFBD> һ <EFBFBD> 㲻<EFBFBD> <E3B2BB> <EFBFBD> <EFBFBD> <EFBFBD> ġ<DEB8>
OLED_WR_Byte ( 0x40 , OLED_CMD ) ; // **[0x40~0x7F] <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> ʼ <EFBFBD> <CABC> **
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ<EFBFBD> <C4BB> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> ʼ <EFBFBD> е <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> ֱ<EFBFBD> <D6B1> <EFBFBD> <EFBFBD> <EFBFBD> ã<EFBFBD> <C3A3> <EFBFBD>
// 0x40 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ӵ<EFBFBD> 0 <20> п<EFBFBD> ʼ <EFBFBD> <CABC> ʾ <EFBFBD> <CABE>
// [<5B> <> <EFBFBD> <EFBFBD> ]<5D> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ҫ<EFBFBD> <D2AA> ֱ<EFBFBD> <D6B1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 棬<EFBFBD> <E6A3AC> <EFBFBD> Ĵ<DEB8> ֵ (0x40~0x7F)<29> <>
OLED_WR_Byte ( 0xB0 , OLED_CMD ) ; // **[0xB0~0xB7] <20> <> <EFBFBD> <EFBFBD> ҳ<EFBFBD> <D2B3> ַ**
// <20> <> <EFBFBD> <EFBFBD> ҳ<EFBFBD> <D2B3> ַģʽ <C4A3> µ<EFBFBD> ҳ<EFBFBD> <D2B3> ַ<EFBFBD> <D6B7> 0-7<> <37> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> ʱͨ<CAB1> <CDA8> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> 0ҳ<30> <D2B3>
// [<5B> <> <EFBFBD> <EFBFBD> ]<5D> <> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> ã<EFBFBD> һ <EFBFBD> 㲻<EFBFBD> ġ<EFBFBD>
// 2. <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Աȶ<D4B1> (Ӱ<> <D3B0> <EFBFBD> <EFBFBD> ʾ Ч<CABE> <D0A7> )
OLED_WR_Byte ( 0x81 , OLED_CMD ) ; // **˫<> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> <EFBFBD> öԱȶ<D4B1> **
OLED_WR_Byte ( 0xcf , OLED_CMD ) ; // <20> Աȶ<D4B1> ֵ<EFBFBD> <D6B5> 0xCF (<28> <> Χ 0x00~0xFF)
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> ֵԽ<D6B5> <D4BD> Խ<EFBFBD> <D4BD> <EFBFBD> <EFBFBD>
// <20> <> <EFBFBD> 飺<EFBFBD> <E9A3BA> <EFBFBD> ݻ<EFBFBD> <DDBB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̫<EFBFBD> <CCAB> <EFBFBD> <EFBFBD> <EFBFBD> ۻ<EFBFBD> <DBBB> <EFBFBD> ʡ<EFBFBD> 磬<EFBFBD> ɵ<EFBFBD> С (<28> <> 0x7F)<29> <>
// <20> ĵ<EFBFBD> Ĭ<EFBFBD> ϸ<EFBFBD> λֵΪ 0x7F<37> <46>
// 3. ɨ<> 跽<EFBFBD> <E8B7BD> (<28> <> Ļ<EFBFBD> <C4BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ת)
OLED_WR_Byte ( 0xA1 , OLED_CMD ) ; // **[0xA0/0xA1] <20> <> <EFBFBD> <EFBFBD> ӳ<EFBFBD> <D3B3> **
// 0xA0: <20> е <EFBFBD> ַ0ӳ<30> 䵽SEG0 (<28> <> <EFBFBD> <EFBFBD> )
// 0xA1: <20> е <EFBFBD> ַ0ӳ<30> 䵽SEG127 (ˮƽ <CBAE> <C6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ת)
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ<EFBFBD> <C4BB> ʾ <EFBFBD> <CABE> <EFBFBD> Ҿ<EFBFBD> <D2BE> <EFBFBD> <EFBFBD> ˣ<EFBFBD> <CBA3> <EFBFBD> <EFBFBD> <EFBFBD> 0xA0<41> <30>
OLED_WR_Byte ( 0xA6 , OLED_CMD ) ; // **[0xA6/0xA7] <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> **
// 0xA6: <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ (0<> <30> 1<EFBFBD> <31> )
// 0xA7: <20> <> <EFBFBD> <EFBFBD> (0<> <30> 1<EFBFBD> <31> )
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ 0xA7 ʵ<> ַ<EFBFBD> ɫЧ<C9AB> <D0A7> <EFBFBD> <EFBFBD>
// 4. Ӳ<> <D3B2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (ƥ<> <C6A5> <EFBFBD> <EFBFBD> Ļ<EFBFBD> ֱ<EFBFBD> <D6B1> <EFBFBD> 128x64)
OLED_WR_Byte ( 0xA8 , OLED_CMD ) ; // **˫<> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> <EFBFBD> ö<EFBFBD> ·<EFBFBD> <C2B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> **
OLED_WR_Byte ( 0x3F , OLED_CMD ) ; // ֵ<> <D6B5> 0x3F (ʮ<> <CAAE> <EFBFBD> <EFBFBD> 63)
// <20> <> <EFBFBD> 㹫ʽ <E3B9AB> <CABD> MUX Ratio = ֵ + 1<> <31> 63+1=64<36> <34>
// <20> <> Ϊ<EFBFBD> <CEAA> Ļ<EFBFBD> <C4BB> 64 <20> У <EFBFBD> **<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> **<2A> <>
// 5. <20> <> Դ<EFBFBD> <D4B4> <EFBFBD> <EFBFBD> <EFBFBD> ɱ<EFBFBD> <C9B1> <EFBFBD> <EFBFBD> <EFBFBD> (<28> ؼ<EFBFBD> <D8BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ<EFBFBD> ܷ<EFBFBD> <DCB7> <EFBFBD> <EFBFBD> <EFBFBD> )
OLED_WR_Byte ( 0xad , OLED_CMD ) ; // **˫<> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> <EFBFBD> ɱ<EFBFBD> <C9B1> <EFBFBD> <EFBFBD> <EFBFBD> **
OLED_WR_Byte ( 0x8b , OLED_CMD ) ; // 0x8B: <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ڲ<EFBFBD> DC-DC <20> <> ѹ (<28> ڹ<EFBFBD> VCC)
// 0x8A: <20> ر<EFBFBD> <D8B1> ڲ<EFBFBD> <DAB2> <EFBFBD> ѹ (<28> <> <EFBFBD> ⲿ<EFBFBD> <E2B2BF> <EFBFBD> <EFBFBD> ѹ VCC)
// **[<5B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> 뿪<EFBFBD> <EBBFAA> (0x8B) <20> <> Ļ<EFBFBD> Ż<EFBFBD> <C5BB> <EFBFBD> <EFBFBD> <EFBFBD>
OLED_WR_Byte ( 0x33 , OLED_CMD ) ; // **<2A> <> <EFBFBD> <EFBFBD> VPP <20> <> ѹ (<28> <> <EFBFBD> <EFBFBD> <EFBFBD> ض<EFBFBD> <D8B6> <EFBFBD> <EFBFBD> <EFBFBD> IC)**
// <20> <> <EFBFBD> <EFBFBD> ע<EFBFBD> <D7A2> д<EFBFBD> <D0B4> <EFBFBD> <EFBFBD> set VPP 9V<39> <56>
// 0x30: ~7.4V, 0x31: ~8.0V, 0x32: ~8.4V, 0x33: ~9.0V
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ<EFBFBD> <C4BB> ʾ <EFBFBD> ԱȶȲ<C8B6> <C8B2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̫<EFBFBD> <CCAB> <EFBFBD> <EFBFBD> <EFBFBD> ɳ<EFBFBD> <C9B3> <EFBFBD> <EFBFBD> <CEA2> (0x30~0x33)<29> <>
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ߵ <EFBFBD> ѹ<EFBFBD> <D1B9> <EFBFBD> <EFBFBD> Ӱ<EFBFBD> <D3B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ο <EFBFBD> <CEBF> ĵ<EFBFBD> <C4B5> Ƽ <EFBFBD> ֵ<EFBFBD> <D6B5>
OLED_WR_Byte ( 0xC8 , OLED_CMD ) ; // **[0xC0/0xC8] COM <20> <> <EFBFBD> <EFBFBD> ɨ<EFBFBD> 跽<EFBFBD> <E8B7BD> **
// 0xC0: <20> <> <EFBFBD> <EFBFBD> ģʽ (<28> <> COM0ɨ<30> <C9A8> COM[N])
// 0xC8: <20> <> ӳ<EFBFBD> <D3B3> ģʽ (<28> <> COM[N]ɨ<> <C9A8> COM0<4D> <30> <EFBFBD> <EFBFBD> ֱ<EFBFBD> <D6B1> ת)
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ<EFBFBD> <C4BB> ʾ <EFBFBD> <CABE> <EFBFBD> µߵ <C2B5> <DFB5> ˣ<EFBFBD> <CBA3> <EFBFBD> <EFBFBD> <EFBFBD> 0xC0<43> <30>
OLED_WR_Byte ( 0xD3 , OLED_CMD ) ; // **˫<> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ ƫ<CABE> <C6AB> **
OLED_WR_Byte ( 0x00 , OLED_CMD ) ; // ƫ<> <C6AB> ֵ<EFBFBD> <D6B5> 0x00
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> ڴ<EFBFBD> ֱƽ <D6B1> <C6BD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> Χ 0x00~0x3F<33> <46>
OLED_WR_Byte ( 0xD5 , OLED_CMD ) ; // **˫<> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> <EFBFBD> <EFBFBD> ʱ<EFBFBD> ӷ<EFBFBD> Ƶ**
OLED_WR_Byte ( 0x80 , OLED_CMD ) ; // <20> <> 4λ<34> <CEBB> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> <C6B5> <EFBFBD> ӣ<EFBFBD> <D3A3> <EFBFBD> 4λ<34> <CEBB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> ʡ<EFBFBD>
// ֵ 0x80 <20> <> ʾ <EFBFBD> <CABE> Ƶ<EFBFBD> <C6B5> Ϊ 1<> <31>
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> ʿ<EFBFBD> <CABF> <EFBFBD> <EFBFBD> <EFBFBD> ˢ<EFBFBD> <CBA2> <EFBFBD> ʣ<EFBFBD> <CAA3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ܵ<EFBFBD> <DCB5> <EFBFBD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> Ȼ<C8BB> <F2B9A6BA> <EFBFBD> <EFBFBD> ӡ<EFBFBD>
OLED_WR_Byte ( 0xD9 , OLED_CMD ) ; // **˫<> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> <EFBFBD> <EFBFBD> Ԥ<EFBFBD> <D4A4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> **
OLED_WR_Byte ( 0x1f , OLED_CMD ) ; // <20> <> 4λ<34> <CEBB> Phase 2; <20> <> 4λ<34> <CEBB> Phase 1<> <31>
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> Ӱ<EFBFBD> <D3B0> <EFBFBD> <EFBFBD> <EFBFBD> ص<EFBFBD> <D8B5> <EFBFBD> <EFBFBD> ij<EFBFBD> <C4B3> <EFBFBD> ʱ<EFBFBD> 䡣<EFBFBD> <E4A1A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> Ӱ<EFBFBD> <D3B0> <EFBFBD> <EFBFBD> <EFBFBD> Ȳ<EFBFBD> <C8B2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <CEA2> <EFBFBD> <EFBFBD>
// <20> ĵ<EFBFBD> <C4B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> 볣<EFBFBD> <EBB3A3> 0x22 <20> <> 0xF1<46> <31>
OLED_WR_Byte ( 0xDA , OLED_CMD ) ; // **˫<> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> <EFBFBD> <EFBFBD> COM <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> **
OLED_WR_Byte ( 0x12 , OLED_CMD ) ; // 0x12: Sequential COM pin config (<28> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 128x64)
// 0x02: Alternative COM pin config (<28> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 128x32)
// **[<5B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ]**<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ĻӲ<C4BB> <D3B2> <EFBFBD> ṹ<EFBFBD> <E1B9B9> <EFBFBD> <EFBFBD> <EFBFBD> ģ<EFBFBD> 128x64 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0x12<31> <32>
OLED_WR_Byte ( 0xdb , OLED_CMD ) ; // **˫<> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> <EFBFBD> <EFBFBD> VCOMH <20> <> ѹ<EFBFBD> <D1B9> <EFBFBD> <EFBFBD> **
OLED_WR_Byte ( 0x40 , OLED_CMD ) ; // 0x40: ~0.89 x VCC
// **[<5B> ɸ<EFBFBD> <C9B8> <EFBFBD> ]**<2A> <> Ӱ<EFBFBD> 조<EFBFBD> ڵ<EFBFBD> ƽ <EFBFBD> <C6BD> <EFBFBD> <EFBFBD> ѹ<EFBFBD> <D1B9> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> Ϳ <EFBFBD> <CDBF> ܵ<EFBFBD> <DCB5> ±<EFBFBD> <C2B1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڣ<EFBFBD> <DAA3> <EFBFBD> <EFBFBD> ң<EFBFBD> <D2A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ߿<EFBFBD> <DFBF> ܵ<EFBFBD> <DCB5> ¶Աȶ<D4B1> <C8B6> ½<EFBFBD> <C2BD> <EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> 0x20, 0x30, 0x40<34> <30>
// --- <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> ---
OLED_Clear ( ) ;
memset ( OLED_GRAM_Back , 0 , sizeof ( OLED_GRAM_Back ) ) ;
OLED_Refresh ( ) ;
OLED_WR_Byte ( 0xAF , OLED_CMD ) ; // **[0xAF] <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ **
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɺ<EFBFBD> <C9BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ļ<EFBFBD> <C4BB>
2026-03-20 21:16:58 +08:00
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
/**
* @ 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>
* @ param x1 : <EFBFBD> <EFBFBD> ʼ x <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* @ param y1 : <EFBFBD> <EFBFBD> ʼ y <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* @ param x2 : <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> x <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* @ param y2 : <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> y <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* @ note <EFBFBD> ˺ <EFBFBD> <EFBFBD> <EFBFBD> ֻ <EFBFBD> <EFBFBD> <EFBFBD> ڴ <EFBFBD> <EFBFBD> е <EFBFBD> OLED_GRAM <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֱ <EFBFBD> Ӳ <EFBFBD> <EFBFBD> <EFBFBD> Ӳ <EFBFBD> <EFBFBD>
*/
void OLED_FillArea ( u8 x1 , u8 y1 , u8 x2 , u8 y2 )
{
u8 x , y ;
for ( y = y1 ; y < y2 ; y + + )
{
for ( x = x1 ; x < x2 ; x + + )
{
OLED_DrawPoint ( x , y , 0 ) ; // <20> <EFBFBD> ǰ̨<C7B0> <CCA8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
}
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> ɫ<EFBFBD> <C9AB> <EFBFBD> <EFBFBD> <EFBFBD> ڻ<EFBFBD> <DABB> Ƶ<EFBFBD> <C6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> x1,y1 <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> ; x2,y2 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (<28> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> x2,y2)
void OLED_FillRect ( u8 x1 , u8 y1 , u8 x2 , u8 y2 )
{
u8 x , y ;
for ( y = y1 ; y < y2 ; y + + )
{
for ( x = x1 ; x < x2 ; x + + )
{
OLED_DrawPoint ( x , y , 0 ) ; // mode=1<> <31> <EFBFBD> <EFBFBD> <EFBFBD> ƺ<EFBFBD> ɫ<EFBFBD> <C9AB> <EFBFBD> <EFBFBD>
}
}
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> ɫ (mode=0 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɫ/<2F> <> <EFBFBD> <EFBFBD> )
void OLED_FillRect_White ( u8 x1 , u8 y1 , u8 x2 , u8 y2 )
{
u8 x , y ;
for ( y = y1 ; y < y2 ; y + + )
{
for ( x = x1 ; x < x2 ; x + + )
{
OLED_DrawPoint ( x , y , 1 ) ; // mode=0<> <30> <EFBFBD> <EFBFBD> <EFBFBD> ư<EFBFBD> ɫ<EFBFBD> <C9AB> <EFBFBD> <EFBFBD>
}
}
}