2021-09-24

STM32使用外部中断进行按键检测方法

各种按键处理逻辑程序。
https://blog.51cto.com/u_13719208/2107561https://blog.51cto.com/u_13719208/2107561
简单方法:
1、清中断标志位
2、禁止EXTI中断
3、点亮LED
4、使能EXTI中断
高级方法:
检测按键,可以用定时扫描的方法。
按下按键
这个一般不用EXIT中断。 因为按下一次其实会有下降沿 上升沿 还有中间的毛刺。产生几次正常。
要解决好这个问题最好用定时中断(10毫米)。定时中断里面检测下降沿 上升沿 多测几次滤除毛刺。
定时中断里:

static uint8_t Key_IO_stats=0;
static uint8_t Key_IO_Oldstats=0;
Key_IO_stats <<=1;
if(Key_IO)
Key_IO_stats +=1;

你只需要在程序的某个地方检测Key_IO_stats
这里还要记住上次的状态
如果是变为0xFF 那就是变高了
if((Key_IO_stats0xff)&&(Key_IO_Oldstats0))
{
Key_IO_Oldstats=0xff;
}
如果是变为0 那就是变低了
if((Key_IO_stats0)&&(Key_IO_Oldstats0xff))
{
Key_IO_Oldstats=0;
}
其他时候就是正在检测中(8次检测过滤 8次连续为1才为高,8次连续第才为低,其他的都不算。检测次数可以调整 )

2 给你个鼠标按键按下、弹起,上下双沿检测程序,单次响应,逻辑稍微复杂一点。一般用的都比这简单。

typedef struct
{
unsigned LDOWN :6;
unsigned LDEN :1;
unsigned LDOWN7 :1;
unsigned LUP :6;
unsigned LUEN :1;
unsigned LUP7 :1;
unsigned RDOWN :6;
unsigned RDEN :1;
unsigned RDOWN7 :1;
unsigned RUP :6;
unsigned RUEN :1;
unsigned RUP7 :1;
}Mouse_Key;

extern Mouse_Key MsKey;

void Button_Process(void)
{
if(BUTTON_IsPressed(PS2_BUTTON_LEFT) == true)
{
LED_On(LED_D3);
if (MsKey.LDEN == 1)
{
if (MsKey.LDOWN >= 5)
{
MsKey.LDOWN7 = 1;
MsKey.LDEN = 0;
MsKey.LUEN = 1;
}
else
{
MsKey.LDOWN++;
}
}

    MsKey.LUP = 0;
}
else
{
    LED_Off(LED_D3);
    MsKey.LDOWN = 0;

    if (MsKey.LUEN == 1)
    {
        if (MsKey.LUP >= 5)
        {
            MsKey.LUP7 = 1;
            MsKey.LUEN = 0;
            MsKey.LDEN = 1;
        }
        else
        {
            MsKey.LUP++;
        }
    }
}
if(BUTTON_IsPressed(PS2_BUTTON_RIGHT) == true)
{
    LED_On(LED_D4);
    if (MsKey.RDEN == 1)
    {
        if (MsKey.RDOWN >= 5)
        {
            MsKey.RDOWN7 = 1;
            MsKey.RDEN = 0;
            MsKey.RUEN = 1;
        }
        else
        {
            MsKey.RDOWN++;
        }
    }

    MsKey.RUP = 0;
}
else
{
    LED_Off(LED_D4);
    MsKey.RDOWN = 0;

    if (MsKey.RUEN == 1)
    {
        if (MsKey.RUP >= 5)
        {
            MsKey.RUP7 = 1;
            MsKey.RUEN = 0;
            MsKey.RDEN = 1;
        }
        else
        {
            MsKey.RUP++;
        }
    }
}

}

MsKey.LDOWN7,MsKey.LUP7,MsKey.RDOWN7, MsKey.RUP7,4个标志位在主程序中处理完才清除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值