IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32简易按键去抖动 -> 正文阅读

[嵌入式]stm32简易按键去抖动

引言:我们经常在使用按键功能时发现,每按一次按键,会触发好几次对应的按键功能,因此我们需要方法去除这种由于按键抖动一起的错误–即为按键去抖动。本文章介绍一种简单的按键去抖动方法。

使用软件工具

软件:stm32cubemx ,keil uVision5,串口接收软件(我使用的是KoalaSerialPort),VScode.

硬件:stm32f103zet6,ST-link下载器,数据线.

STM32CUBEMX相关配置

打开stm32cubemx,点击红圈部分

在这里插入图片描述

查找芯片型号,选择对应芯片
在这里插入图片描述

进行如下初始调整
在这里插入图片描述
在这里插入图片描述

调节时钟树
在这里插入图片描述

打开串口1方便验证防抖动的效果

在这里插入图片描述

接下来我们来查看我使用的这款单片机的按键部分的电路图

在这里插入图片描述

举例选用key0和key1来展示效果。

将对应的PA0和PE4引脚的gpio_output打开

在这里插入图片描述

便于检测判断,将PA0输出低电位,将PE5输出高电位。

在这里插入图片描述

给项目命名,更改IDE为MDK-ARM。

在这里插入图片描述

按如下图进行调整,按GENERATE CODE产生代码

在这里插入图片描述
在这里插入图片描述

项目初始化完成。

代码编写及调试过程

在usart.c中加入串口初始化(便于直接使用printf进行输出)

#include <stdio.h>

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

在main.c中也需要加入#include <stdio.h>。

在while(1)循环中加入

if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_RESET)

  printf("KEY1=1");

  if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)

  {


   HAL_Delay(20);

   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)

   printf("KEY0=1");

  }

按下图设置printf必须项

在这里插入图片描述

进行编译,连接单片机后烧写。连接串口1和电脑。打开串口助手。

可以观察到没有防抖动的KEY1,在按下一次后,产生了多次打印,而KEY0由于有了防抖动,每按一次只打印一次。

在这里插入图片描述

即可验证防抖动程序有效。

实现所有按键都防抖动

在gpio设置中加入其他几个按键对应的引脚,调节输出的电平高低,有需要可以对引脚进行命名。

在这里插入图片描述

在vscode中编写代码,我采用编写key.c和key.h来完成该功能。代码如下

key.h中较为简单

#ifndef KEY_
#define KEY_
int KEY_scan(void);

#endif 

key.c中采用宏定义简化代码,用函数的返回值结合主函数中的switch完成该功能。

#include "stdio.h"
#include "gpio.h"
#include "main.h"

#define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)
#define KEY2 HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)
#define KEY3 HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)


#define GPIO_PIN_RESET 0
#define GPIO_PIN_SET 1 
int KEY_scan(*void*);
{
  if(KEY0==0&KEY1==1&KEY2==1&KEY3==1)
    {
      HAL_Delay(20);
      if(KEY0==1)
      return 0;
      if(KEY1==0)     
      return 1;
      if(KEY2==0)     
      return 2;
      if(KEY3==0)
      return 3;
     }
      return 4;
}

主函数在while(1)中加入switch函数如下

switch(KEY_scan())

  {
    case 0 :  
   {
   printf("KEY0=1");
    break;          
    }  
    case 1 :  
   {
    printf("KEY1=1");
    break;         
    } 
   case 2 :  
   {
    printf("KEY2=1");
    break;         
    }  
    case 3 :  
   {
   printf("KEY3=1");
   break;         
   }  
   default:  break;          
  }

即可完成对单片机(stmf103zet6)上的按键全部完成消抖。

在这里插入图片描述

我是一个刚刚入门的新手,有问题希望各位大佬指正,感谢。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:52:33  更:2022-02-07 13:53:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:35:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码