⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gui.c

📁 一个arm7实例
💻 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 + -