各位大虾,同学好,很久没来学习了,谢谢。
附件的程序功就是扫描按键 输入相应的位置开关控制电机 正反转到 相应位置停止 ,
相应个点开关值
P4 p3 p2 p1 p0
keyi1 1 1 1 0 0
keyi2 1 1 0 0 1
keyi3 1 0 0 1 1
keyi4 0 0 1 1 1
keyi5 0 1 1 1 0
相应的程序可以运行 ,但是有问题 ,当输入键后,就死循环了,跑到相应位置才会停,
请教各位:
1 是否 可以循环中 判断键盘输入 ,判断后按新的输入运行?
2 电机 跑到相应位置后 ,按相应的键开关 ,电机任然会 点动 ,是什么问题?
理想情况应该先判断 是否是相应键值,是电机就不动作.
谢谢各位
// 判断 P2位置接近开关状态, 开关动作输出低电平
// 输入按键位置,输入后,电机产生对应的正反转,转到相应位置停止,要判断当前位置
#include"reg51.h"
#define uchar unsigned char
sbit a0 = P2^0;// 开关位置
sbit a1 = P2^1;
sbit a2 = P2^2;
sbit a3 = P2^3;
sbit a4 = P2^4;
sbit keyi1 = P3^7;//键盘输入1
sbit keyi2 = P3^6;//键盘输入2
sbit keyi3 = P3^5;//键盘输入3
sbit keyi4 = P3^4;//键盘输入4
sbit keyi5 = P3^3;//键盘输入5
sbit cw = P1^4;//继电器动作,电机正转
sbit rw = P1^0;//继电器动作,电机反转
void delay(uchar i)
{
uchar j;
for (j = i; j >0; j--)
;
}
void main(void)
{
P1 =0xff;
P2 =0xff;
cw = 1;
rw = 1;
while(1)
{
if(keyi1 == 0)
{
delay(20);
if(keyi1==0)
while(1)
{
if(P2==0xfc)
{
rw = 1;
cw = 1;
break;
}
else
{
rw =0;
}
}
}
if(keyi2 == 0)
{
delay(20);
if(keyi2 == 0)
while(1)
{
if(P2 == 0xf9)
{
cw = 1;
rw = 1;
break;
}
else if(P2 < 0xf9)
{
rw = 0;
}
else
{
cw = 0;
}
}
}
if(keyi3==0)
{
delay(20);
if(keyi3 == 0)
while(1)
{
if(P2 == 0xf3)
{
cw = 1;
rw = 1;
break;
}
else if (P2 < 0xf3)
{
rw = 0;
}
else
{
cw = 0;
}
}
}
if(keyi4 == 0)
{
delay(20);
if(keyi4 == 0)
while(1)
{
if(P2== 0xe7)
{
cw = 1;
rw = 1;
break;
}
else if ((P2==0xef)||(P2== 0xee))
{
rw = 0;
}
else
{
cw = 0;
}
}
}
if (keyi5 == 0)
{
delay(20);
if (keyi5 == 0)
while(1)
{
if(P2== 0xee)
{
cw = 1;
rw = 1;
break;
}
else
{
cw = 0;
}
}
}
}
}
|