74HC165读取ec11旋转编码器时正、反出现误触

2019-07-14 13:13发布

求助各位大神  现在读取编码器时正、反出现误触,怎样才能优化好正反转,

uint8_t encode_A[4]={2,0,3,1};//Õýת״̬£¬ÏÂÒ»¸ö״̬
uint8_t encode_B[4]={1,3,0,2};//·´×ª×´Ì¬£¬ÏÂÒ»¸ö״̬

unsigned long encode_left=0;
unsigned long encode_right=0;
void Encode_right(void)
{
  static u8 curstat=0;
  static u8 flag;
  flag=(encode_right<<1)|encode_left;
  if(flag==curstat)
  {

  }
  if(flag==encode_A[curstat])
  {
     encode_right++;
  }
  else
  {

  }        
  curstat=flag;
}

void Encode_left(void)
{
  static u8 curstat=0;
  static u8 flag;
  flag=(encode_right<<1)|encode_left;
  if(flag==curstat)
  {

  }
  if(flag==encode_B[curstat])
  {
     encode_left--;
  }
  else
  {

  }
  curstat=flag;
}

uint8_t Joystick_Buffer[13]={0};
uint8_t Joystick_Buffer_Last[13]={0};
void JoystickSend(void)
{         
int  i;
  long int indata1=0;
long int indata2=0;
uint8_t PROcess[8];


u8 cod1_8=0;
u8 cod2_8=0;
u8 cod3_8=0;
u8 cod4_8=0;
u8 cod5_8=0;
u8 cod6_8=0;
u8 cod7_8=0;
u8 cod8_8=0;

  GPIO_WriteBit(GPIOB,SH_LD165,Bit_RESET);//SH-0;
  delay_ms(5);
  GPIO_WriteBit(GPIOB,SH_LD165,Bit_SET);//SH-1;
  delay_ms(5);
  for(i=0;i<32;i++)
  {
    GPIO_WriteBit(GPIOB,CLK165,Bit_RESET);//CLK-0;
    indata1=indata1<<1;      
    if(GPIO_ReadInputDataBit(GPIOB,DATA165)==1)
    {
   indata1=indata1+1;
//                        LED0=0;
   delay_ms(300);
//                        LED0=1;
    }     
     GPIO_WriteBit(GPIOB,CLK165,Bit_SET);//CLK-1;
  }
   for(i=32;i<64;i++)
  {
    GPIO_WriteBit(GPIOB,CLK165,Bit_RESET);//CLK-0;
    indata2=indata2<<1;  
    if(GPIO_ReadInputDataBit(GPIOB,DATA165)==1)
    {
   indata2=indata2+1;
//                        LED0=0;
   delay_ms(300);
//                        LED0=1;                        
    }      
     GPIO_WriteBit(GPIOB,CLK165,Bit_SET);//CLK-1;
  }
cod1_8=((indata1&0xff000000)>>24);
cod2_8=((indata1&0xff0000)>>16);
cod3_8=((indata1&0xff00)>>8);
cod4_8=indata1&0xff;
cod5_8=((indata2&0xff000000)>>24);
cod6_8=((indata2&0xff0000)>>16);
cod7_8=((indata2&0xff00)>>8);
cod8_8=indata2&0xff;

Joystick_Buffer[5] = cod1_8;
Joystick_Buffer[6] = cod2_8;
Joystick_Buffer[7] = cod3_8;
Joystick_Buffer[8] = cod4_8;
Joystick_Buffer[9] = cod5_8;
Joystick_Buffer[10] = cod6_8;
Joystick_Buffer[11] = cod7_8;
Joystick_Buffer[12] = cod8_8;

PROcess[0]=Joystick_Buffer[5]^Joystick_Buffer_Last[5];
Joystick_Buffer_Last[5]=Joystick_Buffer[5];
switch(PROcess[0])
{
   case 0x01:Encode_right();break;
  case 0x02:Encode_left();break;
   case 0x04:LED0=0;delay_ms(10);break;
   case 0x08:LED0=0;delay_ms(10);break;
   case 0x10:LED0=0;delay_ms(10);break;
  case 0x20:LED0=0;delay_ms(10);break;
   case 0x40:LED0=0;delay_ms(10);break;
   case 0x80:LED0=0;delay_ms(10);        break;
  default :LED0=1;break;
}

USB_SIL_Write(EP1_IN, Joystick_Buffer, 13);  
SetEPTxValid(ENDP1);
delay_ms(20);

}uint8_t encode_A[4]={2,0,3,1};//Õýת״̬£¬ÏÂÒ»¸ö״̬
uint8_t encode_B[4]={1,3,0,2};//·´×ª×´Ì¬£¬ÏÂÒ»¸ö״̬

unsigned long encode_left=0;
unsigned long encode_right=0;
void Encode_right(void)
{
  static u8 curstat=0;
  static u8 flag;
  flag=(encode_right<<1)|encode_left;
  if(flag==curstat)
  {

  }
  if(flag==encode_A[curstat])
  {
     encode_right++;
  }
  else
  {

  }        
  curstat=flag;
}

void Encode_left(void)
{
  static u8 curstat=0;
  static u8 flag;
  flag=(encode_right<<1)|encode_left;
  if(flag==curstat)
  {

  }
  if(flag==encode_B[curstat])
  {
     encode_left--;
  }
  else
  {

  }
  curstat=flag;
}

uint8_t Joystick_Buffer[13]={0};
uint8_t Joystick_Buffer_Last[13]={0};
void JoystickSend(void)
{         
int  i;
  long int indata1=0;
long int indata2=0;
uint8_t PROcess[8];


u8 cod1_8=0;
u8 cod2_8=0;
u8 cod3_8=0;
u8 cod4_8=0;
u8 cod5_8=0;
u8 cod6_8=0;
u8 cod7_8=0;
u8 cod8_8=0;

  GPIO_WriteBit(GPIOB,SH_LD165,Bit_RESET);//SH-0;
  delay_ms(5);
  GPIO_WriteBit(GPIOB,SH_LD165,Bit_SET);//SH-1;
  delay_ms(5);
  for(i=0;i<32;i++)
  {
    GPIO_WriteBit(GPIOB,CLK165,Bit_RESET);//CLK-0;
    indata1=indata1<<1;      
    if(GPIO_ReadInputDataBit(GPIOB,DATA165)==1)
    {
   indata1=indata1+1;
//                        LED0=0;
   delay_ms(300);
//                        LED0=1;
    }     
     GPIO_WriteBit(GPIOB,CLK165,Bit_SET);//CLK-1;
  }
   for(i=32;i<64;i++)
  {
    GPIO_WriteBit(GPIOB,CLK165,Bit_RESET);//CLK-0;
    indata2=indata2<<1;  
    if(GPIO_ReadInputDataBit(GPIOB,DATA165)==1)
    {
   indata2=indata2+1;
//                        LED0=0;
   delay_ms(300);
//                        LED0=1;                        
    }      
     GPIO_WriteBit(GPIOB,CLK165,Bit_SET);//CLK-1;
  }
cod1_8=((indata1&0xff000000)>>24);
cod2_8=((indata1&0xff0000)>>16);
cod3_8=((indata1&0xff00)>>8);
cod4_8=indata1&0xff;
cod5_8=((indata2&0xff000000)>>24);
cod6_8=((indata2&0xff0000)>>16);
cod7_8=((indata2&0xff00)>>8);
cod8_8=indata2&0xff;

Joystick_Buffer[5] = cod1_8;
Joystick_Buffer[6] = cod2_8;
Joystick_Buffer[7] = cod3_8;
Joystick_Buffer[8] = cod4_8;
Joystick_Buffer[9] = cod5_8;
Joystick_Buffer[10] = cod6_8;
Joystick_Buffer[11] = cod7_8;
Joystick_Buffer[12] = cod8_8;

PROcess[0]=Joystick_Buffer[5]^Joystick_Buffer_Last[5];
Joystick_Buffer_Last[5]=Joystick_Buffer[5];
switch(PROcess[0])
{
   case 0x01:Encode_right();break;
  case 0x02:Encode_left();break;
   case 0x04:LED0=0;delay_ms(10);break;
   case 0x08:LED0=0;delay_ms(10);break;
   case 0x10:LED0=0;delay_ms(10);break;
  case 0x20:LED0=0;delay_ms(10);break;
   case 0x40:LED0=0;delay_ms(10);break;
   case 0x80:LED0=0;delay_ms(10);        break;
  default :LED0=1;break;
}

USB_SIL_Write(EP1_IN, Joystick_Buffer, 13);  
SetEPTxValid(ENDP1);
delay_ms(20);

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。