📄 gui.c
字号:
#include "SYS_Config.h"
#include "GUI_Config.h"
#include "GUI.h"
//包含液晶底层驱动函数
#include "LcdDrive.h"
#include "Chinese.h"
#include "ASCII.h"
/*-------------------------------------------------------------------------
GUI相关全局变量
-------------------------------------------------------------------------*/
INT8U GUITextMode = GUI_TEXTMODE_NORMAL; //显示模式
INT8U GUIEnglishFont = En_6x12; //英文字体
INT8U Char_XSIZE=6; //英文字体X宽度 不能大于8
INT8U Char_YSIZE=12; //英文字体Y宽度 不能大于16
INT8U GUIChineseFont=Chinese_12x12;
INT8U Chinese_XSIZE=12;//中文字体x宽度
INT8U Chinese_YSIZE=12;//中文字体y宽度
INT8U PosX = 0; //当前系统X坐标
INT8U PosY = 0; //当前系统Y坐标
INT8U NoXY = TRUE; //是否使用PosX PosY的标志
//1-->不使用
//0-->使用
void GUI_Init(void)
{
LCD_Init();
GUI_Clear();
GUITextMode = GUI_TEXTMODE_NORMAL;
GUIEnglishFont = En_6x12;
Char_XSIZE = En_6x12_XSIZE;
Char_YSIZE = En_6x12_YSIZE;
GUIChineseFont=Chinese_12x12;
Chinese_XSIZE=Chinese_12x12_XSIZE;//中文字体x宽度
Chinese_YSIZE=Chinese_12x12_YSIZE;//中文字体y宽度
PosX = 0;
PosY = 0;
NoXY = TRUE;
}
void GUI_Clear(void)
{
LCD_ClearScreen();
}
void GUI_Delay(INT16U Period)
{
INT16U i;
while(Period--)
{
for(i=0;i<400;i++)
;
}
}
void GUI_GotoX(INT8U x)
{
if (x >= LCD_XSIZE)
PosX =LCD_XSIZE;
else
PosX = x;
}
void GUI_GotoY(INT8U y)
{
if (y >=LCD_YSIZE)
PosY = LCD_YSIZE;
else
PosY = y;
}
void GUI_GotoXY(INT8U x,INT8U y)
{
GUI_GotoX(x);
GUI_GotoY(y);
}
/*
*****************************************************************************
* GUI_SetTextMode - 设置文字显示模式
* @Param TextMode:模式代码
* @Return :模式代码
*****************************************************************************
*/
INT8U GUI_SetTextMode(INT8U TextMode)
{
GUITextMode = TextMode;
return GUITextMode;
}
/*****************************************************************************
* GUI_SetEnFont - 设置显示的英文字体
* DESCRIPTION: -
* 目前支持两种字体8x16 5x8
* @Param EnFont:字体代码
*****************************************************************************/
void GUI_SetEnFont(INT8U EnFont)
{
if (EnFont == En_5x8)
{
GUIEnglishFont = En_5x8;
Char_XSIZE = En_5x8_XSIZE;
Char_YSIZE = En_5x8_YSIZE;
}
else
{
GUIEnglishFont = En_6x12;
Char_XSIZE = En_6x12_XSIZE;
Char_YSIZE = En_6x12_YSIZE;
}
}
/****************************************************************************
* Display_ASCII - 显示一个ASCII
* @Param X:X轴坐标 0--128 (注意边界)
* @Param Y:Y轴坐标 0-- 7 (注意边界)
* @Param Char:ASCII码
******************************************************************************/
void GUI_Display_ASCII(INT8U Char, INT8U X, INT8U Y)
{
INT8U i, ImgData;
INT16U temp;
INT8U HZ_X;
if(X>=LCD_XSIZE)
X=X%LCD_XSIZE;
if(Y>=LCD_YSIZE)
Y=Y%LCD_YSIZE;
HZ_X = X;
if(GUIEnglishFont == En_5x8)
{
for(i = 0; i < En_5x8_XSIZE; i++)
{
temp=i+(INT16U)(Char-0x20)*5; //要注意数据范围
ImgData = chardot_5x8[temp];
LCD_Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
}
else
{
for(i=0;i<En_6x12_XSIZE;i++)
{
temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
ImgData = chardot_6x12[temp];
LCD_Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
HZ_X=X;
for(i=En_6x12_XSIZE;i<2*En_6x12_XSIZE;i++)
{
temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
ImgData = chardot_6x12[temp];
LCD_Display_Locate(ImgData, HZ_X, Y + 8);
HZ_X++;
}
}
}
/*****************************************************************************
* Display_InvASCII - 反显示ASCII
* @Param X:X轴坐标 0--191
* @Param Y:Y轴坐标 0--7
* @Param Char:ASCII码
*****************************************************************************/
void GUI_Display_InvASCII(INT8U Char, INT8U X, INT8U Y)
{
INT8U i, ImgData;
INT16U temp;
INT8U HZ_X;
if(X>=LCD_XSIZE)
X=X%LCD_XSIZE;
if(Y>=LCD_YSIZE)
Y=Y%LCD_YSIZE;
HZ_X = X;
if(GUIEnglishFont == En_5x8)
{
for(i = 0; i < En_5x8_XSIZE; i++)
{
temp=i+(INT16U)(Char-0x20)*5; //要注意数据范围
ImgData = chardot_5x8[temp]^0xFF;
LCD_Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
}
else
{
for(i=0;i<En_6x12_XSIZE;i++)
{
temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
ImgData = chardot_6x12[temp]^0xFF;
LCD_Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
HZ_X=X;
for(i=En_6x12_XSIZE;i<2*En_6x12_XSIZE;i++)
{
temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
ImgData = chardot_6x12[temp]^0x3F;//总共12行
LCD_Display_Locate(ImgData, HZ_X, Y + 8);
HZ_X++;
}
}
}
/*****************************************************************************
* Display_ASCII_UnderLine - 显示一个带有下划线的ASCII
* @Param X:X轴坐标
* @Param Y:Y轴坐标
* @Param Char:ASCII码
******************************************************************************/
void GUI_Display_ASCII_UnderLine(INT8U Char, INT8U X, INT8U Y)
{
INT8U i, ImgData;
INT16U temp;
INT8U HZ_X;
if(X>=LCD_XSIZE)
X=X%LCD_XSIZE;
if(Y>=LCD_YSIZE)
Y=Y%LCD_YSIZE;
HZ_X = X;
if(GUIEnglishFont == En_5x8)
{
for(i = 0; i < En_5x8_XSIZE; i++)
{
temp=i+(INT16U)(Char-0x20)*5; //要注意数据范围
ImgData = chardot_5x8[temp]|0x80;
LCD_Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
}
else
{
for(i=0;i<En_6x12_XSIZE;i++)
{
temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
ImgData = chardot_6x12[temp];
LCD_Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
HZ_X=X;
for(i=En_6x12_XSIZE;i<2*En_6x12_XSIZE;i++)
{
temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
ImgData = chardot_6x12[temp]|0x20;
LCD_Display_Locate(ImgData, HZ_X, Y + 8);
HZ_X++;
}
}
}
void GUI_DispCharAt(INT8U c, INT8U x, INT8U y)
{
switch (GUITextMode)
{
case GUI_TEXTMODE_NORMAL :
GUI_Display_ASCII(c, x, y);
break;
case GUI_TEXTMODE_REVERSE :
GUI_Display_InvASCII(c, x, y);
break;
case GUI_TEXTMODE_UNDERLINE :
GUI_Display_ASCII_UnderLine(c, x, y);
break;
default :
break;
}
}
#if GUI_DispChar_EN
void GUI_DispChar(INT8U c)
{
GUI_DispCharAt(c, PosX, PosY);
PosX += 8;
}
#endif
/*
*****************************************************************************
* GUI_Display_Chinese - 指定位置显示一个16x16的汉字
* @Param x0:X轴坐标0--(192-16)
* @Param y0:Y轴坐标0--(8-2)
* @Param UniCode:汉字内码
*****************************************************************************/
void GUI_Display_Chinese(INT16U UniCode, INT8U x0, INT8U y0) //
{
INT16U CodeID;
INT8U i,ImgData;
INT8U HZ_X;
if(x0>=LCD_XSIZE)
x0=x0%LCD_XSIZE;
if(y0>=LCD_YSIZE)
y0=y0%LCD_YSIZE;
HZ_X = x0;
//在字库里搜索汉字
for(CodeID=0; CodeID < hzNum; CodeID++)
{
// 找到 指定汉字的 Index 后, 跳出循环
if( (GB_12[CodeID].Index[0]==UniCode/256) && (GB_12[CodeID].Index[1]==UniCode%256) )
{
break;
}
else if(CodeID == (hzNum-1))
{//未检索到的汉字,显示个"##"提示吧
GUI_DispCharAt('#',x0,y0);
GUI_DispCharAt('#',x0+Char_XSIZE,y0);
return;
}
}
//----------------------------------
switch (GUITextMode)
{
case GUI_TEXTMODE_NORMAL :
// 写汉字的上半部分 (一个汉字 32 个字节, 显示为2行 * 16列)
for(i=0; i<Chinese_XSIZE; i++)
{
ImgData = GB_12[CodeID].Msk[i];
LCD_Display_Locate(ImgData, HZ_X, y0);
HZ_X++;
}
// 写汉字的下半部分
HZ_X = x0;
for(i=Chinese_XSIZE; i<2*Chinese_XSIZE; i++)
{
ImgData = GB_12[CodeID].Msk[i];
LCD_Display_Locate(ImgData, HZ_X, y0 + 8);
HZ_X++;
}
break;
//-----------------------------------------------------------------
case GUI_TEXTMODE_REVERSE :
// 写汉字的上半部分 (一个汉字 32 个字节, 显示为2行 * 16列)
for(i=0; i<Chinese_XSIZE; i++)
{
ImgData = GB_12[CodeID].Msk[i]^0xFF;
LCD_Display_Locate(ImgData, HZ_X, y0);
HZ_X++;
}
// 写汉字的下半部分
HZ_X = x0;
for(i=Chinese_XSIZE; i<2*Chinese_XSIZE; i++)
{
ImgData = GB_12[CodeID].Msk[i]^0x3F;//总共12行
LCD_Display_Locate(ImgData, HZ_X, y0 + 8);
HZ_X++;
}
break;
//-------------------------------------------------------------------------
case GUI_TEXTMODE_UNDERLINE :
// 写汉字的上半部分 (一个汉字 32 个字节, 显示为2行 * 16列)
for(i=0; i<Chinese_XSIZE; i++)
{
ImgData = GB_12[CodeID].Msk[i];
LCD_Display_Locate(ImgData, HZ_X, y0);
HZ_X++;
}
// 写汉字的下半部分
HZ_X = x0;
for(i=Chinese_XSIZE; i<2*Chinese_XSIZE; i++)
{
ImgData = GB_12[CodeID].Msk[i]|0x20;
LCD_Display_Locate(ImgData, HZ_X, y0 + 8);
HZ_X++;
}
break;
//-------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -