合泰单片机 | HT66F3195 | 个人库开发过程 | 【9】GPIO - 编码器

关于编码器

我个人喜欢称为滚轮,不知道为什么要叫编码器。
一般的滚轮的触发是顺时针旋转,逆时针旋转以及一般都有一个按键,这个跟普通按键一样的。
旋转会让其中两跟引脚的波形发生,这里也说不清是怎么变化,而且我单看那个手册提供的波形我也看不明白,一般我都是直接配合逻辑分析仪来捕获那个波形然后根据波形变化规律去写程序的。
滚轮的规格都差不多,或者说原理差不多,掌握之后面对其他规格的滚轮,代码稍作修改就可以接着用了。

原理跟普通按键检测有点类似,不过是从判断0和1变成判断两根线组合的状态。

程序配置

Wheel.h

#ifndef _WHEEL_H_
#define _WHEEL_H_

typedef struct
{
    unsigned char After_Status;
    unsigned char Before_Status;
    unsigned char Trigger_condition;        /* 0x01:顺时针,0xFF:逆时针 */
    unsigned char Debounce_Cnt;

}Wheel_Task_T;

extern Wheel_Task_T Wheel_1;

void Wheel_GPIO_Init();
void Wheel_Scan();

#endif

Wheel.h

void Wheel_GPIO_Init()
{
	unsigned char i = 0;

	if(GPIOA_4_Get_Status() != 0)
        i |= 0x01;

    if(GPIOA_5_Get_Status() != 0)
        i |= 0x02;

    Wheel_1.Trigger_condition = 0;
    Wheel_1.Debounce_Cnt = 0;
    Wheel_1.After_Status = 0;
    Wheel_1.Before_Status = i;

    GPIOA_4_Control(IO_Input);
    GPIOA_4_Pullup(Enable);

    GPIOA_5_Control(IO_Input);
    GPIOA_5_Pullup(Enable);
}

void Wheel_Scan()
{
    unsigned char i = 0;

    if(GPIOA_4_Get_Status() != 0)
        i |= 0x01;

    if(GPIOA_5_Get_Status() != 0)
        i |= 0x02;

    if(i != Wheel_1.Before_Status)
    {
        Wheel_1.Before_Status = i;
        Wheel_1.Debounce_Cnt = 2;
    }
    else if(Wheel_1.Debounce_Cnt != 0)
    {
        Wheel_1.Debounce_Cnt -= 1;
        if(Wheel_1.Debounce_Cnt == 0)
        {
            if((Wheel_1.Before_Status == 1)&&(Wheel_1.After_Status == 3))
            {
                Trigger_condition = 0x01;
            }
            else if((Wheel_1.Before_Status == 2)&&(Wheel_1.After_Status == 3))
            {
                Trigger_condition = 0xFF;
            }
            Wheel_1.After_Status = Wheel_1.Before_Status;
        }
    }
}

void Wheel_Handle()
{
	if(Trigger_condition == 0x01)
	{
		Trigger_condition = 0;
		GPIOA_6_Control(IO_Output);
        GPIOA_6_Toggle();
	}
	if(Trigger_condition == 0xFF)
	{
		Trigger_condition = 0;
		GPIOA_7_Control(IO_Output);
		GPIOA_7_Toggle();
	}
}

main.c

if(TB0.FragmentFlag & Fragment_1ms_Mask)
{
    TB0.FragmentFlag ^= Fragment_1ms_Mask;
    Wheel_Scan();
    Wheel_Handle();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值