四極管:区電子設計大会のSTM 32簡易絵図器



C題簡易絵図器
【学部グループ】
一、任務
簡易グラフィックスを設計して作成します.
二、要求
1、基本要求
(1)自分で設計して図形描画器の機械構造を作り、システムを制御する.
(2)図面幅:X軸方向25 cm、Y軸方向25 cm、図面左下角座標原点;
(3)プロッタはセルフテストを行い、自動的に原点に戻り、幅内に(12 cm、12 cm)を中心直径15 cmの円を描き、完了時間を記録することができる.
(4)キーボード設定が可能で、[X(6~24),Y(6~24)]のいずれかの点を中心として直径(5~10 cm)の間に任意に設定された円を描き、完了時間を記録する.
2、発揮部分
(1)キーボード設定により,2周期の正弦波形を描き,完了時間を記録する.
(2)キーボード設定により、「A,B,C,D,E,F,G,H」の英字文字を1文字描き、完了時間を記録する.
(3)キーボード設定で「広西チワン族自治区」の漢字を描き、完成時間を記録する.
(4)キーボードでサイズを設定し、4段階に分けて設定し、完了時間を記録する.
(5)その他.
三、説明
部分的にフォント中心が自定し、要求しないことを発揮します.再生部第(1)項2周期正弦波の大きさは10 cm*5 cm、再生部第(2)項の試験時には専門家が8文字の英字文字の中から1つを選択して試験を行い、再生部第(3)項の試験時には専門家が7文字の中から1つを選択して試験を行い、再生部第(4)項のサイズは5 cm*5 cmから20 cm*20 cmの4段階に分けてサイズを設定する.作品は単独作品でPC機とオンラインになってはならず、グラフィックボードを水平に置いてはならない.
四、採点基準
設計レポート
主な内容
スコア
システム方案、理論分析と計算、回路とプログラム設計、結果分析、設計報告構造と規範性
50
基本的な要件
基本部分(1)、(2)の項目を完成する
15
基本部分(3)項目の完了
15
基本セクション(4)の項目を完了
20
合計スコア
50
発揮部分
プレイパート第(1)項をクリア
10
プレイパート第(2)項をクリア
10
プレイパート(3)をクリア
15
プレイパート第(4)項をクリア
10
その他
5
合計スコア
50
 
 
円を描くコアコード:
四極管:円を描く実現関数で、彫刻機アルゴリズム(Plotter.c)に似ている.
/*******************************************************************************
   :  Plotter.c
     :   
    :2010-9-19           
    :      
*********************************************************************************/
#ifndef __PLOTTER_C__
#define __PLOTTER_C__

#include <math.h>
#include "Statement.h"
#include "General_Data_Type.h"
#include "my_math.c"




#define PI  3.1415926     //   PI
extern uint8 LED_MODE;
uint8 or_Y=0;	//           
uint8 X_or=0;	
char direction = 0;

char flag = 1;//     0     1   
/****************************************************
    :     
      :n
     : 	  
****************************************************/
void delay_sudu(uint32 n)
{

while(n--);

}
/****************************************************
    :Y      
      :   :Forward
             :      n
     : 	  
****************************************************/
void Stepping_Motor_Y_Forward_run(uint32  n)
{
 
   uint32 i; 
   Step_Motor_Y_Forward;
   Step_Motor_Y_Run; 
   for (i = 0;i < n;i++ )
   {
   delay_sudu(50000);
   }
   Step_Motor_Y_stop;    
}
/****************************************************
    :Y      
      :   :direction    
             :        
     : 	  
****************************************************/ 
void Stepping_Motor_Y_run(char direction,uint16 n)
{   uint32 i; 
   if(direction ==1 )
   {
   Step_Motor_Y_Back;
   Step_Motor_Y_Run; 
   }
   else
   {
   Step_Motor_Y_Forward;
   Step_Motor_Y_Run; 
   }
   for (i = 0;i < n;i++ )
   {
   delay_sudu(10000);
   }

   Step_Motor_Y_stop;    
}
/****************************************************
    :X      
      :   :direction    
             :    
     : 	  
****************************************************/ 
void Stepping_Motor_X_run(char direction,uint16 n)
{   uint32 i; 
   if(direction ==1 )
   {
   Step_Motor_X_Right;
   Step_Motor_X_Run; 
   }
   else
   {
   Step_Motor_X_Left;
   Step_Motor_X_Run; 
   }
   for (i = 0;i < n;i++ )
   {
   delay_sudu(10000);
   }

   Step_Motor_X_stop; 
   
   
}
/****************************************************
    :Y      
      :  :Back
             :    
     : 	  
****************************************************/
void Stepping_Motor_Y_Back_run(uint32  n)
{
   
   uint32 i; 
   Step_Motor_Y_Back;
   Step_Motor_Y_Run; 
   for (i = 0;i < n;i++ )
   {
   delay_sudu(50000);
   }
   Step_Motor_Y_stop; 
   
   
} 
/****************************************************
    :X      
      :  :right
             :    
     : 	  
****************************************************/
void Stepping_Motor_X_Right_run(uint32 n)
{
   uint32 i; 
   Step_Motor_X_Right;
   Step_Motor_X_Run; 
   for (i = 0;i < n;i++ )
   {
   delay_sudu(50000);
   }
   Step_Motor_X_stop;

}
/****************************************************
    :X      
      :  :left
             :    
     : 	  
****************************************************/
void Stepping_Motor_X_left_run(uint32 n)
{
   uint32 i; 
   Step_Motor_X_Left;
   Step_Motor_X_Run; 
   for (i = 0;i < n;i++ )
   {
   delay_sudu(50000);
   }
   Step_Motor_X_stop;

}
/****************************************************
    :Y        
      : 
     : 	  
****************************************************/
void  Stepping_Motor_Y_stop(void)
{
   Step_Motor_Y_stop;

}
/****************************************************
    :X        
      : 
     : 	  
****************************************************/
void  Stepping_Motor_X_stop(void)
{
   Step_Motor_X_stop;

}


/***************************************
    :1、    ,      
      : 
     :  
    :2010-9-10   10:31
****************************************/
void Automatic_return_to_origin (void)
{

  /*         ,Y        (Stepping_Motor_Y),X        (Stepping_Motor_Y).
         :PA0(Y         ,PA0 = 0;)
                  PA1(X         ,PA1 = 0;)
  */
  tibi(1);
  //  X   
  while(1)
 {
  if(X_or!=1)
  {
  Step_Motor_X_Left;
  Step_Motor_X_Run; 
   }
   if(or_Y!=1)
   {
  Step_Motor_Y_Forward;
  Step_Motor_Y_Run;
	}
  if(LED_MODE==4) {LED_MODE=0;X_or=1;Stepping_Motor_X_stop();}
  if(LED_MODE==2) {LED_MODE=0;or_Y=1;Stepping_Motor_Y_stop();} 
  if(X_or&or_Y==1)break; 
   }
}

/***********************************************
    :     
      :uint x, uint y;
     : 
************************************************/
void goto_xy(int16 x0,int16 y0,int16 x,int16 y)
{
	//char direction = 0;//      
	if((x-x0)>0)	direction = 1 ;	//  
	else			direction = 0 ;	//  
	switch(x-x0)	     
		 {
		 case 1 : flag = 1;Stepping_Motor_X_run(direction,10);break;
		 case -1: flag = 1;Stepping_Motor_X_run(direction,10);break;
		 case 0:  flag = 1;break;
          
		 default: flag = 1;Stepping_Motor_X_run(direction,x-x0);break;

         }
	if((y-y0)>0)	direction = 1 ;
	else			direction = 0 ;	 
	switch(y-y0)
	     
		 {
		 case 1 : flag = 1;Stepping_Motor_Y_run(direction,10);break;//   
		 case -1: flag = 1;Stepping_Motor_Y_run(direction,10);break;
		 case 0:  flag = 1;break;
          
		 default: flag = 1;Stepping_Motor_Y_run(direction,y-y0);break;//   
         }	
}


/***********************************************
    : 
      :uint x, uint y;
     : 
************************************************/
void LineTo_xy_up(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 y;		  // 
	double dx,dy,k,x;

	dx=x1-x0;
	dy=y1-y0;
	k=dx/dy;
	x=x0;

	for(y=y0;y<=y1;y++)
	{
		goto_xy(x0,y0,(int32)(x+0.5),y);
		y0 = y;
		x0 = (int32)(x+0.5);
		x = x+k;
	}
} 
/***********************************************
    : 
      :uint x, uint y;
     : 
************************************************/ 
void LineTo_xy_down(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 y;		  // 
	double dx,dy,k,x;

	dx=x1-x0;
	dy=y1-y0;
	k=dx/dy;
	x=x0;

	for(y=y0;y>=y1;y--)
	{
		goto_xy(x0,y0,(int32)(x+0.5),y);
		y0 = y;
		x0 = (int32)(x+0.5);
		x = x-k;
	}	
}
/***********************************************
    : 
      :uint x, uint y;
     : 
************************************************/
void LineTo_xy_left(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 x;		  // 
	double dx,dy,k,y;

	dx=x1-x0;
	dy=y1-y0;
	k=dy/dx;
	y=y0;

	for(x=x0;x>=x1;x--)
	{
		goto_xy(x0,y0,x,(int32)(y+0.5));
		x0 = x;
		y0 = (int32)(y+0.5);
		y = y-k;
	}	
}
/***********************************************
    : 
      :uint x, uint y;
     : 
************************************************/
void LineTo_xy_right(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 x;		  // 
	double dx,dy,k,y;

	dx=x1-x0;
	dy=y1-y0;
	k=dy/dx;
	y=y0;

	for(x=x0;x<=x1;x++)
	{
		goto_xy(x0,y0,x,(int32)(y+0.5));
		x0 = x;
		y0 = (int32)(y+0.5);
		y = y+k;
	}	
}
/***********************************************
    :       (OK)
      :int32 x0,int32 y0,int32 x1,int32 y1
     : 
************************************************/
void LineTo_xy_finally(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 udx,udy;
	char dx,dy; 
	if(x1>=x0) 	{udx = x1-x0; dx=1;}
	else		{udx = x0-x1; dx=0;}
	if(y1>=y0) 	{udy = y1-y0; dy=1;}
	else		{udy = y0-y1; dy=0;}
	
	if(udx>=udy)//x   
	{
		if(dx>0)  // 
		{
		  	LineTo_xy_right(x0,y0,x1,y1); 	
		}
		else	  // 
		{
		    LineTo_xy_left(x0,y0,x1,y1);
		}	
	}
	else 
	{
		if(dy>0)  // 
		{
		   	LineTo_xy_up(x0,y0,x1,y1);
		}
		else	   // 
		{
		  	LineTo_xy_down(x0,y0,x1,y1);
		}	
	}
}


/***************************************************************  
    :2、    (12cm,12cm)      15cm  ,       
************************************************************************/

/**************************************************************************
    :3、     ,    [X(6~24),Y(6~24)]       ,   (5~10cm)
                   ,       
      :    uint  uint x0,y0,r     //      
     :    
*****************************************************************************/
void Draw_circle(uint16 x0,uint16 y0,uint16 r)    
{
	int32 x,y,x00=0,y00=0;
	float64 d;
	x=0;
	y=r;
	d=1.25-r;
	tibi(1);
	LineTo_xy_finally(x00,y00,2*(x+x0),y+y0);
	tibi(0); 
	tibi(1);
	LineTo_xy_finally(0,0,0,r);
	x00=x+x0;	  
	y00=y+y0;
	tibi(0);
	while(x<y)		    //       
	{
		if(d<0)
		{
			d += x+x+3;
			x++;
		}
		else
		{
			d += x+x -y-y +5 ;
			x++;
			y--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;		
	}
	while(x>=y && y>0)	 //       
	{
		if(d>0)
		{
			d += 3-y-y;
			y--;
		}
		else
		{
			d += x+x -y-y +5 ;
			x++;
			y--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		if(y==0)break;
	}

	while(x>=(0-y) && y<=0)	   //       
	{
		if(d<0)
		{
			d += 3-y-y;
			y--;
		}
		else
		{
			d += 5-x-x-y-y ;
			y--;
			x--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}
	while(x<=(0-y) && x>0)		 //       
	{
		if(d>0)
		{
			d += -3-x-x;
			x--;
		}
		else
		{
			d += 5-x-x-y-y ;
			y--;
			x--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}
	 while((0-x)<(0-y) && x<=0)		  //       
	{
		if(d<0)
		{
			d += 3-x-x;
			x--;
		}
		else
		{
			d += 5-x-x+y+y ;
			y++;
			x--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}

	while(y<0)				 //       
	{
		if(d>0)
		{
			d += 3+y+y;
			y++;
		}
		else
		{
			d += 5-x-x+y+y ;
			y++;
			x--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}
	while(y<(0-x) && y>=0)				 //       
	{
		if(d<0)
		{
			d += 3+y+y;
			y++;
		}
		else
		{
			d += 5+x+x+y+y ;
			y++;
			x++;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}

		while(y>=(0-x) && x<0)				 //       
	{
		if(d>0)
		{
			d += 3+x+x;
			x++;
		}
		else
		{
			d += 5+x+x+y+y ;
			y++;
			x++;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}	
	tibi(1);
}


 /***********************************************************************
    :4、      ,  2        ,       
      :uint x0,y0,
     : 
************************************************************************/
void Draw_Sine_wave(int16 x0,int16 y0,double high)
{ 
	
 int32 x  = 0,y = 0; double jiaodu;
 tibi(1);
 LineTo_xy_finally(0,0,0,high);
 tibi(0);
 for(x = 0;x<1000;x+=5)//
 {
 	jiaodu  = ((double)(4*PI*x)/1000) ;//720
	y = high * sin(jiaodu);
  	LineTo_xy_finally(x0,y0,x,y);
	x0=x;
	y0=y;
 }
 tibi(1);
}

/*************************************************************************
5、      ,  “A、B、C、D、E、F、G、H”        ,       
**************************************************************************/
/**************************************************************************
6、      ,  “       ”      ,       。
*****************************************************************************/
/**************************************************************************
7、          ,     ,       
*****************************************************************************/


/****************************************************************************
    :          
      :uint Path,x0,y0  //path 16    
     ; 
********************************************************************************/
void Direction(uint16 Path,uint16 x0,uint16 y0)
{											 
   
   int x = 0, y = 0;
   switch(Path)
   {
    case 0 : x = x0 + 2; y = y0 + 0;  goto_xy(x0,y0,x,y); break;
	case 1 : x = x0 + 2; y = y0 + 1;  goto_xy(x0,y0,x,y); break;
	case 2 : x = x0 + 2; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
	case 3 : x = x0 + 1; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
	case 4 : x = x0 + 0; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
    case 5 : x = x0 - 1; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
	case 6 : x = x0 - 2; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
	case 7 : x = x0 - 2; y = y0 + 1;  goto_xy(x0,y0,x,y); break;
	case 8 : x = x0 - 2; y = y0 + 0;  goto_xy(x0,y0,x,y); break;
	case 9 : x = x0 - 2; y = y0 - 1;  goto_xy(x0,y0,x,y); break;
	case 10 : x = x0 - 2; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 11 : x = x0 - 1; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 12 : x = x0 + 0; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 13 : x = x0 + 1; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 14 : x = x0 + 2; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 15 : x = x0 + 2; y = y0 - 1; goto_xy(x0,y0,x,y);break;
   
    default : break;
   
   }
  
}
/**************************************************************
    :           
                    
		           
              2   1     0,    ,        (2)   (1);
      :	uint16 Unit_length,uint16 Vector,uint16 x0,uint16 y0,
     : 
***************************************************************/
void Draw_Chinese_character(int32 x0,int32 y0,int32 array_A[],int32 B)
{

   int32 dx = 0,dy = 0;  
   char i = 0,ti;
   for(i = 0; i < (array_A[0]/3) ; i++)
   {
     ti = array_A[i*3+1]-1;
	 tibi(ti);
//	 if(array_A[i*3+1]==1){}//  
//	 if(array_A[i*3+1]==2){}//  
	 dx = array_A[i*3+2]*B;//
	 dy = array_A[i*3+3]*B;

 	 LineTo_xy_finally(0,0,dx,dy);
   }
   tibi(1);     
}
/*void Draw_Chinese_character(uint16 x0,uint16 y0)
{ 
  int i,j;
  flag = 1;
  uint16   Vector =0 ,Unit_length = 0;
  for(i = 1;i < array_A[1];i++)
  {      
    if(((array_A[i]&0xF0)>>4) < 0 && (array_A[i]&0x0F == 2) )   //
	   {
	   	  flag  = 0 ;//  
	   }
	if(((array_A[i]&0xF0)>>4) < 0 && (array_A[i]&0x0F == 1) )   //
	   {
	   	  flag  = 1;//  
	   }
	Vector =  array_A[i]&0x0F;
    Unit_length  = 100*(array_A[i]&0xF0)>>4; 
    
     for(j = 0; j < Unit_length;j++)
     {
      Direction(Vector,x0,y0); 
     }
  }
    
}*/


#endif

 
転載は出典を明記してください.著者:四極管、広西師範大学電子工学学院大学生科学技術革新基地メールアドレス:[email protected].
私たちのチームの他の2人の大神・・菜頭と超超超、そして外挂けの赤.私たちは四日三晩も一等賞を取ったが、憂鬱なのは仕事がもうすぐ一年になることだ.学校があげるボーナスはまだ届いていない.ああ、どう言ったらいいか分からない.かわいい母校......
転載は出典を明記してください.http://blog.csdn.net/yangxingbo0311/article/details/7201106