|
发表于 2013-12-15 12:06:09
|
显示全部楼层
嗯,我也是这么处理的
IO口可以上升沿和下降沿中断的话就简单
不过如果IO口不能中断的话,对速度不高,精度不高的场合可以用定时器去勉强实现
可中断时实现
//A,B相对应IO口处理
//必须用暂时变量,IO值处理过程中可能变动
uint8 itempA;
uint8 itempB;
uint8 itemp;
uint8 iRe;
itempA = IOPort_GetAState();
itempB = IOPort_GetBState();
itemp =Motor_StateJudge(itempA, itempB);
iRe =Motor_StateJumpOK(itemp, Motor_m_LastState);
if(!iRe)
{
//最后保存新AB的状态;
Motor_m_LastAState = itempA;
Motor_m_LastBState = itempB;
Motor_m_LastState =itemp;
}
/****************************************************************
功能:状态编码
原型:uint8 Motor_StateJudge(uint8 a, uint8 b)
输入:AB相即时状态
输出:状态编码号(0~3)
*****************************************************************/
uint8 Motor_StateJudge(uint8 a, uint8 b)
{
uint8 mTmp;
if(a==0 &&b==1)
mTmp =0;
else if(a==1 &&b==1)
mTmp =1;
else if(a==1 &&b==0)
mTmp =2;
else if(a==0 &&b==0)
mTmp =3;
return mTmp;
}
/****************************************************************
功能:状态转变判别
原型:uint8 Motor_StateJumpOK(uint8 mStateNow, uint8 mStateLast)
输入:当前状态,上一状态;
输出:1非法跳变,0合法跳变
*****************************************************************/
uint8 Motor_StateJumpOK(uint8 mStateNow, uint8 mStateLast)
{
}
|
|