51单片机矩阵键盘控制直流电机

下面的程序要完成以下任务:

按下按键1使其“以任意速度启动”,

按下按键2使其“正转”,

按下按键3使其“反转”,

按下按键4使其“加速2s”,

按下按键5使其“减速2s”,

按下按键6使其“停止”。

是程序有问题还是电机连接问题?

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_KEY P1                    
uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A
uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D
uchar speed;
sbit moto=P1^0;
void delay(uint i)
{
	while(i--);
}
	
//电机顺时针转动
void MotorCW(void)
{
 uchar i;
 for(i=0;i<4;i++)
  {
  GPIO_KEY=phasecw[i];
   delay(speed);
  }
}
//停转
void MotorStop()
{
 GPIO_KEY=0x00;
}
//电机逆时针转动
void MotorCCW()
{
 uchar i;
 for(i=0;i<4;i++)
  {
 GPIO_KEY=phaseccw[i];
   delay(speed);
  }
}
//电机启动
void MotorOpen()
{
  uchar num;
  moto=0;
	for(num=0;num<100;num++)
	{
		moto=1;
		delay(5000);
	}
}
void keydown()
{
	uchar x = 5, y = 5;
	char a=0;
	GPIO_KEY=0x0f;
	if(GPIO_KEY!=0x0f)
	{
		delay(1000);
		if(GPIO_KEY!=0x0f)
		{
			switch(GPIO_KEY)
			{
				case(0x07):y=1;break;
				case(0x0b):y=2;break;
				case(0x0d):y=3;break;
				case(0x0e):y=4;break;
				default:		y = 5; break;
			}
			GPIO_KEY=0xf0;
			switch(GPIO_KEY)
			{
				case(0x70):x=1;break;
				case(0xb0):x=2;break;
				case(0xd0):x=3;break;
				case(0xe0):x=4;break;
				default:		x = 5; break;
			}
			if(x=1,y=1)
		{
			MotorOpen();
		}
		if(x=1,y=2)
		{
			MotorCW();
		}
		if(x=1,y=3)
		{
			MotorCCW();
		}
		if(x=1,y=4)
		{
			uchar b;
			for(b=0;b<=200;b++)
			{
				speed++;
				delay(1000);
			}
			}
     if(x=2,y=1)
		 {
			 uchar c;
			for(c=0;c<=200;c++)
			{
				speed--;
				delay(1000);
		 }
		}
		 if(x=2,y=2)
		 {
			 MotorStop();
		 }
	 }
 }
}
void main()
{
	moto=0;
	while(1)
	{
		keydown();
	}
}

 

嗷嗷,我再去试试

那改完之后这个程序是没有错误的,那是我连接电机连的不对么?为什么不能用矩阵键盘控制