按键扫描函数,松手检测

首先说明一下我这个按键扫描函数的作用,我要实现的是长按按键就关闭MCU所有外设,即进入睡眠模式,睡眠之后可以使用这个按键进行唤醒MCU,那么这里就要考虑一个误唤醒的问题,所以思路是长按之后进行一个假睡眠(我这里的表现就是关闭小灯),松手之后才会真正意义上的执行睡眠指令,开启中断,进入睡眠模式。

首先说明几个变量的作用:

1、Release_cnt:松手之后或者没有按下按键进行累加,用以按下按键松手之后的消抖;

2、Presse_cnt:按键按下进行累加,消抖作用;

3、Key1_Flag:按键按下标志,设置按键状态,防止重复触发的作用;

4、Key1_Pressed:标志位,为1表示按键确认按下了;

5、Key1_Function:也是一个标志位,为1去执行相应的操作;

6、Key1_Released:标志位:为1表示按键按下有效并且确认松手了;

下面是一个大概的流程图; 

下面是具体的按键扫描函数,长按关机,松手有效,单次触发; 

void KeyScan(void)
{
    //单纯短按按键
    if(!KEY1)
    {
        Release_cnt = 0;
        if(!Key1_Flag)
        {
            Presse_cnt++;
            if(Presse_cnt >= 1000)		//1s长按防抖
            {
                Key1_Flag = 1;			//设置按键状态,防止重复触发
                Key1_Pressed = 1;
                Key1_Function = 1;
            }
        }
    }
    else
    {
        if(Key1_Pressed)
        {
            Release_cnt++;
            if(Release_cnt >= 50)		//50ms释放防抖
            {
                Key1_Pressed = 0;
                Key1_Released = 1;
            }
        }
        Presse_cnt = 0;
        Key1_Flag = 0;
    }
}

下面是主函数里的while循环,Key1_Function这个标志长按不松手就置1,现象就是P20引脚电平拉高,熄灭小灯;松手之后Key1_Released置1,就开启中断进入睡眠;

 while (1)
    {
        delay_ms(1);

        KeyScan();
        if(Key1_Function)
        {
            Key1_Function = 0;
            printf("Sleep Ready.\r\n");
            P20 = 1;    //LED OFF(关闭外设,准备进入休眠)
        }
        if(Key1_Released)
        {
            Key1_Released = 0;
            printf("MCU Sleep.\r\n");

            IE0  = 0;   //外中断0标志位
            EX0 = 1;    //INT0 Enable

            IT0 = 1;        //INT0 下降沿中断       
        //  IT0 = 0;        //INT0 上升,下降沿中断  

            _nop_();
            _nop_();
            PCON |= 0x02;   //Sleep
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            printf("MCU Wakeup.\r\n");
            P20 = 0;    //LED ON
        }
    }

最后注意嗷,相应的判断标志在进入之后一定要清0。

相关推荐

  1. 32单片机按键扫描 实现长短按

    2024-07-15 12:08:05       65 阅读
  2. 27、数据存储&秒表(定时器扫描按键数码管)

    2024-07-15 12:08:05       53 阅读
  3. 单片机精进之路-4独立按键扫描

    2024-07-15 12:08:05       49 阅读
  4. STM32-GPIO输入——按键检测

    2024-07-15 12:08:05       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 12:08:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 12:08:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 12:08:05       58 阅读
  4. Python语言-面向对象

    2024-07-15 12:08:05       69 阅读

热门阅读

  1. Python——调用自定义包(__init__.py)

    2024-07-15 12:08:05       24 阅读
  2. Windows中配置Python 3.11环境安装教程

    2024-07-15 12:08:05       27 阅读
  3. 前端热门面试问题(五)

    2024-07-15 12:08:05       22 阅读
  4. 解决PyCharm中的文件格式关联错误:终极指南

    2024-07-15 12:08:05       19 阅读