/***************************************** 
名称:Draw_circle (在任意位置画圆) 
说明:使用Bresenham法画1/8个圆,在用对称性画出其他的7/8个圆  
   	 在32板上还没调好

    按下图把圆分为8份 
        0 
      7   1 
    6       2 
      5   3 
        4  
*****************************************/ 
void Draw_circle(u8 x0,u8 y0,u8 r) 
{ 
s16 a,b; 													   ///////////////////////////////////
s16 di; 
a=0; 
b=r; 
di=3-2*r;             //判断下个点位置的标志 
while(a<=b) 
{ 
  GUI_Point(x0-b,y0-a,1);           //3            
  GUI_Point(x0+b,y0-a,1);           //0            
  GUI_Point(x0-a,y0+b,1);           //1      
  GUI_Point(x0-b,y0-a,1);           //7            
  GUI_Point(x0-a,y0-b,1);           //2            
  GUI_Point(x0+b,y0+a,1);           //4                
  GUI_Point(x0+a,y0-b,1);           //5 
  GUI_Point(x0+a,y0+b,1);           //6  
  GUI_Point(x0-b,y0+a,1);            
  a++; 
  /***使用Bresenham算法画圆**/    
  if(di<0) 
  di +=4*a+6; 
  else 
  { 
  di +=10+4*(a-b);    
  b--; 
  }  
  GUI_Point(x0+a,y0+b,1); 
  } 
}
Ejemplo n.º 2
0
void GUI_Circle(u16 x0,u16 y0,u8 r,u16 color)
{
	int a,b;
	int di;
	a=0;b=r;	  
	di=3-(r<<1);             //判断下个点位置的标志
	while(a<=b)
	{
		GUI_Point(x0-b,y0-a,color);             //3           
		GUI_Point(x0+b,y0-a,color);             //0           
		GUI_Point(x0-a,y0+b,color);             //1       
		GUI_Point(x0-b,y0-a,color);             //7           
		GUI_Point(x0-a,y0-b,color);             //2             
		GUI_Point(x0+b,y0+a,color);             //4               
		GUI_Point(x0+a,y0-b,color);             //5
		GUI_Point(x0+a,y0+b,color);             //6 
		GUI_Point(x0-b,y0+a,color);             
		a++;
		//使用Bresenham算法画圆     
		if(di<0)di +=a*4+6;	  
		else
		{
			di+=10+4*(a-b);   
			b--;
		} 
		GUI_Point(x0+a,y0+b,color);
	}
} 
Ejemplo n.º 3
0
/****************************************************************************
* 名称:GUI_PutChar24_32()
* 功能:显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及':'(若为其它值,则显示' ')。
* 入口参数: x		指定显示位置,x坐标
*           y		指定显示位置,y坐标
*           ch		要显示的ASCII码值。
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
uint8  GUI_PutChar24_32(uint32 x, uint32 y, uint8 ch)
{  uint8   font_dat;
   uint8   i, j;
   TCOLOR  bakc;

   /* 参数过滤 */
   if( x>(GUI_LCM_XMAX-32) ) return(0);
   if( y>(GUI_LCM_YMAX-32) ) return(0);
   for(i=0; i<14; i++)
   {  if(FONT24x32_TAB[i]==ch) break;
   }
   ch = i;
    
   for(i=0; i<32; i++)						// 显示共32行
   {  for(j=0; j<24; j++)					// 每行共24点
      {  /* 若当前点为0、8、16点,读取点阵数据 */
         if( (j&0x07)==0 ) font_dat = FONT24x32[ch][i*3+j>>3];      
         /* 设置相应的点为color或为back_color */
         if( (font_dat&DCB2HEX_TAB[j])==0 ) GUI_CopyColor(&bakc, back_color);
            else  GUI_CopyColor(&bakc, disp_color);
         GUI_Point(x, y, bakc);       
         x++;
      }
      
      y++;									// 指向下一行
      x -= 24;								// 恢复x值
   }
   
   return(1);
}
Ejemplo n.º 4
0
/****************************************************************************
* 名称:GUI_PutChar()
* 功能:显示ASCII码,显示值为20H-7FH(若为其它值,则显示' ')。
* 入口参数: x		指定显示位置,x坐标
*           y		指定显示位置,y坐标
*           ch		要显示的ASCII码值。
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出有效范围。(显示格式为6*8)
****************************************************************************/
uint8  GUI_PutChar(uint32 x, uint32 y, uint8 ch)
{  uint8   font_dat;
   uint8   i, j;
   TCOLOR  bakc;

   /* 参数过滤 */
   if( x>=(GUI_LCM_XMAX-8) ) return(0);
   if( y>=(GUI_LCM_YMAX-8) ) return(0);
   if( (ch<0x20) || (ch>0x7f) ) ch = 0x20;
   
   ch -= 0x20; 
   for(i=0; i<8; i++)
   {  /* 读取点阵数据 */
      font_dat = FONT5x7ASCII[ch][i];
      
      for(j=0; j<6; j++)
      {  /* 设置相应的点为color或为back_color */
         if( (font_dat&DCB2HEX_TAB[j])==0 ) GUI_CopyColor(&bakc, back_color);
            else  GUI_CopyColor(&bakc, disp_color);
         GUI_Point(x, y, bakc);       
         x++;
      }
      
      y++;									// 指向下一行
      x -= 6;								// 恢复x值
   }
   
   return(1);
}
Ejemplo n.º 5
0
/**
  * @brief  .
  * @param  None.
  * @retval None.
  * @verify .
  */
void GUI_HLine (int16_t x0, int16_t y0, int16_t x1, TCOLOR color)
{
	int16_t  bak;
	if(x0>x1){
		bak = x1;
		x1 = x0;
		x0 = bak;
	}
	if(x0==x1){
		GUI_Point(x0, y0, color);
		return;
	}
	do{
		GUI_Point(x0, y0, color);
		x0++;
	}while(x1>x0);
	GUI_Point(x0, y0, color);
}
Ejemplo n.º 6
0
/**
  * @brief  .
  * @param  None.
  * @retval None.
  * @verify .
  */
void GUI_RLine (int16_t x0, int16_t y0, int16_t y1, TCOLOR color)
{
	int16_t  bak;
	if(y0>y1){
		bak = y1;
		y1 = y0;
		y0 = bak;
	}
	if(y0==y1){
		GUI_Point(x0, y0, color);
		return;
	}
	do{
		GUI_Point(x0, y0, color);
		y0++;
	}while(y1>y0);
	GUI_Point(x0, y0, color);
}
Ejemplo n.º 7
0
void guiCleanLine(int y)
{
    int x, z;
    if((y + 8) <= GUI_LCM_YMAX)

        for(x = 0; x < GUI_LCM_XMAX; x++)
            for(z = y; z < (y + 8); z++)
                GUI_Point(x, z, SCREEN_CLEAN_COLOR);
}
Ejemplo n.º 8
0
/**
  * @brief  显示数组图片
  * 		格式:前两个是宽(0)和高(1).
  * 		0:背景色
  * 		1:前景色
  * 		从上倒下绘图
  * @param  None.
  * @retval None.
  * @verify .
  */
void  GUI_LoadCharStr(uint32_t x, uint32_t y, uint8_t *dat)
{
	uint32_t i=2;
	PointXY coor;
	coor.y = y;
	coor.hight = dat[1];
	for(; coor.hight>0; coor.hight--){
		coor.with = dat[0];
		coor.x = x;
		for(; coor.with>0; coor.with--){
			if(dat[i]){
				GUI_Point(coor.x, coor.y, disp_color);
			}else{
				GUI_Point(coor.x, coor.y, back_color);
			}
			i++;
			coor.x++;
		}
		coor.y++;
	}
}
Ejemplo n.º 9
0
void GUI_Clean()
{
    lcd_x = 0;
    lcd_y = 0;
    cur_area = 0;
    int x, y;

    for(y = 0; y < GUI_LCM_YMAX; y++)
        for(x = 0; x < GUI_LCM_XMAX; x++)
            GUI_Point(x, y, SCREEN_CLEAN_COLOR);
    //   GUI_LCDFill_COLOR(&LayerConfig[LAYER_DBGGUI_LAYER], GET_COLORKEY(DBGGUI_C_KEY_R, DBGGUI_C_KEY_G, DBGGUI_C_KEY_B));

}
Ejemplo n.º 10
0
void GUI_sprintf_char(u8 x, u16 y,u8 c, u16 color,u16 b_color,u8 mode)//行显示,高位在前
{  
	u8 s_x ,s_y, temp ;
	u16 j=(c-32)<< 4;			//获取数组首地址
	for( s_y=0 ; s_y < 16 ; s_y++ )
	{
		j ++;
		temp = font16x8[j];

		for( s_x=0 ; s_x<8 ; s_x++ )		
		{
			if(temp & (0x80>>s_x))
			{
				GUI_Point(x+s_x,y+s_y,color) ;
			}
			else if(mode)
			{
				GUI_Point(x+s_x, y+s_y,b_color) ;
			}
			
		}

	}
Ejemplo n.º 11
0
//==================================
void GUI_Line(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)  
{  
    u16 t;  
    int xerr=0,yerr=0,delta_x,delta_y,distance;  
    int incx,incy;  
    u16 row,col;  
    delta_x = x2-x1;//计算坐标增量  
    delta_y = y2-y1;  
    col=x1;  
    row=y1;  

    if(delta_x>0) incx=1;//设置单步方向  
    else   
    {  
        if(delta_x==0) incx=0;//垂直线  
        else {incx=-1;delta_x=-delta_x;}  
    }  

    if(delta_y>0)incy=1;  
    else  
    {  
        if(delta_y==0) incy=0;//水平线  
        else {incy=-1;delta_y=-delta_y;}  
    }  

    if(delta_x>delta_y) distance=delta_x;//选取基本增量坐标轴  
    else distance=delta_y;  

    for(t=0;t<=distance+1;t++)  
	{                                     //画线输出  
	    GUI_Point(col, row, color);
        xerr+=delta_x;  
        yerr+=delta_y;  
      	if(xerr>distance)  
        {  
            xerr-=distance;  
            col+=incx;  
        }  
        if(yerr>distance)  
        {  
            yerr-=distance;  
            row+=incy;  
        }  
    }  
}
Ejemplo n.º 12
0
/****************************************************************************
* 名称:GUI_LoadLine()
* 功能:输出单色图形的一行数据。
* 入口参数: x		指定显示位置,x坐标
*           y		指定显示位置,y坐标
*           dat		要输出显示的数据。
*           no      要显示此行的点个数
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
uint8  GUI_LoadLine(uint32 x, uint32 y, uint8 *dat, uint32 no)
{  uint8   bit_dat;
   uint8   i;
   TCOLOR  bakc;

   /* 参数过滤 */
   if(x>=GUI_LCM_XMAX) return(0);
   if(y>=GUI_LCM_YMAX) return(0);
   
   for(i=0; i<no; i++)
   {  /* 判断是否要读取点阵数据 */
      if( (i%8)==0 ) bit_dat = *dat++;
     
      /* 设置相应的点为color或为back_color */
      if( (bit_dat&DCB2HEX_TAB[i&0x07])==0 ) GUI_CopyColor(&bakc, back_color); 
         else  GUI_CopyColor(&bakc, disp_color);
      GUI_Point(x, y, bakc);       
     
      if( (++x)>=GUI_LCM_XMAX ) return(0);
   }
   
   return(1);
}
Ejemplo n.º 13
0
/****************************************************************************
* 名称:GUI_LineS()
* 功能:多个点之间的连续连线。从第一点连到第二点,再连到第三点...
* 入口参数: points  多个点坐标数据的指针,数据排列为(x0,y0)、(x1,y1)、(x2,y2)...
*           no      点数目,至少要大于1
*           color	显示颜色
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void  GUI_LineS(uint32_t const *points, uint8_t no, TCOLOR color)
{  uint32_t  x0, y0;
   uint32_t  x1, y1;
   uint8_t  i;

   /* 入口参数过滤 */
   if(0==no) return;
   if(1==no)						// 单点
   {  x0 = *points++;
      y0 = *points;
      GUI_Point(x0, y0, color);
   }
   
   /* 画多条线条 */
   x0 = *points++;					// 取出第一点坐标值,作为原起点坐标值
   y0 = *points++;
   for(i=1; i<no; i++)
   {  x1 = *points++;				// 取出下一点坐标值
      y1 = *points++;
      GUI_Line(x0, y0, x1, y1, color);
      x0 = x1;						// 更新原起点坐标
      y0 = y1;
   }
}
Ejemplo n.º 14
0
/****************************************************************************
* 名称:GUI_CircleFill()
* 功能:指定圆心位置及半径,画圆并填充,填充色与边框色一样。
* 入口参数: x0		圆心的x坐标值
*           y0		圆心的y坐标值
*           r       圆的半径
*           color	填充颜色
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void  GUI_CircleFill(uint32_t x0, uint32_t y0, uint32_t r, TCOLOR color)
{  int32_t  draw_x0, draw_y0;			// 刽图点坐标变量
   int32_t  draw_x1, draw_y1;	
   int32_t  draw_x2, draw_y2;	
   int32_t  draw_x3, draw_y3;	
   int32_t  draw_x4, draw_y4;	
   int32_t  draw_x5, draw_y5;	
   int32_t  draw_x6, draw_y6;	
   int32_t  draw_x7, draw_y7;	
   int32_t  fill_x0, fill_y0;			// 填充所需的变量,使用垂直线填充
   int32_t  fill_x1;
   int32_t  xx, yy;					// 画圆控制变量
 
   int32_t  di;						// 决策变量
   
   /* 参数过滤 */
   if(0==r) return;
   
   /* 计算出4个特殊点(0、90、180、270度),进行显示 */
   draw_x0 = draw_x1 = x0;
   draw_y0 = draw_y1 = y0 + r;
   if(draw_y0<GUI_LCM_YMAX)
   {  GUI_Point(draw_x0, draw_y0, color);	// 90度
   }
    	
   draw_x2 = draw_x3 = x0;
   draw_y2 = draw_y3 = y0 - r;
   if(draw_y2>=0)
   {  GUI_Point(draw_x2, draw_y2, color);	// 270度
   }
  	
   draw_x4 = draw_x6 = x0 + r;
   draw_y4 = draw_y6 = y0;
   if(draw_x4<GUI_LCM_XMAX) 
   {  GUI_Point(draw_x4, draw_y4, color);	// 0度
      fill_x1 = draw_x4;
   }
   else
   {  fill_x1 = GUI_LCM_XMAX;
   }
   fill_y0 = y0;							// 设置填充线条起始点fill_x0
   fill_x0 = x0 - r;						// 设置填充线条结束点fill_y1
   if(fill_x0<0) fill_x0 = 0;
   GUI_HLine(fill_x0, fill_y0, fill_x1, color);
   
   draw_x5 = draw_x7 = x0 - r;
   draw_y5 = draw_y7 = y0;
   if(draw_x5>=0) 
   {  GUI_Point(draw_x5, draw_y5, color);	// 180度
   }
   if(1==r) return;
   
   
   /* 使用Bresenham法进行画圆 */
   di = 3 - 2*r;							// 初始化决策变量
   
   xx = 0;
   yy = r;
   while(xx<yy)
   {  if(di<0)
	  {  di += 4*xx + 6;
	  }
	  else
	  {  di += 4*(xx - yy) + 10;
	  
	     yy--;	  
		 draw_y0--;
		 draw_y1--;
		 draw_y2++;
		 draw_y3++;
		 draw_x4--;
		 draw_x5++;
		 draw_x6--;
		 draw_x7++;		 
	  }
	  
	  xx++;   
	  draw_x0++;
	  draw_x1--;
	  draw_x2++;
	  draw_x3--;
	  draw_y4++;
	  draw_y5++;
	  draw_y6--;
	  draw_y7--;
		
	
	  /* 要判断当前点是否在有效范围内 */
	  if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>=0) )	
	  {  GUI_Point(draw_x0, draw_y0, color);
	  }	    
	  if( (draw_x1>=0)&&(draw_y1>=0) )	
	  {  GUI_Point(draw_x1, draw_y1, color);
	  }
	  
	  /* 第二点水直线填充(下半圆的点) */
	  if(draw_x1>=0)
	  {  /* 设置填充线条起始点fill_x0 */
	     fill_x0 = draw_x1;
	     /* 设置填充线条起始点fill_y0 */
	     fill_y0 = draw_y1;
         if(fill_y0>GUI_LCM_YMAX) fill_y0 = GUI_LCM_YMAX;
         if(fill_y0<0) fill_y0 = 0; 
         /* 设置填充线条结束点fill_x1 */									
         fill_x1 = x0*2 - draw_x1;				
         if(fill_x1>GUI_LCM_XMAX) fill_x1 = GUI_LCM_XMAX;
         GUI_HLine(fill_x0, fill_y0, fill_x1, color);
      }
	  
	  
	  if( (draw_x2<=GUI_LCM_XMAX)&&(draw_y2<=GUI_LCM_YMAX) )	
	  {  GUI_Point(draw_x2, draw_y2, color);   
	  }
	    	  
	  if( (draw_x3>=0)&&(draw_y3<=GUI_LCM_YMAX) )	
	  {  GUI_Point(draw_x3, draw_y3, color);
	  }
	  
	  /* 第四点垂直线填充(上半圆的点) */
	  if(draw_x3>=0)
	  {  /* 设置填充线条起始点fill_x0 */
	     fill_x0 = draw_x3;
	     /* 设置填充线条起始点fill_y0 */
	     fill_y0 = draw_y3;
         if(fill_y0>GUI_LCM_YMAX) fill_y0 = GUI_LCM_YMAX;
         if(fill_y0<0) fill_y0 = 0;
         /* 设置填充线条结束点fill_x1 */									
         fill_x1 = x0*2 - draw_x3;				
         if(fill_x1>GUI_LCM_XMAX) fill_x1 = GUI_LCM_XMAX;
         GUI_HLine(fill_x0, fill_y0, fill_x1, color);
      }
	  
	  	  
	  if( (draw_x4<=GUI_LCM_XMAX)&&(draw_y4>=0) )	
	  {  GUI_Point(draw_x4, draw_y4, color);
	  }
	  if( (draw_x5>=0)&&(draw_y5>=0) )	
	  {  GUI_Point(draw_x5, draw_y5, color);
	  }
	  
	  /* 第六点垂直线填充(上半圆的点) */
	  if(draw_x5>=0)
	  {  /* 设置填充线条起始点fill_x0 */
	     fill_x0 = draw_x5;
	     /* 设置填充线条起始点fill_y0 */
	     fill_y0 = draw_y5;
         if(fill_y0>GUI_LCM_YMAX) fill_y0 = GUI_LCM_YMAX;
         if(fill_y0<0) fill_y0 = 0;
         /* 设置填充线条结束点fill_x1 */									
         fill_x1 = x0*2 - draw_x5;				
         if(fill_x1>GUI_LCM_XMAX) fill_x1 = GUI_LCM_XMAX;
         GUI_HLine(fill_x0, fill_y0, fill_x1, color);
      }
	  
	  
	  if( (draw_x6<=GUI_LCM_XMAX)&&(draw_y6<=GUI_LCM_YMAX) )	
	  {  GUI_Point(draw_x6, draw_y6, color);
	  }
	  
	  if( (draw_x7>=0)&&(draw_y7<=GUI_LCM_YMAX) )	
	  {  GUI_Point(draw_x7, draw_y7, color);
	  }
	  
	  /* 第八点垂直线填充(上半圆的点) */
	  if(draw_x7>=0)
	  {  /* 设置填充线条起始点fill_x0 */
	     fill_x0 = draw_x7;
	     /* 设置填充线条起始点fill_y0 */
	     fill_y0 = draw_y7;
         if(fill_y0>GUI_LCM_YMAX) fill_y0 = GUI_LCM_YMAX;
         if(fill_y0<0) fill_y0 = 0;
         /* 设置填充线条结束点fill_x1 */									
         fill_x1 = x0*2 - draw_x7;				
         if(fill_x1>GUI_LCM_XMAX) fill_x1 = GUI_LCM_XMAX;
         GUI_HLine(fill_x0, fill_y0, fill_x1, color);
      }
	  
   }
}
Ejemplo n.º 15
0
/****************************************************************************
* 名称:GUI_Circle()
* 功能:指定圆心位置及半径,画圆。
* 入口参数: x0		圆心的x坐标值
*           y0		圆心的y坐标值
*           r       圆的半径
*           color	显示颜色
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void  GUI_Circle(uint32_t x0, uint32_t y0, uint32_t r, TCOLOR color)
{  int32_t  draw_x0, draw_y0;			// 刽图点坐标变量
   int32_t  draw_x1, draw_y1;	
   int32_t  draw_x2, draw_y2;	
   int32_t  draw_x3, draw_y3;	
   int32_t  draw_x4, draw_y4;	
   int32_t  draw_x5, draw_y5;	
   int32_t  draw_x6, draw_y6;	
   int32_t  draw_x7, draw_y7;	
   int32_t  xx, yy;					// 画圆控制变量
 
   int32_t  di;						// 决策变量
   
   /* 参数过滤 */
   if(0==r) return;
   
   /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
   draw_x0 = draw_x1 = x0;
   draw_y0 = draw_y1 = y0 + r;
   if(draw_y0<GUI_LCM_YMAX) GUI_Point(draw_x0, draw_y0, color);	// 90度
	
   draw_x2 = draw_x3 = x0;
   draw_y2 = draw_y3 = y0 - r;
   if(draw_y2>=0) GUI_Point(draw_x2, draw_y2, color);			// 270度
   
	
   draw_x4 = draw_x6 = x0 + r;
   draw_y4 = draw_y6 = y0;
   if(draw_x4<GUI_LCM_XMAX) GUI_Point(draw_x4, draw_y4, color);	// 0度
   
   draw_x5 = draw_x7 = x0 - r;
   draw_y5 = draw_y7 = y0;
   if(draw_x5>=0) GUI_Point(draw_x5, draw_y5, color);			// 180度   
   if(1==r) return;					// 若半径为1,则已圆画完
   
   
   /* 使用Bresenham法进行画圆 */
   di = 3 - 2*r;					// 初始化决策变量
   
   xx = 0;
   yy = r;	
   while(xx<yy)
   {  if(di<0)
	  {  di += 4*xx + 6;	      
	  }
	  else
	  {  di += 4*(xx - yy) + 10;
	  
	     yy--;	  
		 draw_y0--;
		 draw_y1--;
		 draw_y2++;
		 draw_y3++;
		 draw_x4--;
		 draw_x5++;
		 draw_x6--;
		 draw_x7++;	 	
	  }
	  
	  xx++;   
	  draw_x0++;
	  draw_x1--;
	  draw_x2++;
	  draw_x3--;
	  draw_y4++;
	  draw_y5++;
	  draw_y6--;
	  draw_y7--;
		
	
	  /* 要判断当前点是否在有效范围内 */
	  if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>=0) )	
	  {  GUI_Point(draw_x0, draw_y0, color);
	  }	    
	  if( (draw_x1>=0)&&(draw_y1>=0) )	
	  {  GUI_Point(draw_x1, draw_y1, color);
	  }
	  if( (draw_x2<=GUI_LCM_XMAX)&&(draw_y2<=GUI_LCM_YMAX) )	
	  {  GUI_Point(draw_x2, draw_y2, color);   
	  }
	  if( (draw_x3>=0)&&(draw_y3<=GUI_LCM_YMAX) )	
	  {  GUI_Point(draw_x3, draw_y3, color);
	  }
	  if( (draw_x4<=GUI_LCM_XMAX)&&(draw_y4>=0) )	
	  {  GUI_Point(draw_x4, draw_y4, color);
	  }
	  if( (draw_x5>=0)&&(draw_y5>=0) )	
	  {  GUI_Point(draw_x5, draw_y5, color);
	  }
	  if( (draw_x6<=GUI_LCM_XMAX)&&(draw_y6<=GUI_LCM_YMAX) )	
	  {  GUI_Point(draw_x6, draw_y6, color);
	  }
	  if( (draw_x7>=0)&&(draw_y7<=GUI_LCM_YMAX) )	
	  {  GUI_Point(draw_x7, draw_y7, color);
	  }
   }
}
Ejemplo n.º 16
0
/**
  * @brief  画任意两点之间的直线.
  * @param  x0:直线起点
			y0:
			x1:
			y1:
			color:显示的颜色.
  * @retval None.
  * @verify .
  */
void GUI_Line(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, TCOLOR color)
{  
	int32_t   dx;			// 直线x轴差值变量
	int32_t   dy;          	// 直线y轴差值变量
	int8_t    dx_sym;		// x轴增长方向,为-1时减值方向,为1时增值方向
	int8_t    dy_sym;		// y轴增长方向,为-1时减值方向,为1时增值方向
	int32_t   dx_x2;		// dx*2值变量,用于加快运算速度
	int32_t   dy_x2;		// dy*2值变量,用于加快运算速度
	int32_t   di;			// 决策变量


	dx = x1-x0;				// 求取两点之间的差值
	dy = y1-y0;

	/* 判断增长方向,或是否为水平线、垂直线、点 */
	if(dx>0){				// 判断x轴方向
		dx_sym = 1;			// dx>0,设置dx_sym=1
	}else{  
		if(dx<0){  
			dx_sym = -1;		// dx<0,设置dx_sym=-1
		}else{  // dx==0,画垂直线,或一点
			GUI_RLine(x0, y0, y1, color);
			return;
		}
	}
	if(dy>0){							// 判断y轴方向
		dy_sym = 1;					// dy>0,设置dy_sym=1
	}else{  
		if(dy<0){  
			dy_sym = -1;				// dy<0,设置dy_sym=-1
		}else{  // dy==0,画水平线,或一点
			GUI_HLine(x0, y0, x1, color);
			return;
		}
	}
	/* 将dx、dy取绝对值 */
	dx = dx_sym * dx;
	dy = dy_sym * dy;
	/* 计算2倍的dx及dy值 */
	dx_x2 = dx*2;
	dy_x2 = dy*2;
	/* 使用Bresenham法进行画直线 */
	if(dx>=dy){						// 对于dx>=dy,则使用x轴为基准
		di = dy_x2 - dx;
		while(x0!=x1){  
			GUI_Point(x0, y0, color);
			x0 += dx_sym;
			if(di<0){
				di += dy_x2;			// 计算出下一步的决策值
			}else{  
				di += dy_x2 - dx_x2;
				y0 += dy_sym;
			}
		}
		GUI_Point(x0, y0, color);		// 显示最后一点
	}else{								// 对于dx<dy,则使用y轴为基准
		di = dx_x2 - dy;
		while(y0!=y1){  
			GUI_Point(x0, y0, color);
			y0 += dy_sym;
			if(di<0){  
				di += dx_x2;
			}else{  
				di += dx_x2 - dy_x2;
				x0 += dx_sym;
			}
		}
		GUI_Point(x0, y0, color);		// 显示最后一点
	}
}
Ejemplo n.º 17
0
void GUI_Line( INT16S x, INT16S y, INT16S x1, INT16S y1, TCOLOR color) 
{ 


    INT16S dx,dy,err = 0;
   
 
    if(y != y1)
	{
		if(y1 < y) /*这个判断语句保证了y1>=y这个前提*/
		{
			dx = y1; dy = x1;
			y1 = y;  x1 = x;
			y = dx;  x = dy;
		}
		dy = y1 - y;
		dx = x1 - x;
		GUI_Point(x ,y,color);
		
		if((x1 >= x)&&((y1 - y) <= (x1 - x)))
		{
			for(;x != x1;)
			{
				if(err < 0)
				{
					GUI_Point(x + 1,y,color);
					x += 1;
					err += dy;
				}
				else
				{
					GUI_Point(x + 1,y + 1,color);
					x += 1;
					y += 1;
					err += (dy - dx);
				}
			}
		}
		else
			if((x1 >= x)&&((y1 - y) > (x1 - x)))
			{
				for(;y != y1;)
				{
					if(err < 0)
					{
						GUI_Point(x + 1,y + 1,color);
						x += 1;
						y += 1;
						err += (dy - dx);
					}
					else
					{
						GUI_Point(x,y + 1,color);
						y += 1;
						err -= dx;
					}
				}
			}
			else
				if((x1 < x)&&((y1 - y) <= (x - x1)))
				{
					for(;x != x1;)
					{
						if(err < 0)
						{
							GUI_Point(x - 1,y,color);
							x -= 1;
							err += dy;
						}
						else
						{
							GUI_Point(x - 1,y + 1,color);
							x -= 1;
							y += 1;
							err += (dy + dx);
						}
					}
				}
				else
					if((x1 < x)&&((y1 - y) > (x1 - x)))
					{
						for(;y != y1;)
						{
							if(err < 0)
							{
								GUI_Point(x - 1,y + 1,color);
								x -= 1;
								y += 1;
								err += (dy + dx);
							}
							else
							{
								GUI_Point(x,y + 1,color);
								y += 1;
								err += dx;
							}
						}
					}
	}	
	else
	{
		dx = x; dy = x1;
		if(x < x1)
		{
			dx = x1;
			dy = x;
		}
		for(;dy < dx;dy++)
			GUI_Point(dy,y,color);

			GUI_Point(x1 ,y1,color);
	}
}
Ejemplo n.º 18
0
//**********************************************************************
//                (给定坐标的)任意位置打点函数
//**********************************************************************
void lcd_set_dot(unsigned char x,unsigned char y,unsigned char color)
{
    GUI_Point(x,63-y,color);
}