能否组合这两个IO口的状态位?

[复制链接]
3153|9
 楼主| xzhenggen 发表于 2007-7-20 08:46 | 显示全部楼层 |阅读模式
这两个IO是P2_3及P3_6,用这两个IO口检测两个电位序列,00为0,01为1,10为2,11为3.能否组合成这种方式?status = (P2_3<<0)|(3_6<<1);我要用这个状态来看其转向变化值确定方向。实现以下语句 if(prev != status){......
prev = status;  }  
 楼主| xzhenggen 发表于 2007-7-20 10:29 | 显示全部楼层

为什么C51里,不能使用status = (P2_3<<0)|(3_6<<1);

那我如何判断它的组合状态:00为0,01为1,10为2,11为3.
ayb_ice 发表于 2007-7-20 10:47 | 显示全部楼层

可以这样

status = ((unsigned char)P23)|(((unsigned char)P36)<<1);
但是还不如下面方便易懂
status = 0;
if(P23) status |= 1;
if(P36) status |= 2;
switch(status)
{

}
 楼主| xzhenggen 发表于 2007-7-20 11:16 | 显示全部楼层

上面的判断语句好像不能整合啊。

if(P23) status |= 1;
if(P36) status |= 2;
如果我现在的引脚状态此时是:P23是低电平(0),P35也是低电平(0)。
那我如何实现把P23,P36设置成uchar idata status=0;中的status的第0位及P1位,就像P23,P36是status的默认的第0位,第一位一样。我最终的要求就是实现P23,P36是status的默认的第0位,第一位.判断检测两个电位序列,00为0,01为1,10为2,11为3.
ethunter 发表于 2007-7-20 13:18 | 显示全部楼层

3楼的方法可行

status这个变量定义成uchar,那么他就有两为,和1取|关系就是控制低位,和2取|的关系是控制高低,这样你在swicth里只要用4个case就可以了,如分析有错误请指出,新人出来砸道
 楼主| xzhenggen 发表于 2007-7-20 14:11 | 显示全部楼层

还是不能识别它的状态。

zhiwei 发表于 2007-7-20 14:48 | 显示全部楼层

三楼方法很好啊

但是还不如下面方便易懂
status = 0;
if(P23) status |= 1;
if(P36) status |= 2;
switch(status)
{

}
读两个口状态到status里面,status值为0~3,就是那四个组合状态了。
也可以这样:也是4个状态,可能效率还要高一点。
if(P23)
{
  if(P36)
  { }
  else
  { }
}
else
{
  if(P36)
  { }
  else
  { }
}
 楼主| xzhenggen 发表于 2007-7-20 16:35 | 显示全部楼层

多谢了,没有更好的方法,上面的也很不错。

正是我想要的,为什么我就想不到呢?真晕死了。
Airwill 发表于 2007-7-20 21:04 | 显示全部楼层

这样不行吗?
status = ((P2>>3)&1)|((P3>>5)&2); 
 楼主| xzhenggen 发表于 2007-7-21 15:38 | 显示全部楼层

呵呵,不错!!能否先定义下来?。。。。。。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

529

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部