📄 key.c
字号:
#include<math.H>
#define resetB 0xf2 //返回零度标志
#define enterB 0xf1 //确定标志
#define shiftB 0xe3 //切换标志
#define baiB 0xb3 //百位标志
#define shiB 0xd3 //十位标志
#define geB 0x73 //个位标志
#define speed0 {TR0=0;} //停止
#define speed1 {TH0=0x02;TL0=0x18;} //一档,定时为65ms,最慢
#define speed2 {TH0=0x3c;TL0=0xb0;} //二档,定时为50ms,很慢
#define speed3 {TH0=0x63;TL0=0xc0;} //三档,定时为40ms,较慢
#define speed4 {TH0=0x8a;TL0=0xd0;} //四档,定时为30ms,中等
#define speed5 {TH0=0xd8;TL0=0xf0;} //五档,定时为10ms,很快
#define speed6 {TH0=0xec;TL0=0x78;} //六档,定时为5ms,较快
#define speed7 {TH0=0xfc;TL0=0x18;} //七档,定时为1ms,最快
uchar reset=0;
uchar enter=0;
uchar shift=0; //shift=0正向,shift=1反向.shift=2速度
uchar baiwei=0;
uchar shiwei=0;
uchar gewei_s=4;
uchar gewei_a=0;
uint dis=0;
uint tmp_angle=0;
uint angle0=0,angle=0;//输入向量角
int delta1=0,delta2=0;//角度变化量,delta1为变化量,delta2为其360-delta1
uint final_angle=0; //实际要转的角度
uint run_step=0;
uchar v=4;
bit derect=0; //方向位
bit alwaysgo=0;
uint miss_step=0;
#define KPort P3
void KeyDelay(void)
{unsigned char i=10,j=10;
while(i--)
while(j--);
}
void speed(uchar vin)
{
if(vin==0)speed0;
if(vin==1)speed1;
if(vin==2)speed2;
if(vin==3)speed3;
if(vin==4)speed4;
if(vin==5)speed5;
if(vin==6)speed6;
if(vin==7)speed7;
}
void run(void)
{
if(angle>360)
{
if(shift==1)derect=1; //显示负号是反转
if(shift==0)derect=0; //正转
alwaysgo=1;
TR0=1;
} //按设定的速度无角度的旋转
else
{
alwaysgo=0;
delta1=angle-angle0;
delta2=360-abs(angle-angle0);
angle0=angle; //重新设定初值
if(delta1!=0&&delta1!=360) //如果设定的角度不为当前角度,则执行一下语句
{
if(abs(delta1)<=abs(delta2))//若delta1较小,则以delta1为标准角转动
{if(delta1>0){final_angle=delta1;derect=0;TR0=1;} //正转delta1度
else {final_angle=-delta1;derect=1;TR0=1;} //反转delta1度
}
else //若delta2较小,则以delta2为标准角转动
{if(delta2>0){final_angle=delta2;derect=1;TR0=1;} //反转delta2度
else {final_angle=-delta2;derect=0;TR0=1;} //正转delta2度
}
}
else final_angle=0;
}
run_step=final_angle*10/9; //步进电机每步走0.9度,要走x度角,则应走x*10/9步
}
void KeyScan(void)
{
unsigned char temp=0;
KPort=0xff;
temp=KPort&0xf3;
if(temp!=0xf3)
{
KeyDelay();
KPort=0xff;
temp=KPort&0xf3;
if(temp!=0xf3)
{
KPort=0xff;
temp=KPort&0xf3;
}
switch(temp)
{
case resetB:reset=1;angle0=angle0+miss_step*9/10;miss_step=0;angle=0;run();break;
case enterB:reset=0;
if(shift==0||shift==1){angle=tmp_angle;run();}
else {v=gewei_s;speed(v);}
break;
case shiftB:shift++ ;if(shift>2)shift=0 ;reset=0;break;
case baiB :if(shift!=2)baiwei++;if(baiwei>4)baiwei=0;reset=0;break;
case shiB :if(shift!=2)shiwei++;if(shiwei>9)shiwei=0;reset=0;break;
case geB :
if(shift==2) //为速度调节时
{gewei_s++;if(gewei_s>7) gewei_s=0;}
else //为角度调节时
{gewei_a++;if(gewei_a>9) gewei_a=0;}
reset=0;
break;
default:reset=0;break;
}
}
if(shift==2)
dis=gewei_s;
else
{if(reset==1){baiwei=0;shiwei=0;gewei_a=0;dis=0;}
else
dis=baiwei*100+shiwei*10+gewei_a;
tmp_angle=dis;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -