四極管:区電子設計大会の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