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

📄 main.c

📁 2005年全国大学生电子设计竞赛论文集
💻 C
📖 第 1 页 / 共 3 页
字号:
							break;
						case 2:
							center1=temp1*10+temp2;
							center2=temp3*100+temp4*10+temp5;
							status=7;
							flashnum=23;
							temp1=0;
							temp2=0;
							dispcon[0]=0x0020;
							dispcon[1]=0x0020;
							dispcon[2]=0x0020;
							dispcon[3]=0x0020;
							dispcon[4]=0x0020;
							dispcon[5]=0x0052;
							dispcon[6]=0x0061;
							dispcon[7]=0x0064;
							dispcon[8]=0x0069;
							dispcon[9]=0x0075;
							dispcon[10]=0x0073;
							dispcon[11]=0x0020;
							dispcon[12]=0x0020;
							dispcon[13]=0x0020;
							dispcon[14]=0x0020;
							dispcon[15]=0x0020;
							dispcon[16]=0x0020;
							dispcon[17]=0x0020;
							dispcon[18]=0x0020;
							dispcon[19]=0x0020;
							dispcon[20]=0x0020;
							dispcon[21]=0x0020;
							dispcon[22]=0x0020;
							dispcon[23]=0x0030;
							dispcon[24]=0x0030;
							dispcon[25]=0x0020;
							dispcon[26]=0x0020;
							dispcon[27]=0x0020;
							dispcon[28]=0x0020;
							dispcon[29]=0x0020;
							dispcon[30]=0x0020;
							dispcon[31]=0x0020;
							break;
						case 3:
							if(ready)
							{
								status=6;
								vectorlast[0]=vector[0];
								vectorlast[1]=vector[1];
								voice_trace();
								asm("IRQ ON");
							}
							break;
						case 4:
							x=temp1*10+temp2;
							y=temp3*100+temp4*10+temp5;
							prex=x;
							prey=y;
							a=sqrt((x+15)*(x+15)+(115-y)*(115-y))/LineStep;
							b=sqrt((95-x)*(95-x)+(115-y)*(115-y))/LineStep;
							status=1;
							flashnum=24;
							voice_ini((int)x,(int)y);
							temp1=0;
							temp2=0;
							temp3=0;
							temp4=0;
							temp5=0;
							dispcon[0]=0x0061;
							dispcon[1]=0x0078;
							dispcon[2]=0x0069;
							dispcon[3]=0x0073;
							dispcon[4]=0x0020;
							dispcon[5]=0x003a;
							dispcon[6]=0x0020;
							dispcon[7]=0x0020;
							dispcon[8]=0x0058;
							dispcon[9]=0x0020;
							dispcon[10]=0x0020;
							dispcon[11]=0x0020;
							dispcon[12]=0x0020;
							dispcon[13]=0x0059;
							dispcon[14]=0x0020;
							dispcon[15]=0x0020;
							dispcon[16]=0x0076;
							dispcon[17]=0x0061;
							dispcon[18]=0x006c;
							dispcon[19]=0x0075;
							dispcon[20]=0x0065;
							dispcon[21]=0x003a;
							dispcon[22]=0x0020;
							dispcon[23]=0x0020;
							dispcon[26]=0x0020;
							dispcon[27]=0x0020;
							dispcon[31]=0x0020;
							break;
						case 7:
							//圆心判断程序
							Radius=temp1*10+temp2;
							if((center1+Radius<=80)&&(center1-Radius>=0)&&(center2-Radius>=0)&&(center2+Radius<=100&&Radius>=10))
							{
								voice_circle(center1,center2,Radius);
								num=Limit+1;
								for(i=0;i<Limit;i++)
								{
									vertices[i*2]=center1+Radius*table[i*2];
									vertices[i*2+1]=center2+Radius*table[i*2+1];
								}
								pointer=Limit-1;
								status=5;
								time=0;
								asm("IRQ ON");
							}
							break;
					}
					//确认键 在1 2 3状态下转到5 6状态 保存状态 4状态转到1状态
					break;
				case 0x0c00:
					if(status==4||status==3)
					{
						*P_IOA_Data=*P_IOA_Buffer|0x2000;
						while(*P_IOA_Data&0x0080)//等待按键放开
						{
							*P_IOA_Data=*P_IOA_Buffer|0x1000;
							for(i=0;i<IWait;i++)
								for(j=0;j<JWait;j++)
									*P_Watchdog_Clear=0x0001;
							//延时
							*P_IOA_Data=*P_IOA_Buffer&0xefff;
							for(i=0;i<IWait;i++)
								for(j=0;j<JWait;j++)
									*P_Watchdog_Clear=0x0001;
							//延时
							b--;	//调整绳长
						}
						x=(a*LineStep*a*LineStep-b*LineStep*b*LineStep+8800)/220;
						y=115-sqrt(a*LineStep*a*LineStep-(15+x)*(15+x));
					}
					//右电机上拉	
					if(status==1)
					{
						num++;
						vertices[pointer*2]=temp1*10+temp2;
						vertices[pointer*2+1]=temp3*100+temp4*10+temp5;
						temp1=0;
						temp2=0;
						temp3=0;
						temp4=0;
						temp5=0;
						flashnum=24;
						pointer++;
					}
					break;
				case 0x0d00:
					if(status==4||status==3)
					{
						*P_IOA_Data=*P_IOA_Buffer&0xdfff;
						while(*P_IOA_Data&0x0080)//等待按键放开
						{
							*P_IOA_Data=*P_IOA_Buffer|0x1000;
							for(i=0;i<IWait;i++)
								for(j=0;j<JWait;j++)
									*P_Watchdog_Clear=0x0001;
							//延时
							*P_IOA_Data=*P_IOA_Buffer&0xefff;
							for(i=0;i<IWait;i++)
								for(j=0;j<JWait;j++)
									*P_Watchdog_Clear=0x0001;
							//延时
							b++;	//调整绳长
						}
						x=(a*LineStep*a*LineStep-b*LineStep*b*LineStep+8800)/220;
						y=115-sqrt(a*LineStep*a*LineStep-(15+x)*(15+x));
					}
					//右电机下拉
					break;
				case 0x0e00:
					if(status==4||status==3)
					{
						*P_IOA_Data=*P_IOA_Buffer&0xfffd;
						while(*P_IOA_Data&0x0080)//等待按键放开
						{
							*P_IOA_Data=*P_IOA_Buffer|0x0001;
							for(i=0;i<IWait;i++)
								for(j=0;j<JWait;j++)
									*P_Watchdog_Clear=0x0001;
							//延时
							*P_IOA_Data=*P_IOA_Buffer&0xfffe;
							for(i=0;i<IWait;i++)
								for(j=0;j<JWait;j++)
									*P_Watchdog_Clear=0x0001;
							//延时
							a--;	//调整绳长
						}
						x=(a*LineStep*a*LineStep-b*LineStep*b*LineStep+8800)/220;
						y=115-sqrt(a*LineStep*a*LineStep-(15+x)*(15+x));
					}
					//左电机上拉
					break;
				case 0x0f00:
					if(status==4||status==3)
					{
						*P_IOA_Data=*P_IOA_Buffer|0x0002;
						while(*P_IOA_Data&0x0080)//等待按键放开
						{
							*P_IOA_Data=*P_IOA_Buffer|0x0001;
							for(i=0;i<IWait;i++)
								for(j=0;j<JWait;j++)
									*P_Watchdog_Clear=0x0001;
							//延时
							*P_IOA_Data=*P_IOA_Buffer&0xfffe;
							for(i=0;i<IWait;i++)
								for(j=0;j<JWait;j++)
									*P_Watchdog_Clear=0x0001;
							//延时
							a++;	//调整绳长
						}
						x=(a*LineStep*a*LineStep-b*LineStep*b*LineStep+8800)/220;
						y=115-sqrt(a*LineStep*a*LineStep-(15+x)*(15+x));
					}
					//左电机下拉
					break;
			}
			flag=1;
			if(status==1||status==2)
			{
				dispcon[24]=temp1+0x0030;
				dispcon[25]=temp2+0x0030;
				dispcon[28]=temp3+0x0030;
				dispcon[29]=temp4+0x0030;
				dispcon[30]=temp5+0x0030;
			}
			if(status==4)
			{
				dispcon[20]=temp1+0x0030;
				dispcon[21]=temp2+0x0030;
				dispcon[27]=temp3+0x0030;
				dispcon[28]=temp4+0x0030;
				dispcon[29]=temp5+0x0030;
			}
			if(status==3)
			{
				reccounter=0;
				for(j=0;j<8;j++)
				{
					*P_IOB_Data=(*P_IOB_Buffer&0xfff0)|j;
					for(i=0;i<100;i++)
						;
					if(*P_IOA_Data&0x8000)
					{
						rec[j]=0;
						reccounter++;
					}
					else
						rec[j]=1;
				}
				if(reccounter==1||reccounter==2)
					ready=1;
				else
					ready=0;
				if(ready)
				{
					dispcon[4]=0x0020;
					dispcon[5]=0x0020;
					dispcon[6]=0x0052;
					dispcon[7]=0x0065;
					dispcon[8]=0x0061;
					dispcon[9]=0x0064;
					dispcon[10]=0x0079;
					dispcon[11]=0x0020;
					dispcon[12]=0x0020;
					dispcon[23]=0x0020;
					dispcon[24]=0x0020;
					//U 0x0055  23
					//D 0x0044
					//L 0x004c  24
					//R 0x0052
					vector[0]=0;
					vector[1]=0;
					if(rec[0]==0)
					{
						vector[0]+=vectortab[0];
						vector[1]+=vectortab[1];
						dispcon[24]=0x0052;
					}
					if(rec[2]==0)
					{
						vector[0]+=vectortab[4];
						vector[1]+=vectortab[5];
						dispcon[23]=0x0044;
					}
					if(rec[4]==0)
					{
						vector[0]+=vectortab[8];
						vector[1]+=vectortab[9];
						dispcon[24]=0x004c;
					}
					if(rec[6]==0)
					{
						vector[0]+=vectortab[12];
						vector[1]+=vectortab[13];
						dispcon[23]=0x0055;
					}
					if(rec[1]==0)
					{
						vector[0]+=vectortab[2];
						vector[1]+=vectortab[3];
						dispcon[23]=0x0044;
						dispcon[24]=0x0052;
					}
					if(rec[3]==0)
					{
						vector[0]+=vectortab[6];
						vector[1]+=vectortab[7];
						dispcon[23]=0x0044;
						dispcon[24]=0x004c;
					}
					if(rec[5]==0)
					{
						vector[0]+=vectortab[10];
						vector[1]+=vectortab[11];
						dispcon[23]=0x0055;
						dispcon[24]=0x004c;
					}
					if(rec[7]==0)
					{
						vector[0]+=vectortab[14];
						vector[1]+=vectortab[15];
						dispcon[23]=0x0055;
						dispcon[24]=0x0052;
					}
				}
				else
				{
					dispcon[4]=0x0053;
					dispcon[5]=0x0065;
					dispcon[6]=0x0061;
					dispcon[7]=0x0072;
					dispcon[8]=0x0063;
					dispcon[9]=0x0068;
					dispcon[10]=0x0069;
					dispcon[11]=0x006e;
					dispcon[12]=0x0067;
					dispcon[23]=0x0020;
					dispcon[24]=0x0020;
				}
			}
			if(status==7)
			{
				dispcon[23]=temp1+0x0030;
				dispcon[24]=temp2+0x0030;
			}
			if(status==1||status==2||status==3||status==4||status==7)
				lcd_disp(dispcon,flashnum);
		}
		if (flag)
		{
			while(*P_IOA_Data&0x0080)//等待按键放开   //IOA7  做为键是否放开的依据
				*P_Watchdog_Clear=0x0001;
			flag=0;
		}
		*P_Watchdog_Clear=0x0001;
	}
}
//=========================================================================================
//
//=========================================================================================
void initialIO()
{
	*P_IOB_Dir=(*P_IOB_Dir&0xfff0)|0x000f;
	*P_IOB_Attrib=(*P_IOB_Attrib&0xfff0)|0x000f;
	*P_IOB_Data=(*P_IOB_Buffer&0xfff0)|0x0000;
	//IOB0-IOB3用于探测器的控制口 同相输出 110
	*P_IOA_Dir=(*P_IOA_Dir&0xf0ff)|0x0000;
	*P_IOA_Attrib=(*P_IOA_Attrib&0xf0ff)|0x0000;
	*P_IOA_Data=(*P_IOA_Buffer&0xf0ff)|0x0000;
	//IOA8-IOA11作为键盘数据的输入口 下拉输入 000
	*P_IOA_Dir=(*P_IOA_Dir&0xff7f)|0x0000;
	*P_IOA_Attrib=(*P_IOA_Attrib&0xff7f)|0x0000;
	*P_IOA_Data=(*P_IOA_Buffer&0xff7f)|0x0000;
	//IOA7作为键盘输入 下拉输入 000
	*P_IOA_Dir=(*P_IOA_Dir&0xff8f)|0x0000;
	*P_IOA_Attrib=(*P_IOA_Attrib&0xff8f)|0x0070;
	*P_IOA_Data=(*P_IOA_Buffer&0xff8f)|0x0070;
	//IOA4-IOA6悬浮无唤醒输入 011
	*P_IOA_Dir=(*P_IOA_Dir&0x8fff)|0x7000;
	*P_IOA_Attrib=(*P_IOA_Attrib&0x8fff)|0x7000;
	*P_IOA_Data=(*P_IOA_Buffer&0x8fff)|0x0000;
	//IOA12-IOA14作为左电机控制口 同相输出 110
	*P_IOA_Dir=(*P_IOA_Dir&0xfff8)|0x0007;
	*P_IOA_Attrib=(*P_IOA_Attrib&0xfff8)|0x0007;
	*P_IOA_Data=(*P_IOA_Buffer&0xfff8)|0x0000;
	//IOA0-IOA2作为右电机控制口 同相输出 110
	//从低到高依次为脉冲输出 电机方向 是否在无输入时锁定 默认正转
}
//=========================================================================================
//
//=========================================================================================
void initialStatus()
{
	double temp;
	prex=0;
	prey=0;
	x=0;
	y=0;
	
	temp=115.9741/LineStep;
	a=(long)temp;
	//初始长度115.9741cm
	temp=149.1643/LineStep;
	b=(long)temp;
	//初始长度149.1643cm
	//假设初始在原点0,0
	
	num=0;		//任务队列中还有多少个点
	arrive=1;	//当前坐标是否到达指定点
	left=0;		//左电机剩余驱动步数
	right=0;	//右电机剩余驱动步数
	pointer=0;
	status=4;
	flashnum=20;
	dispcon[0]=0x0020;
	dispcon[1]=0x0020;
	dispcon[2]=0x0020;
	dispcon[3]=0x0020;
	dispcon[4]=0x0049;
	dispcon[5]=0x004e;
	dispcon[6]=0x0049;
	dispcon[7]=0x0054;
	dispcon[8]=0x0049;
	dispcon[9]=0x0041;
	dispcon[10]=0x004c;
	dispcon[11]=0x0020;
	dispcon[12]=0x0020;
	dispcon[13]=0x0020;
	dispcon[14]=0x0020;
	dispcon[15]=0x0020;
	dispcon[16]=0x0020;
	dispcon[17]=0x0020;
	dispcon[18]=0x0020;
	dispcon[19]=0x0020;
	dispcon[20]=0x0030;
	dispcon[21]=0x0030;
	dispcon[22]=0x0020;
	dispcon[23]=0x0020;
	dispcon[24]=0x0020;
	dispcon[25]=0x0020;
	dispcon[26]=0x0020;
	dispcon[27]=0x0030;
	dispcon[28]=0x0030;
	dispcon[29]=0x0030;
	dispcon[30]=0x0020;
	dispcon[31]=0x0020;
	lcd_disp(dispcon,flashnum);
	//测试用
}
//=========================================================================================
//
//=========================================================================================
void initialISR()
{
	unsigned int temp;
	*P_INT_Ctrl=0x0040;	//打开IRQ4_1KHz中断作为处理键盘
}

// x=(a*a-b*b-11875)/250
//	(15+x)^2+(100-y)^2=a^2
//  (110-x)^2+(100-y)^2=a^2

⌨️ 快捷键说明

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