旋转编码器EC11驱动

旋转编码器EC11驱动

/*-------->>>>>>>>--------注意事项:EC11旋转编码器的扫描时间间隔控制在1~4ms之间,
否则5ms及以上的扫描时间在快速旋转时可能会误判旋转方向--------<<<<<<<<--------*/
//*******************************************************************/
//功能:初始化EC11旋转编码器相关参数
//形参:EC11旋转编码器的类型-->>  unsigned char Set_EC11_TYPE  <<--  :0----一定位对应一脉冲;1(或非0)----两定位对应一脉冲。
//返回:无
//详解:对EC11旋转编码器的连接IO口做IO口模式设置。以及将相关的变量进行初始化
//*******************************************************************/
void Encoder_EC11_Init(unsigned char Set_EC11_TYPE)
{
    EC11_A_Now = 1;
    EC11_B_Now = 1;
    EC11_Key = 1;

    //EC11类型选择:0-一定位一脉冲;1-两定位一脉冲
    if(Set_EC11_TYPE == 0)
    {
        EC11_Type = 0;
    }
    else
    {
        EC11_Type = 1;
    }

    //避免上电时EC11旋钮位置不确定导致一次动作误判
    EC11_A_Last = EC11_A_Now;   
    EC11_B_Last = EC11_B_Now;

    //--------清除按键计数器和标志位--------//
    EC11_KEY_COUNT = 0;                     //EC11按键动作计数器
    EC11_KEY_DoubleClick_Count = 0;         //EC11按键双击动作计数器
    FLAG_EC11_KEY_ShotClick = 0;            //EC11按键短按动作标志
    FLAG_EC11_KEY_LongClick = 0;            //EC11按键长按动作标志
    FLAG_EC11_KEY_DoubleClick = 0;          //EC11按键双击动作标志
}



//*******************************************************************/
//功能:扫描EC11旋转编码器的动作并将参数返回给动作分析函数使用
//形参:EC11旋转编码器的类型-->>  unsigned char Set_EC11_TYPE  <<--  :0----一定位对应一脉冲;1(或非0)----两定位对应一脉冲
//返回:EC11旋转编码器的扫描结果-->>  char ScanResult  -->>  0:无动作;1:正转; -1:反转;2:只按下按键;
//                                                       3:按着按键正转;-3:按着按键反转
//详解:只扫描EC11旋转编码器有没有动作,不关心是第几次按下按键或长按或双击。
//返回值直接作为形参传给 [ void Encoder_EC11_Analyze(char EC11_Value); ] 函数使用
//*******************************************************************/
char Encoder_EC11_Scan()
{
//以下储存A、B上一次值的变量声明为静态全局变量,方便对EC11对应的IO口做初始化
//  static char EC11_A_Last = 0;
//  static char EC11_B_Last = 0;
    char ScanResult = 0;    //返回编码器扫描结果,用于分析编码器的动作
                            //返回值的取值:   0:无动作;      1:正转;           -1:反转;  
                            //                  2:只按下按键;    3:按着按键正转;   -3:按着按键反转

    
    EC11_A_Now = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12);
    EC11_B_Now = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13);
    EC11_Key = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14);
    
                            //======================================================//
    if(EC11_Type == 0)      //================一定位对应一脉冲的EC11================//
    {                       //======================================================//
        if(EC11_A_Now != EC11_A_Last)   //以A为时钟,B为数据。正转时AB反相,反转时AB同相
        {
            if(EC11_A_Now == 0)
            {
                if(EC11_B_Now ==1)      //只需要采集A的上升沿或下降沿的任意一个状态,若A下降沿时B为1,正转                    
                    ScanResult = 1;     //正转

                else                    //反转
                    ScanResult = -1;
            }
            EC11_A_Last = EC11_A_Now;   //更新编码器上一个状态暂存变量
            EC11_B_Last = EC11_B_Now;   //更新编码器上一个状态暂存变量
        }
    }   
                            //======================================================//
    else                    //================两定位对应一脉冲的EC11================//
    {                       //======================================================//
        if(EC11_A_Now !=EC11_A_Last)        //当A发生跳变时采集B当前的状态,并将B与上一次的状态进行对比。
        {                                   //若A 0->1 时,B 1->0 正转;若A 1->0 时,B 0->1 正转;
                                            //若A 0->1 时,B 0->1 反转;若A 1->0 时,B 1->0 反转
            if(EC11_A_Now == 1)     //EC11_A和上一次状态相比,为上升沿
            {
                if((EC11_B_Last == 1)&&(EC11_B_Now == 0))   //EC11_B和上一次状态相比,为下降沿
                    ScanResult = 1;                         //正转

                if((EC11_B_Last == 0)&&(EC11_B_Now == 1))   //EC11_B和上一次状态相比,为上升沿               
                    ScanResult = -1;                        //反转

                //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<//
                if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 0))  //A上升沿时,采集的B不变且为0
                    ScanResult = 1;                                 //正转

                if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 1))  //A上升沿时,采集的B不变且为1
                    ScanResult = -1;                                //反转
            }

            else                    //EC11_A和上一次状态相比,为下降沿
            {
                if((EC11_B_Last == 1)&&(EC11_B_Now == 0))   //EC11_B和上一次状态相比,为下降沿
                    ScanResult = -1;                        //反转

                if((EC11_B_Last == 0)&&(EC11_B_Now == 1))   //EC11_B和上一次状态相比,为上升沿
                    ScanResult = 1;                         //正转

                //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<//
                if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 0))  //A上升沿时,采集的B不变且为0
                    ScanResult = -1;                                //反转

                if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 1))  //A上升沿时,采集的B不变且为1   
                    ScanResult = 1;                                 //正转

            }               
            EC11_A_Last = EC11_A_Now;   //更新编码器上一个状态暂存变量
            EC11_B_Last = EC11_B_Now;   //更新编码器上一个状态暂存变量
        }
    }                                                                       

    if(EC11_Key == 0)   //如果EC11的按键按下,并且没有EC11没有转动,
    {
        if(EC11_KEY_COUNT<10000)    //打开按键按下时间定时器
            EC11_KEY_COUNT++;
        if(EC11_KEY_COUNT == KEY_COUNT_DESHAKING)   //按下按键时间到达消抖时间时
        {                                           //置位短按按键标志
            FLAG_EC11_KEY_ShotClick = 1;
        }
        if((EC11_KEY_DoubleClick_Count > 0)&&(EC11_KEY_DoubleClick_Count <= KEY_COUNT_DUALCLICKTIME))   //松开按键后,又在定时器在双击时间内按下按键
        {                                                                                               //置位双击按键标志
            FLAG_EC11_KEY_DoubleClick = 1;
        }

        if(EC11_KEY_COUNT == KEY_COUNT_LONGTIME)    //按下按键时间到达长按时间
        {                                           //置位长按按键标志并复位短按按键标志
            FLAG_EC11_KEY_LongClick = 1;
            FLAG_EC11_KEY_ShotClick = 0;
        }
    }
    else
    {
        if(EC11_KEY_COUNT < KEY_COUNT_DESHAKING)    //没到消抖时长就松开按键,复位所有定时器和按键标志
        {
            EC11_KEY_COUNT = 0;
            FLAG_EC11_KEY_ShotClick = 0;
            FLAG_EC11_KEY_LongClick = 0;
            FLAG_EC11_KEY_DoubleClick = 0;
            EC11_KEY_DoubleClick_Count = 0;
        }
        else
        {
            
            if(FLAG_EC11_KEY_ShotClick == 1)        //短按按键定时有效期间
            {
                if((FLAG_EC11_KEY_DoubleClick == 0)&&(EC11_KEY_DoubleClick_Count >= 0)) 
                    EC11_KEY_DoubleClick_Count++;
                if((FLAG_EC11_KEY_DoubleClick == 1)&&(EC11_KEY_DoubleClick_Count <= KEY_COUNT_DUALCLICKTIME))   //如果在规定双击时间内再次按下按键
                {                                                                                               //认为按键是双击动作
                    FLAG_EC11_KEY_DoubleClick = 2;
                }   

                if((FLAG_EC11_KEY_DoubleClick == 0)&&(EC11_KEY_DoubleClick_Count > KEY_COUNT_DUALCLICKTIME))    //如果没有在规定双击时间内再次按下按键
                    FLAG_EC11_KEY_ShotClick = 0;                                                                //认为按键是单击动作
            }

            if(FLAG_EC11_KEY_LongClick == 1)        //检测到长按按键松开
                FLAG_EC11_KEY_LongClick = 0;
        }
    }

    //>>>>>>>>>>>>>>>>编码器按键分析处理程序<<<<<<<<<<<<<<<<//
    if(EC11_KEY_COUNT > KEY_COUNT_DESHAKING)    //短按按键延时到了时间
    {

        //短按按键动作结束代码
        if((FLAG_EC11_KEY_ShotClick == 0)&&(EC11_KEY_DoubleClick_Count > KEY_COUNT_DUALCLICKTIME)&&(EC11_KEY_COUNT < KEY_COUNT_LONGTIME))   //短按按键动作结束代码
        {
            //--------短按按键动作结束代码--------//
            EC11_NUM_SW++;
            if(EC11_NUM_SW >= 4)
                EC11_NUM_SW = 1;
            ScanResult = 2;
            //--------清除标志位--------//
            EC11_KEY_COUNT = 0;
            EC11_KEY_DoubleClick_Count = 0;
            FLAG_EC11_KEY_DoubleClick = 0;
        }

        //双击按键动作结束代码
        if((FLAG_EC11_KEY_DoubleClick == 2)&&(EC11_KEY_DoubleClick_Count > 0)&&(EC11_KEY_DoubleClick_Count <= KEY_COUNT_DUALCLICKTIME)) //双击按键动作结束代码
        {
            //--------双击按键动作结束代码--------//
            if(EC11_NUM_SW == 5)
                EC11_NUM_SW = 0;
            if(EC11_NUM_SW == 4)
                EC11_NUM_SW = 5;

            if(EC11_NUM_SW <4)
            {
                EC11_NUM_SW = 4;
            }
            ScanResult = 3;
            //--------清除标志位--------//
            EC11_KEY_COUNT = 0;
            EC11_KEY_DoubleClick_Count = 0;
            FLAG_EC11_KEY_ShotClick = 0;
            FLAG_EC11_KEY_DoubleClick = 0;
            
        }

        //连续长按按键按下代码
        if((FLAG_EC11_KEY_LongClick == 1)&&(EC11_KEY_COUNT >= KEY_COUNT_LONGTIME))  //连续长按按键按下代码
        {
            TMP_Value ++;
            if(TMP_Value % KEY_LONG_REPEAT_TIME == 0)
            {
                TMP_Value = 0;
                //-------连续长按按键按下代码--------//
                ScanResult = 4;
            }
        }

        //长按按键动作结束代码
        if((FLAG_EC11_KEY_LongClick == 0)&&(EC11_KEY_COUNT >= KEY_COUNT_LONGTIME))  //长按按键动作结束代码
        {                                                                           
            //--------长按按键按下动作结束代码--------//
            EC11_NUM_SW = 0;
            ScanResult = 5;
            //--------清除标志位--------//
            EC11_KEY_COUNT = 0;
        }
    }
    return ScanResult;      //返回值的取值:   0:无动作;      1:正转;           -1:反转;
}   
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ITE EC数据手册是一本详细记录ITE EC芯片技术参数、性能、使用方法等信息的指南。ITE EC芯片是一种常见的电子控制芯片,通常用于电子设备中的控制和管理功能。该数据手册的出现可以让开发者更好地了解ITE EC芯片的性能和特点,从而更加方便地进行电路设计和嵌入式系统开发。 数据手册中有丰富的技术信息,例如芯片的工作电压、工作温度、尺寸、引脚定义、功能特性及控制信号等。这些信息的详细说明可以帮助开发者精确把握芯片的性能和特点,从而在开发过程中避免一些常见的技术问题。 此外,ITE EC数据手册的中文版大大方便了中国用户的使用。用户可以更加快速地了解芯片的技术参数和操作方法,尤其是对于那些不太熟悉英文的人群,使用中文版手册可以减少理解上的困难。因此,对于华人电子开发者和制造商来说,ITE EC数据手册的中文翻译无疑是一大福利。 ### 回答2: ITE EC 数据手册中文是一份详细的文档,包含有 ITE EC 芯片的规格参数、电气特性、引脚定义、应用注意事项等相关信息。ITE EC 是一种嵌入式控制器芯片,被广泛应用于计算机、通信领域和工控设备等领域。数据手册中包含了 ITE EC 的各种详细参数,方便开发人员能够根据手册中的信息进行相应的开发和调试工作。手册中文翻译质量好,无需担心语言不通带来的沟通问题。 ITE EC 数据手册中文的详细信息可用于帮助开发人员更好的了解该芯片的特殊性质,为制造商、实验室和设计师提供必要的信息,以便将 ITE EC 芯片集成到自己的产品和系统中。同时,该数据手册中文也带来了更好的便利性和可读性,使得使用者能够更加轻松地查找和理解手册中包含的内容。总之,ITE EC 数据手册中文是开发和制造 ITE EC 系统时必不可少的参考文献。 ### 回答3: ITE EC 数据手册是一份详细的技术说明书,可以帮助用户更好地了解 ITE EC 芯片的性能和使用方法。ITE EC 是一种嵌入式控制器,具有多种输入输出功能,可用于电脑、手机、智能家居等领域。该数据手册包含了 ITE EC 芯片的架构、引脚定义、功能特性、寄存器说明等详细内容,对于芯片的开发和应用都有很大的帮助作用。 数据手册中提供了 ITE EC 芯片的电气参数、工作条件和环境要求等重要信息,用户可以根据这些数据和条件要求,进行设计和应用。另外,该手册还提供了 ITE EC 芯片的编程模式、命令集、中断服务等重要内容,这些资料对于芯片的控制和调试非常有用。 IT 和电子工程师、硬件和软件开发者、系统设计师等都可以从 ITE EC 数据手册中获取重要信息,为他们的工作提供帮助。无论是初学者还是高级工程师,在使用 ITE EC 芯片时,都可以从该手册中获得相关的技术资料和技术支持,帮助他们更好地理解和使用 ITE EC 芯片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值