| 
  if(!PinA && PinA_O && PinB) {
                Now++;
            }PinA_O = PinA;               
            if(!PinB && PinB_O && PinA) {
                Now--;
            }PinB_O = PinB;     
 
 只有六行代碼就能用EC11對Now進行加減操作
 
 为什么这样写呢?
 上时序图
 顺时针转:
 
  
 逆时针转:
 
  
 我们看到,当顺时针转时
 Pin A会早于Pin B 转低电平,反之亦然
 
 代码解读:
 !PinA && PinA_O && PinB//当Pin A 为低电平而之前为高电平(即下降沿)并且Pin B为高电平
 这一句就捕捉到顺时针转时序图中箭指着的那一刹那的情况
 于是Now加1
 
 !PinB && PinB_O && PinA//当Pin B 为低电平而之前为高电平(即下降沿)并且Pin A为高电平
 这一句就捕捉到逆时针转时序图中箭指着的那一刹那的情况
 于是Now减1
 
 
 
 如果编码器不加电容消抖
 就用软件消抖
 
  if(ScanCount++ > 50) {        //其数值按单片机速度加减
            ScanCount = 0;
            if(PinA && !PinA_O && PinB) {
                Now++;
            }PinA_O = PinA;               
            if(PinB && !PinB_O && PinA) {
                Now--;
            }PinB_O = PinB;                        
            Now>9? Now = 0:_nop_();
            Now<0? Now = 9:_nop_();
        }
 
 现附上小应用实例一则
 基如STC15F104E的EC11软串口六位密码检查程序
 如发现顺逆时针相反,对调PinA/PinB 定义脚即可
 
 |