|
我用网上找的解码程序,发现要旋转两格才有输出,于是使用的春风里面的解码程序,发现编码器也是旋转两格才有输出,大家有没有遇到过这个问题?请大家进讨论一下,一下是我用的几种解码程序,都是旋转两个才有输出:
#define KeyA() (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))//GPIOC->IDR & GPIO_Pin_6
#define KeyB() (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7))//GPIOC->IDR & GPIO_Pin_7
//其中FlagUp FlagDown 分别代表左旋,右旋
第一种春风电源程序里得解码程序:
static vu16 key5del = 100;//按键5禁止延时
static vu16 key6del = 100;//按键6禁止延时
vu8 a,c,d;
static vu8 Key5Circs = 0;//按键5状态
static vu8 Key6Circs = 0;//按键6状态
for(a = 0;a < 50;a++);
if(KeyA() == 0) c = 0;
else c = 1;
for(a = 0;a < 50;a++);
if(KeyB() == 0) d = 0;
else d = 1;
if(key5del > 0) key5del --;//按键5禁止延时
if(key6del > 0) key6del --;//按键6禁止延时
if((c == 0)&&(d == 0)&&(Key5Circs == 0)&&(key5del == 0)) Key5Circs = 1; //c0,d0
else if((c == 0)&&(d == 1)&&(Key5Circs == 1)) Key5Circs = 2; //c0,d1
else if((c == 1)&&(d == 1)&&(Key5Circs == 2)) Key5Circs = 3; //c1,d1
else if((c == 1)&&(d == 0)&&(Key5Circs == 3)) Key5Circs = 4; //c1,d0
else if((c == 0)&&(d == 0)&&(Key5Circs == 4)) {Key5Circs = 0; FlagDown = 1;Key6Circs = 0;key6del = 100;} //c0,d0 按键有效
if((c == 0)&&(d == 0)&&(Key6Circs == 0)&&(key6del == 0)) Key6Circs = 1; //c0,d0
else if((c == 1)&&(d == 0)&&(Key6Circs == 1)) Key6Circs = 2; //c1,d0
else if((c == 1)&&(d == 1)&&(Key6Circs == 2)) Key6Circs = 3; //c1,d1
else if((c == 0)&&(d == 1)&&(Key6Circs == 3)) Key6Circs = 4; //co,d1
else if((c == 0)&&(d == 0)&&(Key6Circs == 4)) {Key6Circs = 0; FlagUp = 1;Key5Circs = 0;key5del = 100;} //c0,d0 按键有效
第二种网上的程序:
void ReadSwith(void)
{
static u8 Aold; //定义了变量用来储蓄上一次调用此方法是编码开关两引脚的电平
if(KeyA()==0&&Aold==1) //如果当前编码开关的两个引脚都为底电平执行下面的步骤
{
if(KeyB()) //为高说明编码开关在向加大的方向转
{
FlagUp=1; FlagDown=0;
}
else
{
FlagUp=0; FlagDown=1;
}
}
Aold = KeyA() ;
}
u8 ReadSwith()//
{
static u8 Aold,Bold; //定义了两个变量用来储蓄上一次调用此方法是编码开关两引脚的电平
static u8 st; //定义了一个变量用来储蓄以前是否出现了两个引脚都为高电平的状态
u8 tmp = 0;
if(KeyA() &&KeyB() )
st = 1; //
if(st) //如果st为1执行下面的步骤
{
if(KeyA()==0&&KeyB()==0) //如果当前编码开关的两个引脚都为底电平执行下面的步骤
{
if(Bold) //为高说明编码开关在向加大的方向转
{
st = 0;
tmp++; //
}
if(Aold) //为高说明编码开关在向减小的方向转
{
st = 0;
tmp--; //设返回值
}
}
}
Aold = KeyA();
Bold = KeyB();
return tmp;
}
以上三种程序我都测试,都是旋转2格才有输出,大家来看看是什么问题,是不是编码器不对啊? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|