📄 gui.c
字号:
default : break;
}
}
void GUI_DispCEOL(void)
{
INT8U i;
for(i = PosX; i <= LCD_XSIZE-8; i += 8)
{
GUI_DispCharAt(' ', i, PosY);
}
}
/*
*****************************************************************************
* GUI_DispStringAt - 指定位置显示一个字符串
* 支持中英混合 当中英混合时英文字体强制为8x16 如果单单英文 按照设定字体
* @Param x0:X轴坐标
* @Param y0:Y轴坐标
* @Param s:字符串
*****************************************************************************
*/
//void GUI_DispStringAt(INT8U _CONST_ *s,INT8U x0,INT8U y0)
void GUI_DispStringAt(INT8U *s,INT8U x0,INT8U y0)
{
INT8U i;
INT16U temp;
if (NoXY == FALSE)//没有提供坐标,则使用系统坐标
{
x0 = PosX;
y0 = PosY;
}
if(x0>LCD_XSIZE)
x0=x0%LCD_XSIZE;
if(y0>LCD_YSIZE)
y0=y0%LCD_YSIZE;
i = 0;
while(s[i]!='\0')
{
if (s[i] < 0x80)
{//是ASCII
if(s[i] == '\n')
{
x0 = 0;
y0 += Char_YSIZE+2;
}
else
{
if ( x0 > LCD_XSIZE-Char_XSIZE )
{//换行
x0 = 0;
y0 += Char_YSIZE+2;
}
switch (GUITextMode)
{
case GUI_TEXTMODE_NORMAL :
GUI_Display_ASCII(s[i], x0, y0);
break;
case GUI_TEXTMODE_REVERSE :
GUI_Display_InvASCII(s[i], x0, y0);
break;
case GUI_TEXTMODE_UNDERLINE :
GUI_Display_ASCII_UnderLine(s[i], x0, y0);
break;
default :
break;
}
x0 += Char_XSIZE;
}
}
else
{//是中文
Char_YSIZE=En_6x12_YSIZE;//如果有中文,英文强制转换 6*12
if (x0 > LCD_XSIZE-Chinese_XSIZE)
{
x0 = 0;
y0 += Chinese_YSIZE+2;
}
temp=(INT16U)(s[i])*256+s[i+1];
GUI_Display_Chinese(temp,x0,y0);//中文
i++;
x0 += Chinese_XSIZE;
}
i++;
}
if(NoXY == FALSE)
{
PosX = x0;
PosY = y0;
}
}
/*
*****************************************************************************
* GUI_DispString - 在当前系统坐标下显示字符串
* 除了坐标不能指定外 功能跟GUI_DispStringAt一致
* @Param s:字符串
*****************************************************************************
*/
void GUI_DispString(INT8U *s)
{
NoXY = FALSE;
GUI_DispStringAt(s,PosX,PosY);
NoXY = TRUE;
}
#if GUI_DispStringLen_EN
void GUI_DispStringLen(INT8U *s, INT16U Len)
{
INT8U i;
INT16U temp;
i = 0;
while(s[i]!='\0')
{
if (i >= Len )
{
return;
}
if (s[i] < 0x80)
{//是ASCII
if(s[i] == '\n')
{
PosX = 0;
PosY +=Char_YSIZE+2;
}
else
{
if( PosX >= LCD_XSIZE )
{//换行
PosX = 0;
PosY +=Char_YSIZE+2;
}
switch (GUITextMode)
{
case GUI_TEXTMODE_NORMAL :
GUI_Display_ASCII(s[i], PosX, PosY);
break;
case GUI_TEXTMODE_REVERSE :
GUI_Display_InvASCII(s[i], PosX, PosY);
break;
case GUI_TEXTMODE_UNDERLINE :
GUI_Display_ASCII_UnderLine(s[i], PosX, PosY);
break;
default :
break;
}
PosX +=Char_XSIZE;
}
}
else
{//是中文
Char_YSIZE=En_6x12_YSIZE;//如果有中文,英文强制转换 8*16
if (PosX > LCD_XSIZE-16)
{
PosX = 0;
PosY +=Chinese_YSIZE+2;
//return;
}
temp=(INT16U)(s[i])*256+s[i+1];
GUI_Display_Chinese(temp,PosX,PosY);//中文
i++;
PosX +=Chinese_XSIZE;
}
i++;
}
}
#endif
void GUI_CursorOn(INT8U x, INT8U y)
{
LCD_Display_Locate(0xFF,x,y);
LCD_Display_Locate(0xFF,x,y+1);
}
void GUI_CursorOFF(INT8U x, INT8U y)
{
LCD_Display_Locate(0x00,x,y);
LCD_Display_Locate(0x00,x,y+1);
}
#if GUI_MATH_EN
/*
*****************************************************************************
* GUI_DispDecAt - 显示十进制数值
* DESCRIPTION: -
* 处理长度最多5个数字(因为U16--->65536)
* @Param v:显示的数据
* @Param x:X轴坐标
* @Param y:Y轴坐标 XY 均是起点位置坐标 也就是数值最高位的坐标
* @Param Len:指定的显示长度1--5内
* @Return :
*
*****************************************************************************
*/
void GUI_DispDecAt(INT16U v, INT16U x, INT16U y, INT8U Len)
{
INT8U i;
INT8U CharBuf[5];
INT8U HighByte;
HighByte = 0;
for(i = 0; i < 5; i++)
{
CharBuf[i] = (INT8U)(v%10);
v = v/10;
if(CharBuf[i])
{
HighByte = i;
}
}
//第0位无论如何也显示
i = 0;
GUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
for(i = 1; i < Len; i++)
{
if(CharBuf[i])
{
GUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
}
else if(i > HighByte)
{
GUI_DispCharAt(' ',x+((Len-1)-i)*Char_XSIZE,y);
}
}
}
/*
*****************************************************************************
* GUI_DispHexAt - 显示一个数据的十六进制值
* DESCRIPTION: -
* 最大长度4个
* @Param v:数据
* @Param x:X轴坐标
* @Param y:Y轴坐标 XY均是起点坐标 也就是数据最高字节坐标
* @Param Len:长度1--4
* @Return :
*
*****************************************************************************
*/
void GUI_DispHexAt(INT32U v, INT8U x, INT8U y, INT8U Len)
{
INT8U i;
INT8U HexData;
if(Len > 8)
{//限制范围
Len = 8;
}
for(i = 0; i < Len; i++)
{
HexData = v&0x0F;
v = v >>4;
if(HexData < 0x0A)
{
GUI_DispCharAt(HexData+'0',x+Char_XSIZE*(Len-1-i),y);
}
else
{
GUI_DispCharAt(HexData-0x0A+'A',x+Char_XSIZE*(Len-1-i),y);
}
}
}
// ---- 显示不带符号的整数 (数字 起始位置XY,显示长度) -----------------------------
void GUI_Display_Number(INT16U Number, INT8U X, INT8U Y, INT8U Lenth)
{
INT8U DispNum;
X = ( X + Lenth *En_6x12_XSIZE - En_6x12_XSIZE );
for(; Lenth>0; Lenth--)
{
DispNum =(INT8U)(Number%10) + '0';
GUI_Display_ASCII(DispNum, X, Y);
X -= En_6x12_XSIZE;
Number = Number / 10;
}
}
// ---- 显示带符号的整数 (数字 起始位置XY,显示长度) ---------------------------------
void GUI_Display_SignedNumber(int Number,INT8U X,INT16U Y,INT8U Lenth)
{
if(Number < 0)
{
GUI_Display_ASCII('-', X, Y);
GUI_Display_Number(-Number, X+En_6x12_XSIZE, Y, Lenth);
}
else
{
GUI_Display_ASCII(' ', X, Y);
GUI_Display_Number(Number, X+En_6x12_XSIZE, Y, Lenth);
}
}
// ---- 显示不带符号的小数 (数字 起始位置XY,整数位数,小数位数) ------------------------------
void GUI_Display_Decimal(INT32U Number, char X, INT16U Y, INT8U INT, INT8U DEC)
{
INT8U DispNum, Lenth;
//Y = Y +(( X + INT * 8 + DEC * 8 ) / 84) * 2;
X = ( X + ( INT + DEC ) *En_6x12_XSIZE);
// 显示小数部分
for(Lenth=DEC; Lenth>0; Lenth--)
{
DispNum = Number%10 + 0x30;
GUI_Display_ASCII(DispNum, X, Y);
//if (X < 8) {Y -= 2; X += 84;}
X -= En_6x12_XSIZE;
Number = Number / 10;
}
// 显示小数点
GUI_Display_ASCII('.', X, Y);
//if (X < 8) {Y -= 2; X += 84;}
X -= En_6x12_XSIZE;
// 显示整数部分
for(Lenth=INT; Lenth>0; Lenth--)
{
DispNum = Number%10 + 0x30;
GUI_Display_ASCII(DispNum, X, Y);
//if (X < 8) {Y -= 2; X += 84;}
X -= En_6x12_XSIZE;
Number = Number / 10;
}
}
// ---- 显示带符号的小数 (数字 起始位置XY,整数位数,小数位数) ------------------------------
void GUI_Display_SignedDecimal(long int Number, char X, INT16U Y, INT8U INT, INT8U DEC)
{
if(Number < 0)
{
GUI_Display_ASCII('-', X, Y);
GUI_Display_Decimal(-Number, X+En_6x12_XSIZE, Y, INT, DEC);
}
else
{
GUI_Display_ASCII(' ',X,Y);
GUI_Display_Decimal(Number, X+En_6x12_XSIZE, Y, INT, DEC);
}
}
#endif
/*
*****************************************************************************
* GUI_DispStringAtBar - 显示一个字符串在一个BAR中
* 可以设定对齐方式
* @Param s:字符串
* @Param x0:BAR起始X轴坐标
* @Param x1:BAR结束点的X轴坐标
* @Param y0:BAR的Y轴坐标
* @Param Mode:对齐方式 居中于BAR 左对齐BAR 右对齐BAR
*****************************************************************************
*/
#if GUI_DispStringAtBar_EN
//void GUI_DispStringAtBar(const INT8U *s,INT8U x0, INT8U y0, INT8U x1,INT8U Mode)
void GUI_DispStringAtBar(INT8U *s,INT8U x0, INT8U y0, INT8U x1,INT8U Mode)
{
INT8U ENCount;//英文统计
INT8U CNCount;//中文统计
INT8U XLen;
INT8U X;
INT8U Y;
INT8U i;
CNCount = 0;
ENCount = 0;
XLen = 0;
i = 0;
while(s[i]!='\0')
{//统计中英文个数
if (s[i] > 0x80) //是中文
{
CNCount ++;
i++;
}
else
{
ENCount++;
}
i++;
}
GUI_SetEnFont(En_6x12);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -