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

📄 main.c

📁 参加05年全国_大学生_电子设计_大赛的程序 AVR ICC基于AVR单片机!
💻 C
📖 第 1 页 / 共 3 页
字号:
		dis_t=dis_en_row(5,64,"Y");
		dis_t+=dis_en(5,dis_t,'0'+i+1);
		dis_t=dis_en_row(5,dis_t,":_");
		dy[i+1]=get_num(5,dis_t);
	}
	start_wait();
	
	//,
	dx[0]=dy[0]=0;
	for(cnt=0;cnt<n;cnt++)
	{
		//依次调用画线函数,参数是dx[i],dy[i],相当于lineto();
		//x=dx[cnt];
		//y=dy[cnt];
		draw_line(dx[cnt+1],dy[cnt+1]);
	}
	stop_wait();
}
void m_dingbiao(void)	//定位校正坐标
{
	uint xx,yy,f=1;
	uint c;
	xx=x;yy=y;
	clrscr(0);
	dis_side();
	draw_point(x,y);
	dis_hz(0,64,hz_ding);
	dis_hz(0,64+16,hz_biao);
	stop_wait();
	while(f)
	{
	 	c=get_key();
		if(c==KEY_OK)
			f=0;
		if(c==KEY_UP)
		//调用向上移动的函数
			{dis_en(3,64+16,'^');draw_line_base(x,y+1);}
		if(c==KEY_DOWN)
		//调用向下移动的函数
			{dis_en(6,64+16,'~');draw_line_base(x,y-1);}
		if(c==KEY_LEFT)
		//调用向左移动的函数
			{dis_hz(4,64,hz_jiantou_xx);draw_line_base(x-1,y);}
		if(c==KEY_RIGHT)
		//调用向右移动的函数
			{dis_hz(6,64+16+7,hz_jiantou);draw_line_base(x+1,y);}
		clrscr(2);	
	}
		
	x=xx;y=yy;
}
//TIMER1 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
// actual value:  1.000Sec (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xF0; //setup
 TCNT1L = 0xBE;
 OCR1AH = 0x0F;
 OCR1AL = 0x42;
 OCR1BH = 0x0F;
 OCR1BL = 0x42;
 ICR1H  = 0x0F;
 ICR1L  = 0x42;
 TCCR1A = 0x00;
 TCCR1B = 0x05; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1H = 0xF0; //reload counter high value
 TCNT1L = 0xBE; //reload counter low value
 t_cnt++;
}
/*************************/////
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0xff;
 PORTB = 0xF0;
 DDRB  = 0x0F;
 PORTC = 0x03; //m103 output only
 DDRC  = 0xff;
 PORTD = 0xff;
 DDRD  = 0xff;
}

//Watchdog initialize
// prescale: 256K
void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x0d; //WATCHDOG ENABLED - dont forget to issue WDRs
}

/*			UART初始化				*/	
void uart_init(void)
{
 UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
 UBRRL=(fosc/16/(baud+1))%256;
 UBRRH=(fosc/16/(baud+1))/256;
 UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();

 //uart_init();
 
 MCUCR = 0x00;
 GICR  = 0x00;

 TIMSK = 0x00; //timer interrupt sources

 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}
/*  		字符输入函数 		 */	
uchar getchar(void)
 {uchar i=0;
  while(i!=0xaa)
	 {
	 while(!(UCSRA& (1<<RXC)));
     i=UDR;
	 }
	 
	 while(!(UCSRA& (1<<RXC)));
     return UDR;
}		


/*		微秒级延时程序		*/
void del(unit time)
	 {     
  	  do
	  	{
		 time--;
		}	
  	  while (time>1);
	 }
	 
/*	   毫秒级延时程序   	*/	 
void delay_1ms(void)
{ unsigned int i1;
 for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
    ;
}

void delay(unsigned int n)
{
 unsigned int i2=0;
   while(i2<n)
   {delay_1ms();
    i2++; WDR();
   }
}

void write_step(void)
{
	unit n;
	if(nx>=ny)
		n=nx;
	else
		n=ny;
	while(n)
	{
		if(nx>0)
		{
			PORTA&=~0xf0;
			PORTA|=xdat[xi];
			E1;
			nx--;
		}
		if(ny>0)
		{
			PORTA&=~0x0f;
			PORTA|=ydat[yi];
			E1;
			ny--;
		}
		if(phase1==1)
		{
			xi++;
			if(xi==4)
				xi=0;
		}
		else
		{
			xi--;
			if(xi==255) xi=3;
		}
		if(phase2==1)
		{
			yi++;
			if(yi==4) yi=0;
		}
		else
			{
			yi--;
			if(yi==255) yi=3;
		}
		delay(30);
		n--;
	}
}

void draw_line_base(float x0,float y0)///x00 y00为0,0坐标原点
{
float abs1,abs2;
ss01=sqrt((L-y)*(L-y)+(x+P)*(x+P)-49);
ss02=sqrt((L-y)*(L-y)+(800+P-x)*(800+P-x)-49);
ss1=sqrt((L-y0)*(L-y0)+(x0+P)*(x0+P)-49);
ss2=sqrt((L-y0)*(L-y0)+(800+P-x0)*(800+P-x0)-49);
if(ss01>ss1) {abs1=(ss01-ss1); phase1=0;}
else             {abs1=ss1-ss01;phase1=1;}
if(ss02>ss2) {abs2=(ss02-ss2); phase2=0;}
else             {abs2=ss2-ss02;phase2=1;}
nx=(uint)(abs1/one_size);
ny=(uint)(abs2/one_size);///操作电动机
write_step();
x=x0;y=y0;
}

void draw_line(float linex0,float liney0)
{float k;
uint i;
//length=sqrt((y00-y0)*(y00-y0)-(x00-x0)*(x00-x0));
k=(1.0*(liney0-y))/(1.0*(linex0-x));

//while(length/i>1)i++;
//for(j=0;j<i;j++)
if(linex0>x)
{
 while(x+10<linex0)
 {
 draw_line_base(x+10,k*10+y);
 }
 draw_line_base(linex0,liney0);
}
else
{
 while(x-10>linex0)
 {
 draw_line_base(x-10,y-k*10);
 }
 draw_line_base(linex0,liney0);
}

}


///在圆心处,向右移动25cm 逆时针画圆
void draw_cricle(float r)///x0,y0圆心坐标
{
double a,b,i,x0,y0,t=0.0,tl;
uint j;
a=x;
b=y;
draw_line(a+r, b);
//draw_line_base(a+r, b);//向右移动25cm
tl=2*3.1415926/6;

for(j=0;j<6;j++)//100
{
t+=tl;
x0=a+r*cos(t);
y0=b+r*sin(t);
draw_line((x0),y0);
//draw_line_base((x0),y0);

/////*****call  dsp
}
}
//以500,400为坐标原点画五角星
void draw_star(void)
{
int i;
float xx[5],yy[5],tl,t=0.0;
tl=2*3.1415926/5;
for(i=0;i<5;i++)
{
t+=tl;
xx[i]=400+200.0*cos(t);
yy[i]=500+200.0*sin(t);

}
draw_line(600,500);
draw_line(xx[1],yy[1]);
draw_line(xx[3],yy[3]);
draw_line(xx[0],yy[0]);
draw_line(xx[2],yy[2]);
draw_line(xx[4],yy[4]);
}

uchar flag(void)
{
uchar n,i;
n=0;
for(i=0;i<6;i++)
 {
 if(getchar()>30) n++;
 delay(1);
 if(n>3) break;
 }
if(n>3) return(1);
 else return(0);
}

uchar find_updown(uchar k)//0  shang 1 xia
{
uchar _p=8,m_i;

for(m_i=0;m_i<5;m_i++)
{
if(k==0) draw_line_base(x,y+3);
else     draw_line_base(x,y-3);
a=flag();
if(a) break;
}
if(a==1) return 1; //找到黑?
else              //mei zhao dao 改为向下找
{
    if(k==0) draw_line_base(x,y-15);
	   else  draw_line_base(x,y+15);
	for(m_i=0;m_i<5;m_i++)
	 { 
	 if(k==0) draw_line_base(x,y-3);
	 else     draw_line_base(x,y+3);
     a=flag();
     if(a) break;
	 }
    if(a==1) return 2; //找到黑线
	else    
	 {
	  if(k==0) draw_line_base(x,y+15);
	     else  draw_line_base(x,y-15);
	 
	 return 3; 
	 }
}
}

uchar find_leftright(uchar k)//0  shang 1 xia
{
 	  uchar _p=8,m_i;

	  for(m_i=0;m_i<5;m_i++)
	  {
	   	if(k==0) draw_line_base(x+3,y);
		else     draw_line_base(x-3,y);
		a=flag(); 
		if(a) break;
	  }
		if(a==1) return 1; //找到黑?
		else              //mei zhao dao 改为向下找
		{
    	   if(k==0) draw_line_base(x-15,y);
	   	   else  draw_line_base(x+15,y);
		   for(m_i=0;m_i<5;m_i++)
	 	   { 
	 	    if(k==0) draw_line_base(x-3,y);
	 	    else     draw_line_base(x+3,y);
     	    a=flag();
     	    if(a) break;
	 	   }
    	   if(a==1) return 2; //找到黑线
		   else    
		    {
	 		  if(k==0) draw_line_base(x+15,y);
	   		   else  draw_line_base(x-15,y);
	 		   // draw_line_base(x+20,y);
	 	      return 3; 
	         }
          }
}

void stack(float tt)
{uchar i;
for(i=0;i<3;i++)
seq[i]=seq[i+1];
seq[3]=tt;
}

void rightout(void)
{
a=getchar();
while(a)
{
 a=flag();
 draw_line_base(x+3,y);
// WDR();
}
}

void leftout(void)
{
  a=getchar();
  
  while(a=flag())
   {
    a=flag();
    draw_line_base(x-3,y);
    WDR();
    }//xiang you dao xian wa
}

void upout(void)
{
    a=getchar();
    
    while(a=flag())
   {
    a=flag();
    draw_line_base(x,y+3);
    WDR();
   }//xiang 
}
void downout (void)
{
   a=getchar();
    
    while(a=flag())
   {
    a=flag();
    draw_line_base(x,y-3);
    WDR();
   }//xiang 
   
}

/*************************/////

/*************************/////
/*******开始主程序********/
int main(void)
{
	uint c;
	uint menu_index=0;	//menu_index 是从0到MENU_MAX-1的数值
	void (*fun)(void);
	delay_ms(1000);
	//init_devices();
	//{
	// 	nx=1;
	//	ny=1;
	//	write_step();
	//}	
	//timer1_init();
	init_dis();
	clrscr(0);
	dis_welcome();	//显示欢迎屏幕
	
	while(1)	//消息循环
	{

		dis_menu(menu_index,MENU_MAX);	//显示菜单,当前条目前加箭头
		c=get_key();
		if(c==KEY_UP)	//有向上的键按下
		{
			if(menu_index==0)
			{
				menu_index=MENU_MAX-1;
			}
			else
			{
				menu_index--;
			}
			//dis_menu(menu_index,MENU_MAX);
		}
		if(c==KEY_DOWN)	//有向下的键按下
		{
			if(menu_index==MENU_MAX-1)
			{
				menu_index=0;
			}
			else
			{
				menu_index++;
			}
			//dis_menu(menu_index,MENU_MAX);
		}
		if(c==KEY_OK)
		{
			//menu_funs[menu_index]();
			/*switch (menu_index)
			{
				case 0:fun=m_dingdian;break;
				case 1:fun=m_huaxian;break;
				case 2:fun=m_huayuan;break;
				case 3:fun=m_zhaoxian;break;
				case 4:fun=m_huatu;break;
				case 5:fun=m_dingbiao;break;
			}
			fun();
			*/
			if(menu_index==0)
			{
			 	m_dingdian();
			}
			if(menu_index==1)
			{
			 	m_huaxian();
			}
			if(menu_index==2)
			{
			 	m_huayuan();
			}
			if(menu_index==3)
			{
			 	m_zhaoxian();
			}
			if(menu_index==4)
			{
			 	m_huatu();
			}
			if(menu_index==5)
			{
			 	m_dingbiao();
			}
			dis_en_row(4,0,"do_fun over");
			
		}
	WDR();
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -