📄 gui.c
字号:
#include"config.h"
#include"gui.h"
#include"math.h"
uint8 GUIBuf[GUI_Y_MAX][GUI_X_MAX];
/* ASCII码对应的点阵数据表 */
uint8 const ASCII_TAB20[80] =
{
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9e, 0x00, 0x00,
0x00, 0x0e, 0x00, 0x0e, 0x00,
0x28, 0xfe, 0x28, 0xfe, 0x28,
0x48, 0x54, 0xfe, 0x54, 0x24,
0x46, 0x26, 0x10, 0xc8, 0xc4,
0x6c, 0x92, 0xaa, 0x44, 0xa0,
0x00, 0x0a, 0x06, 0x00, 0x00,
0x00, 0x38, 0x44, 0x82, 0x00,
0x00, 0x82, 0x44, 0x38, 0x00,
0x28, 0x10, 0x7c, 0x10, 0x28,
0x10, 0x10, 0x7c, 0x10, 0x10,
0x00, 0xa0, 0x60, 0x00, 0x00,
0x10, 0x10, 0x10, 0x10, 0x10,
0x00, 0xc0, 0xc0, 0x00, 0x00,
0x40, 0x20, 0x10, 0x08, 0x04
};
uint8 const ASCII_TAB30[80] =
{
0x7C, 0xA2, 0x92, 0x8A, 0x7C,
0x00, 0x84, 0xFE, 0x80, 0x00,
0x84, 0xC2, 0xA2, 0x92, 0x8C,
0x42, 0x82, 0x8A, 0x96, 0x62,
0x30, 0x28, 0x24, 0xFE, 0x20,
0x4E, 0x8A, 0x8A, 0x8A, 0x72,
0x78, 0x94, 0x92, 0x92, 0x60,
0x02, 0xE2, 0x12, 0x0A, 0x06,
0x6C, 0x92, 0x92, 0x92, 0x6C,
0x0C, 0x92, 0x92, 0x52, 0x3C,
0x00, 0x6C, 0x6C, 0x00, 0x00,
0x00, 0xAC, 0x6C, 0x00, 0x00,
0x10, 0x28, 0x44, 0x82, 0x00,
0x28, 0x28, 0x28, 0x28, 0x28,
0x00, 0x82, 0x44, 0x28, 0x10,
0x04, 0x02, 0xA2, 0x12, 0x0C
};
uint8 const ASCII_TAB40[80] =
{
0x64, 0x92, 0xF2, 0x82, 0x7C,
0xFC, 0x22, 0x22, 0x22, 0xFC,
0xFE, 0x92, 0x92, 0x92, 0x6C,
0x7C, 0x82, 0x82, 0x82, 0x44,
0xFE, 0x82, 0x82, 0x44, 0x38,
0xFE, 0x92, 0x92, 0x92, 0x82,
0xFE, 0x12, 0x12, 0x12, 0x02,
0x7C, 0x82, 0x92, 0x92, 0xF4,
0xFE, 0x10, 0x10, 0x10, 0xFE,
0x00, 0x82, 0xFE, 0x82, 0x00,
0x40, 0x80, 0x82, 0x7E, 0x02,
0xFE, 0x10, 0x28, 0x44, 0x82,
0xFE, 0x80, 0x80, 0x80, 0x80,
0xFE, 0x04, 0x18, 0x04, 0xFE,
0xFE, 0x08, 0x10, 0x20, 0xFE,
0x7C, 0x82, 0x82, 0x82, 0x7C
};
uint8 const ASCII_TAB50[80] =
{
0xFE, 0x12, 0x12, 0x12, 0x0C,
0x7C, 0x82, 0xA2, 0x42, 0xBC,
0xFE, 0x12, 0x32, 0x52, 0x8C,
0x8C, 0x92, 0x92, 0x92, 0x62,
0x02, 0x02, 0xFE, 0x02, 0x02,
0x7E, 0x80, 0x80, 0x80, 0x7E,
0x3E, 0x40, 0x80, 0x40, 0x3E,
0x7E, 0x80, 0x70, 0x80, 0x7E,
0xC6, 0x28, 0x10, 0x28, 0xC6,
0x0E, 0x10, 0xE0, 0x10, 0x0E,
0xC2, 0xA2, 0x92, 0x8A, 0x86,
0x00, 0xFE, 0x82, 0x82, 0x00,
0x04, 0x08, 0x10, 0x20, 0x40,
0x00, 0x82, 0x82, 0xFE, 0x00,
0x08, 0x04, 0x02, 0x04, 0x08,
0x80, 0x80, 0x80, 0x80, 0x80
};
uint8 const ASCII_TAB60[80] =
{
0x00, 0x02, 0x04, 0x08, 0x00,
0x40, 0xA8, 0xA8, 0xA8, 0xF0,
0xFE, 0x90, 0x88, 0x88, 0x70,
0x70, 0x88, 0x88, 0x88, 0x40,
0x70, 0x88, 0x88, 0x90, 0xFE,
0x70, 0xA8, 0xA8, 0xA8, 0x30,
0x10, 0xFC, 0x12, 0x02, 0x04,
0x18, 0xA4, 0xA4, 0xA4, 0x7C,
0xFE, 0x10, 0x08, 0x08, 0xF0,
0x00, 0x88, 0xFA, 0x80, 0x00,
0x40, 0x80, 0x88, 0x7A, 0x00,
0xFE, 0x20, 0x50, 0x88, 0x00,
0x00, 0x82, 0xFE, 0x80, 0x00,
0xF8, 0x08, 0x30, 0x08, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0xF0,
0x70, 0x88, 0x88, 0x88, 0x70
};
uint8 const ASCII_TAB70[80] =
{
0xF8, 0x28, 0x28, 0x28, 0x10,
0x10, 0x28, 0x28, 0x30, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0x10,
0x90, 0xA8, 0xA8, 0xA8, 0x40,
0x08, 0x7E, 0x88, 0x80, 0x40,
0x78, 0x80, 0x80, 0x40, 0xF8,
0x38, 0x40, 0x80, 0x40, 0x38,
0x78, 0x80, 0x60, 0x80, 0x78,
0x88, 0x50, 0x20, 0x50, 0x88,
0x18, 0xA0, 0xA0, 0xA0, 0x78,
0x88, 0xC8, 0xA8, 0x98, 0x88,
0x00, 0x10, 0x6C, 0x82, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00,
0x00, 0x82, 0x6C, 0x10, 0x00,
0x10, 0x10, 0x54, 0x38, 0x10,
};
/******************************************************************************************
*函数:Line
*功能:画线
******************************************************************************************/
void Line(uint8 X_start,uint8 Y_start,uint8 X_end,uint8 Y_end,uint8 colour)
{
uint8 i,x,y;
x=X_start;
y=Y_start;
if((X_end-X_start)>0)
{
if((Y_end-Y_start)>0)
{
for(i=0;i<(X_end-X_start);i++)
{
GUIBuf[y][x]=colour;
x++;
y=(((Y_end-Y_start)*100/(X_end-X_start))*(x-X_start))/100+Y_start;
}
}
else if((Y_end-Y_start)<0)
{
for(i=0;i<(X_end-X_start);i++)
{
GUIBuf[y][x]=colour;
x++;
y=Y_start-(((Y_start-Y_end)*100/(X_end-X_start))*(x-X_start))/100;
}
}
else
{
for(i=0;i<(X_end-X_start);i++)
{
GUIBuf[y][x]=colour;
x++;
}
}
}
else if((X_end-X_start)<0)
{
if((Y_end-Y_start)>0)
{
for(i=0;i<(X_start-X_end);i++)
{
GUIBuf[y][x]=colour;
x--;
y=(((Y_end-Y_start)*100/(X_start-X_end))*(X_start-x))/100+Y_start;
}
}
else if((Y_end-Y_start)<0)
{
for(i=0;i<(X_start-X_end);i++)
{
GUIBuf[y][x]=colour;
x--;
y=Y_start-(((Y_start-Y_end)*100/(X_start-X_end))*(X_start-x))/100;
}
}
else
{
for(i=0;i<X_start-(X_end);i++)
{
GUIBuf[y][x]=colour;
x--;
}
}
}
else if((X_end-X_start)==0)
{
if((Y_end-Y_start)>0)
{
for(i=0;i<(Y_end-Y_start);i++)
{
GUIBuf[y][x]=colour;
y++;
}
}
else if((Y_end-Y_start)<0)
{
for(i=0;i<(Y_start-Y_end);i++)
{
GUIBuf[y][x]=colour;
y--;
}
}
else GUIBuf[y][x]=colour;
}
}
/******************************************************************************************
*函数:Circle
*功能:画园
******************************************************************************************/
void Circle(uint8 x,uint8 y,uint8 r,uint8 colour)
{
uint8 i,j;
for(i=0;i<r;i++)
{
j=sqrt((r*r-i*i)*10000)/100;
GUIBuf[y+i][x+j]=colour;
GUIBuf[y+i][x-j]=colour;
GUIBuf[y-i][x+j]=colour;
GUIBuf[y-i][x-j]=colour;
}
}
/******************************************************************************************
*函数:Sqrt
*功能:画矩形
******************************************************************************************/
void Sqrt(uint8 x,uint8 y,uint8 xlen,uint8 ylen,uint8 colour)
{
Line(x,y,(x+xlen),y,colour);
Line(x,y,x,(y+ylen),colour);
Line((x+xlen),(y+ylen),(x+xlen),y,colour);
Line((x+xlen),(y+ylen),x,(y+ylen),colour);
}
/******************************************************************************************
*函数:GUIClr
*功能:清屏
******************************************************************************************/
void GUIClr(void)
{
uint8 x,y;
for(x=0;x<GUI_X_MAX;x++)
{
for(y=0;y<GUI_Y_MAX;y++)
{
GUIBuf[y][x]=0x00;
}
}
}
/******************************************************************************************
*函数: FullSqrt
*功能:填充矩形区域
******************************************************************************************/
void FullSqrt(uint8 x,uint8 y,uint8 xlen,uint8 ylen,uint8 colour)
{
uint8 i;
for(i=0;i<ylen;i++)
{
Line(x,(y+i),(x+xlen),(y+i),colour);
}
}
/******************************************************************************************
*函数: FullSqrt
*功能:填充矩形区域
******************************************************************************************/
void Command(uint8 x,uint8 y,uint8 xlen,uint8 ylen,uint8 colour)
{
Sqrt(x,y,xlen,ylen,colour);
FullSqrt(x,y,xlen,ylen/4,colour);
Sqrt((x+xlen/9),(y+(ylen/4)*2),(xlen/9)*3,(ylen/4)*1,colour);
Sqrt((x+xlen-(xlen/9)*4),(y+(ylen/4)*2),(xlen/9)*3,(ylen/4)*1,colour);
}
/******************************************************************************************
*函数:GUIDisText
*功能:数据显示
******************************************************************************************/
void GUIDis(uint8 addrx,uint8 addry,uint8 *data,uint8 n,uint8 colour,uint8 bcolour)
{
uint8 i,j;
for(i=0;i<n;i++)
{
for(j=0;j<8;j++)
{
if((((*data)>>j)&0x01)==0)GUIBuf[addry+j][addrx+i]=bcolour;
else GUIBuf[addry+j][addrx+i]=colour;
}
data++;
}
}
void GUIDis24(uint8 addrx,uint8 addry,uint8 *data,uint8 n,uint8 colour,uint8 bcolour)
{
GUIDis(addrx,addry,data,n,colour,bcolour);
GUIDis(addrx,addry+8,data+n,n,colour,bcolour);
GUIDis(addrx,addry+16,data+2*n,n,colour,bcolour);
}
void GUIDis32(uint8 addrx,uint8 addry,uint8 *data,uint8 n,uint8 colour,uint8 bcolour)
{
GUIDis(addrx,addry,data,n,colour,bcolour);
GUIDis(addrx,addry+8,data+n,n,colour,bcolour);
GUIDis(addrx,addry+16,data+2*n,n,colour,bcolour);
GUIDis(addrx,addry+24,data+3*n,n,colour,bcolour);
}
/******************************************************************************************
*函数:GUIDisText
*功能:显示文字
******************************************************************************************/
void GUIDisText(uint8 addrx,uint8 addry,uint8 dispdata,uint8 colour)
{
uint8 const *pchardata;
switch(dispdata&0xf0)
{
case 0x20:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB20[dispdata];
break;
case 0x30:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB30[dispdata];
break;
case 0x40:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB40[dispdata];
break;
case 0x50:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB50[dispdata];
break;
case 0x60:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB60[dispdata];
break;
case 0x70:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB70[dispdata];
break;
default:
pchardata = &ASCII_TAB20[0];
break;
}
GUIDis(addrx,addry,pchardata,5,colour,0);
}
/******************************************************************************************
*函数:GUIDisText
*功能:显示字符串
******************************************************************************************/
void GUIDisStr(uint8 x,uint8 y,uint8 *string,uint8 colour)
{
while(1)
{
if(*string=='\0')break;
GUIDisText(x,y,*string++,colour);
x+=5;
if(x>(GUI_X_MAX-1))
{
x=0;
y+=8;
}
}
}
/******************************************************************************************
*函数:GUIPrintf
*功能:格式输出
******************************************************************************************/
void GUIPrintf(uint8 addrx,uint8 addry,uint8 colour,char *fmt,...)
{
va_list ap;
static char string[64];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
GUIDisStr(addrx,addry,string,colour);
va_end(ap);
}
/******************************************************************************************
*函数:GUILineXMov
*入口参数:y:要移动的行
x1,x2:要移动的行的起始和结束列坐标,注意:x1>x2时右移
movnum:要移动的次数
*出口参数:无
*功能:行移动
******************************************************************************************/
void GUILineXMov(uint8 y,uint8 x1,uint8 x2,uint8 movnum,uint8 mode)
{
uint8 i,j;
if(x1>x2)
{
for(;movnum>0;movnum--)
{
i=GUIBuf[y][x1];
for(j=0;j<(x1-x2);j++)GUIBuf[y][x1-j]=GUIBuf[y][x1-j-1];
if(mode==0)GUIBuf[y][x2]=0;
else GUIBuf[y][x2]=i;
}
}
if(x1<x2)
{
for(;movnum>0;movnum--)
{
i=GUIBuf[y][x1];
for(j=0;j<(x2-x1);j++)
GUIBuf[y][x1+j]=GUIBuf[y][x1+j+1];
if(mode==0)GUIBuf[y][x2]=0;
else GUIBuf[y][x2]=i;
}
}
}
/******************************************************************************************
*函数:GUIXMov
*入口参数:y1,y2:要移动的起始行和结束行
x1,x2:要移动的行的起始和结束列坐标,注意:x1>x2时右移
movnum:要移动的次数
*出口参数:无
*功能:多行移动
******************************************************************************************/
void GUIXMov(uint8 Y1,uint8 Y2,uint8 x1,uint8 x2,uint8 movnum,uint8 mode)
{
uint8 i;
if((Y1-Y2)>0)
{
i=Y1-Y2;
for(;i>0;i--) GUILineXMov(Y2+i,x1,x2,movnum,mode);
}
else if((Y1-Y2)<0)
{
i=Y2-Y1;
for(;i>0;i--) GUILineXMov(Y2-i,x1,x2,movnum,mode);
}
}
/******************************************************************************************
*函数:GUILineYMov
*入口参数:y:要移动的列
x1,x2:要移动的列的起始和结束行坐标,注意:x1>x2时下移
movnum:要移动的次数
*出口参数:无
*功能:列移动
******************************************************************************************/
void GUILineYMov(uint8 y,uint8 x1,uint8 x2,uint8 movnum,uint8 mode)
{
uint8 i,j;
if(x1>x2)
{
for(;movnum>0;movnum--)
{
i=GUIBuf[x1][y];
for(j=0;j<(x1-x2);j++)GUIBuf[x1-j][y]=GUIBuf[x1-j-1][y];
if(mode==0) GUIBuf[x2][y]=0;
else GUIBuf[x2][y]=i;
}
}
if(x1<x2)
{
for(;movnum>0;movnum--)
{
i=GUIBuf[x1][y];
for(j=0;j<(x2-x1);j++)
GUIBuf[x1+j][y]=GUIBuf[x1+j+1][y];
if(mode==0) GUIBuf[x2][y]=0;
else GUIBuf[x2][y]=i;
}
}
}
/******************************************************************************************
*函数:GUIYMov
*入口参数:y1,y2:要移动的起始列和结束列
x1,x2:要移动的列的起始和结束行坐标,注意:x1>x2时下移
movnum:要移动的次数
*出口参数:无
*功能:多列移动
******************************************************************************************/
void GUIYMov(uint8 Y1,uint8 Y2,uint8 x1,uint8 x2,uint8 movnum,uint8 mode)
{
uint8 i;
if((Y1-Y2)>0)
{
i=Y1-Y2;
for(;i>0;i--) GUILineYMov(Y2+i,x1,x2,movnum,mode);
}
else if((Y1-Y2)<0)
{
i=Y2-Y1;
for(;i>0;i--) GUILineYMov(Y2-i,x1,x2,movnum,mode);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -