因仑“3+1”工程特种兵精英论坛

标题: 旋转编码器程序 [打印本页]

作者: 左耳    时间: 2016-6-21 22:13
标题: 旋转编码器程序
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--;}
               
}

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





欢迎光临 因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4