📄 main.c
字号:
//=========================================================================================
//作 者:江苏大学 张寿龙 田兆垒 赵生禄
//题 目:悬挂运动控制系统
//备 注:
// 2005年全国大学生电子竞赛
//=========================================================================================
/***********************************
project: 凌阳SPCE61A单片机应用例程
item:系统主程序
version: V1.0
Description:
Author: 江苏大学电气信息工程学院
***********************************/
#include "spce061v004.h"
#include "math.h"
#include "main.h"
int SysStatus=SYS_ST_INITIAL;
extern int PSetStatus;
//
int PositionX,PositionY; //当前位置
int NextPosiX,NextPosiY;
int TimeN,TimePoint,TimeL[400],TimeR[400]; //下一步移动量
int CircleX=40,CircleY=50;
int TimeCountL,TimeCountR;
extern int PSetStatus,CSetStatus;
extern int PSetPosition,CSetPosition;
int DisplayStatus=0;
//运动控制
int Running=0; //0:未开始运动;1:开始运动,但未完成一格运动;2:完成一格运动
//=========================================================================================
//延时
//=========================================================================================
void Delay(unsigned De)
{
while(De--);
}
//=========================================================================================
//主函数
//=========================================================================================
int main()
{
unsigned int key=0;
int D;
int ix,j;
float qq;
int *TrackX1Table,*TrackY1Table,*TrackX2Table,*TrackY2Table;
unsigned int HZCode[10]={0xB5B1,0xC7B0,0xCEBB,0xD6C3,
0x2020,0x2020,0x2020,0x2020,0x2020,0x2020}; //为液晶行赋初值
*P_SystemClock=0x0000; //0000 0000 0000 0000
//端口初始化
*P_IOA_Dir=C_IOA_DIR;
*P_IOA_Attrib=C_IOA_ATTRIB;
*P_IOA_Data=C_IOA_DATA;
*P_IOB_Dir=C_IOB_DIR;
*P_IOB_Attrib=C_IOB_ATTRIB;
*P_IOB_Data=C_IOB_DATA;
LCDinit(); //LCD初始化
*P_Watchdog_Clear=C_WDTCLR;
//启动定时器A
*P_TimerA_Ctrl=0x0015; //0000 0000 0000 1101
*P_TimerA_Data=0xfffe;
*P_INT_Ctrl=0x1000; //C_IRQ1_TMAz;
__asm("INT IRQ");
InitialPage(); //显示启动窗口
while(1) //循环
{
//检查键盘
if(key==0)
{ //key=0,等待按键输入
key=*P_IOA_Data & 0x0f00; //读键盘
if((key&0x0e00)!=0x0e00) //有按键?
{
Delay(20*DELAYINTERNAL2); //延时
if((key&0x0e00)==(*P_IOA_Data & 0x0e00)) //再检测键盘,按键仍在
{
key=key>>8; //键值右移8位
}
else key=0; //无有效按键,键值=0
}
else key=0; //无有效按键,键值=0
}
else
{ //key=0x0100,等待按键释放
if((*P_IOA_Data & 0x0e00)==0x0e00) //无按键?
{
*P_Watchdog_Clear=C_WDTCLR;
Delay(40*DELAYINTERNAL2); //延时
if((*P_IOA_Data & 0x0e00)==0x0e00) key=0; //确认无按键,
} //键盘已释放,键值=0,否则键值不变。
}
*P_Watchdog_Clear=C_WDTCLR;
//根据系统状态执行各功能模块
switch (SysStatus)
{
case SYS_ST_INITIAL: //显示菜单,响应按键操作菜单
if((key&0x000e)!=0)
{
Initial(key); //菜单响应
key=0x0100; //等待按键释放
}
*P_Watchdog_Clear=C_WDTCLR;
break;
case SYS_ST_MENU: //显示菜单,响应按键操作菜单
if((key&0x000e)!=0)
{
Menu(key); //菜单响应
key=0x0100; //等待按键释放
}
*P_Watchdog_Clear=C_WDTCLR;
break;
case SYS_ST_POSITION: //显示设置触发字窗口,等待任意键退回菜单页1
if((key&0x000e)!=0)
{
Position(key);
key=0x0100; //等待按键释放
}
*P_Watchdog_Clear=C_WDTCLR;
break;
case SYS_ST_TRACK: //显示设置门限电压窗口,等待任意键退回菜单页1
if((key&0x000e)!=0)
{
Track(key);
key=0x0100; //等待按键释放
}
*P_Watchdog_Clear=C_WDTCLR;
break;
case SYS_ST_CIRCLE: //显示设置门限电压窗口,等待任意键退回菜单页1
if((key&0x000e)!=0)
{
SetCircle(key);
key=0x0100; //等待按键释放
}
*P_Watchdog_Clear=C_WDTCLR;
break;
case SYS_ST_FOLLOW: //显示运行窗口,等待返回键退回菜单页1
if((key&0x000e)!=0)
{
SetFollow(key);
key=0x0100; //等待按键释放
}
*P_Watchdog_Clear=C_WDTCLR;
break;
}
*P_Watchdog_Clear=C_WDTCLR;
switch (Running) //
{
case 0:
break;
case 1:
break;
case 2:
switch (SysStatus)
{
case SYS_ST_POSITION: //显示菜单,响应按键操作菜单
PositionX=NextPosiX;
PositionY=NextPosiY;
DisplayStatus=1;
break;
case SYS_ST_TRACK: //显示菜单,响应按键操作菜单
TrackX1Table=ReadTrackXAddr(1)+TimePoint;
TrackY1Table=ReadTrackYAddr(1)+TimePoint;
PositionX=(*TrackX1Table)/10;
PositionY=(*TrackY1Table)/10;
DisplayStatus=1;
break;
case SYS_ST_CIRCLE: //显示菜单,响应按键操作菜单
TrackX1Table=ReadTrackXAddr(2)+TimePoint;
TrackY1Table=ReadTrackYAddr(2)+TimePoint;
PositionX=(*TrackX1Table)/10+CircleX;
PositionY=(*TrackY1Table)/10+CircleY;
if(TimeN==1)
{
PositionX=0;PositionY=0;
}
DisplayStatus=1;
break;
case SYS_ST_FOLLOW: //显示菜单,响应按键操作菜单
break;
}
TimePoint++;
TimeN--;
if(TimeN==0)
{
Running=0;
TimePoint=0;
TimeN=0;
}
else
Running=1;
break;
}
if(DisplayStatus==1)
{
PositionDisp();
DisplayStatus=0;
}
*P_Watchdog_Clear=C_WDTCLR;
}
}
//=========================================================================================
//
//=========================================================================================
int LTime(int x1 ,int y1,int x2,int y2)
{
float denominator;
float numerator;
float ls;
float offsetx=1,offsety=1;
int l;
float fx1,fx2,fy1,fy2;
fx1=x1;fx2=x2;fy1=y1;fy2=y2;
switch (SysStatus)
{
case SYS_ST_POSITION: //显示菜单,响应按键操作菜单
offsetx=XOFFSET1;offsety=YOFFSET1;
break;
case SYS_ST_TRACK: //显示菜单,响应按键操作菜单
offsetx=XOFFSET2;offsety=YOFFSET2;
break;
case SYS_ST_CIRCLE: //显示菜单,响应按键操作菜单
offsetx=XOFFSET3;offsety=YOFFSET3;
break;
}
fx1=fx1*offsetx;fx2=fx2*offsetx;
fy1=fy1*offsety;fy2=fy2*offsety;
denominator=(150.0+fx1)*(150.0+fx1)+(1150.0-fy1)*(1150.0-fy1);
denominator=sqrtf(denominator);
numerator=(150.0+fx2)*(150.0+fx2)+(1150.0-fy2)*(1150.0-fy2);
numerator=sqrtf(numerator);
ls=(denominator-numerator)*DELTAN*LOFFSET;
l=ls;
return(l);
}
//=========================================================================================
//
//=========================================================================================
int RTime(int x1,int y1,int x2,int y2)
{
float denominator;
float numerator;
float ls;
float offsetx,offsety;
int l;
float fx1,fx2,fy1,fy2;
fx1=x1;fx2=x2;fy1=y1;fy2=y2;
switch (SysStatus)
{
case SYS_ST_POSITION: //显示菜单,响应按键操作菜单
offsetx=XOFFSET1;offsety=YOFFSET1;
break;
case SYS_ST_TRACK: //显示菜单,响应按键操作菜单
offsetx=XOFFSET2;offsety=YOFFSET2;
break;
case SYS_ST_CIRCLE: //显示菜单,响应按键操作菜单
offsetx=XOFFSET3;offsety=YOFFSET3;
break;
}
fx1=fx1*offsetx;fx2=fx2*offsetx;
fy1=fy1*offsety;fy2=fy2*offsety;
denominator=(950.0-fx1)*(950.0-fx1)+(1150.0-fy1)*(1150.0-fy1);
denominator=sqrtf(denominator);
numerator=(950.0-fx2)*(950.0-fx2)+(1150.0-fy2)*(1150.0-fy2);
numerator=sqrtf(numerator);
ls=(denominator-numerator)*DELTAN*ROFFSET;
l=ls;
return(l);
}
//=========================================================================================
//
//=========================================================================================
void PositionDisp()
{
unsigned int HZCode[10]={0xB5B1,0xC7B0,0xCEBB,0xD6C3,
0x2020,0x2020,0x2020,0x2020,0x2020,0x2020}; //为液晶行赋初值
unsigned int x1,x2,x3,y1,y2,y3;
x1=0x3000+(PositionX/10<<8)+0x0030+PositionX%10;
y1=0x3000+(PositionY/100<<8)+0x0030+(PositionY%100)/10;
y3=0x3020+(PositionY%10<<8);
HZCode[0]=0x783d;HZCode[1]=x1;HZCode[2]=0x2020;HZCode[3]=0x793d;
HZCode[4]=y1;HZCode[5]=y3;HZCode[6]=0x2020;HZCode[7]=0x2020;
LCDWriteLine(4,HZCode);
switch (SysStatus)
{
case SYS_ST_POSITION: //显示菜单,响应按键操作菜单
PSetStatus=1;
PSetPosition=0;
WriteByte(0x92,0);
WriteByte(0x0d,0);
break;
// case SYS_ST_CIRCLE: //显示菜单,响应按键操作菜单
// CSetStatus=1;
// CSetPosition=0;
// WriteByte(0x88,0);
// WriteByte(0x0d,0);
// break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -