pangbin4 发表于 2012-1-8 09:27:10

关于使用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);
       
       
       
       }               
//****************************************************************
   
        }
}

yzjgod 发表于 2012-1-11 14:43:43

还在for里循环着呢,怎么可能马上反应

hpdell 发表于 2012-4-18 16:12:31

就是就是,马上改改
页: [1]
查看完整版本: 关于使用M16按键控制2个步进电机问题??