关于使用M16按键控制2个步进电机问题??
我使用M16学习板写了程序控制两个步进电机,按下SD按键(接PA0)两个步进电机正转;按下S1(接PA1)按键电机1正转,电机2停;按下S2(接PA2)按键电机2正转,电机1停止;按下S3(接PA3)按键两个步进电机反转。但为什么只有当前面的程序执行完后,按下的键才有效,为什么不能马上按下按键马上执行呢????程序如下 !请各位老师帮忙看一下是哪里问题!感觉感激!
(注:PD、PB口输出驱动步进电机)
#include <iom16v.h>
//#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uintunsigned int
ucharFFW={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
ucharREV={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
voidmotor_ffw(uchar n)
{
uchar i;
uintj;
for (j=0; j<12*n; j++) //转1×n圈
{
for (i=0; i<8; i++) //一个周期转30度
{
PORTB= FFW;
PORTD=FFW;
delay(2); //调节转速
}
}
}
//***********************************************************
voidmotor_ffw1(uchar n)
{
uchar i;
uintj;
for (j=0; j<12*n; j++) //转1×n圈
{
for (i=0; i<8; i++) //一个周期转30度
{
PORTD = FFW; //取数据
delay(1); //调节转速
}
}
}
//********************************************************
voidmotor_ffw2(uchar n)
{
uchar i;
uintj;
for (j=0; j<12*n; j++) //转1×n圈
{
for (i=0; i<8; i++) //一个周期转30度
{
PORTB = FFW; //取数据
delay(1); //调节转速
}
}
}
/*
/*步进电机反转
/*
/********************************************************/
voidmotor_rev(uint n)
{
uchar i;
uintj;
for (j=0; j<12*n; j++) //转1×n圈
{
for (i=0; i<8; i++) //一个周期转30度
{
PORTD= REV; //取数据
PORTB = REV;
delay(1); //调节转速
}
}
}
//*******************************************************
uchar key_press() //按键子函数 ,带返回值的子函数
{
uchar j; //定义变量J
DDRA|=0X0F;//按键低4位输出,其它不变
PORTA|=0X0F;//按键低4位输出高电平,其它不变
DDRA&=0XF0;//按键低4位输入,其它不变
j=PINA; //对变量J赋值
j=j&0X0F;//00001111进行与运算,判断按键是否有按下
if(j==0X0F)//如果按键没有按下返回0,如按下返回1给key_press
{
return 0;
}
else
{
return 1;
}
}
//***********************************************************************
uchar key_scan() //扫描子函数
{
uchar key; //定义变量KEY
delay(10); //延时10MS再次确定按键是否有被按下
if(key_press())//判断按键 是否有被按下,则key_press为1,如按下则执行如下语句
{
key=PINA; //对变量KEY进行赋值
key&=0X0F; //进行运算判断一下是否真的有按下,如真的有按下,则有如下情况
switch(key) //条件语句
{
case 0X0E: //a0按下所对应的数据 ,并执行KEY为1
key=0X0E;
break;
case 0X0D: //a1按下
key=0X0D;
break;
case 0X0B: //a2按下
key=0X0B;
break;
case 0X07: //a3按下
key=0X07;
break;
default: //什么也没有按下
key=0;
break;
}
while(key_press());//判断一下是否有松开
}
else //如果没有按下则执行如下语句
{
key=0; //变量赋值16
}
return key; //返回KEY给key_scan扫描函数
}
//*********************************************************/
//*******主函数
void main()
{
uchar q;
DDRB=0XFF;
DDRD=0XFF;
while(1)
{
q=key_scan();
if (q==0x0E) //双正转
{
motor_ffw(50);
}
//**********************************************************************
if (q==0X0D)//单启动
{
motor_ffw1(50);
}
//*****************************************************************************
if (q==0X0B) //单启动
{
motor_ffw2(50);
}
//*********************************************************************
if (q==0X07)//双倒转
{
motor_rev(50);
}
//****************************************************************
}
} 还在for里循环着呢,怎么可能马上反应 就是就是,马上改改
页:
[1]