硬件消抖按键单次触发程序响应

硬件消抖按键模块采用硬件消除按键的抖动,在学习测试新型号单片机时是非常好的工具。本文选用源地的CH32V103C8T6的最小核心板进行了测试。

                                                            消抖按键模块

                                                  源地CH32V103C8T6核心板

刚开始的按键测试程序,如下:

 u8 inputFlag;
 while(1)
 {
  inputFlag=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
  if(inputFlag==0)
  {
      printf("Input is Active\r\n");
  } 
 }

运行后通过串口助手发现,当按键按下,串口就接收到大量数据,可以想见是程序导致的,因为按键一直为低(虽然只有几十毫秒),所以单片机一直发送信息。

改进1

u8 inputFlag;
 while(1)
 {
  inputFlag=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
  if(inputFlag==0)
  {
      printf("Input is Active\r\n");
      Delay_Ms(100);//增加的延时,超过按键按下的时间
  } 
 }

效果可以,但感觉使用太占用CPU.

改进2

u8 inputFlag;
 u8 inputFlagOld;//增加的记录按键过去状态
 while(1)
 {
  inputFlag=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
  if(inputFlag!=inputFlagOld)//如果新旧状态不一致,则认为按键已经按下
  {
     printf("Input is Active\r\n");
  }
   inputFlagOld=inputFlag;
 }
 }

取消了延时,也消除了大量串口输出,但按键抬起时也会触发一次串口输出。

改进3

 u8 inputFlag;
 u8 inputFlagOld;//增加的记录按键过去状态
 while(1)
 {
  inputFlag=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
  if((inputFlag!=inputFlagOld)&&(inputFlag==0))//如果新旧状态不一致,则认为按键已经按下
  {                                           //且只有按键按下才发送数据
     printf("Input is Active\r\n");
  }
   inputFlagOld=inputFlag;
 }
 }

效果很好!按键按下只触发一次串口输出。

完整代码

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : armxu
 * Version            : V1.0.0
 * Date               : 2020/04/30
 * Description        : 演示硬件消抖按键的单次触发串口输出。基于MounRiver Studio
 *******************************************************************************/
 #include "debug.h"
 ​
 /* Global typedef */
 ​
 /* Global define */
 u8 inputFlag,inputFlagOld;
 /* Global Variable */
 void GPIO_INPUT_INIT(void)
 {
     GPIO_InitTypeDef GPIO_InitStructure = {0};
 ​
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
 }
 ​
 /*******************************************************************************
 * Function Name  : main
 * Description    : Main program.
 * Input          : None
 * Return         : None
 *******************************************************************************/
 int main(void)
 {
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
     Delay_Init();
     GPIO_INPUT_INIT();
     USART_Printf_Init(115200);
     printf("SystemClk:%d\r\n",SystemCoreClock);
     printf("This is printf example\r\n");
 ​
     while(1)
     {
      inputFlag=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
 ​
 ​
      if((inputFlag!=inputFlagOld)&&(inputFlag==0))
      {
          printf("Input is Active\r\n");
      }
      inputFlagOld=inputFlag;
     }
 }
 ​
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

armcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值