?? 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 + -