查看: 2254|回复: 0
打印 上一主题 下一主题

旋转编码器程序

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-21 22:13:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned int keysacn()        //扫描法,需改进,不太好用
{
//    AB
//正转 00->01->11->10->00->01->
//反转 00->10->11->01->00->10->

        unsigned char i,x,value;
        value=P0&0x3;         
        if(!(key_A == i & key_B == x) )
        {
                if(value==0x00)
                {
                        DelayMs(10);  
                        value=P0&0x3;                         //需再次读取io口,否则无法判断
                           if(value==0x01){VOL++;}
                          if(value==0x03){VOL--;}                                                                          
                }
                if(value==0x01)
                {
                        DelayMs(10);
                          value=P0&0x3;
                            if(value==0x03){VOL++;}
                          if(value==0x00){VOL--;}                                                                          
                  }
                if(value==0x03)
                  {
                        DelayMs(10);
                           value=P0&0x3;
                            if(value==0x02){VOL++;}
                          if(value==0x01){VOL--;}                                                                          
                  }
                if(value==0x02)
                {
                        DelayMs(10);
                          value=P0&0x3;
                            if(value==0x00){VOL++;}
                          if(value==0x03){VOL--;}                                                                          
                  }

                  
        }
        i = key_A;         
        x = key_B;

        return VOL ;
}

小弟用的程序,但结果不太好用,转得太快的时候会出错,有时不正确。
于是我用了中断法,但结果更惨,加的数有时太多,转得太快或太慢都觉得不好用,比不上音响上面的转动的好用,

void INT0_ISR( void ) interrupt 0        //外部中断法,需改进,不好用
{        
        unsigned int x;                                       
        for(x=0;x<10;x++);                                //延时去抖动                  
        if(key_B==0){VOL++;}        
        if(key_B==1){VOL--;}
               
}

-----------------------------------------------------------------------------------------------------------------------------------
网上的程序太多,太复杂了看不懂,请高手帮看下,那里要改进,并得到合适好用的转动数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表