stm32 按键控制实验

发布者:RadiantRiver最新更新时间:2022-11-16 来源: stm32 按键控制实验关键字:stm32  按键控制  消抖 手机看文章 扫描二维码
随时随地手机看文章

一旦用到按键,一个关键的问题就是消抖,如果对这个问题不管的话,会引起很多难以控制的问题,最常见的就是反复进入中断导致程序飞出。


目前我手里的这款32有四个按键,上PA0是高电,左下右PE234是低电


操作步骤:



持续胡扫描key.c

#include "system.h"

#define KEY_LEFT_Pin GPIO_Pin_2    //定义K_LEFT管脚

#define KEY_DOWN_Pin GPIO_Pin_3    //定义K_DOWN管脚

#define KEY_RIGHT_PinGPIO_Pin_4    //定义K_RIGHT管脚

#define KEY_UP_Pin GPIO_Pin_0      //定义KEY_UP管脚

#define KEY_Port (GPIOE)    //定义端口

#define KEY_UP_Port (GPIOA) //定义端口


//使用位操作定义

#define K_UP  PAin(0)

#define K_DOWN  PEin(3)

#define K_LEFT  PEin(4)

#defineK_RIGHT  PEin(2)  


//使用读取管脚状态库函数定义

//#define K_UPGPIO_ReadInputDataBit(KEY_UP_Port,KEY_UP_Pin)

//#define K_DOWNGPIO_ReadInputDataBit(KEY_Port,KEY_DOWN_Pin)

//#define K_LEFTGPIO_ReadInputDataBit(KEY_Port,KEY_LEFT_Pin)

//#define K_RIGHTGPIO_ReadInputDataBit(KEY_Port,KEY_RIGHT_Pin)


//定义各个按键值

#define KEY_UP 1

#define KEY_DOWN 2

#define KEY_LEFT 3

#define KEY_RIGHT 4

void KEY_Init(void);

u8 KEY_Scan(u8 mode);


void KEY_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;     //定义结构体变量

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);

    GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin;  //选择你要设置的IO口

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;    //下拉输入

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;   //设置传输速率

    GPIO_Init(KEY_UP_Port,&GPIO_InitStructure);    /*初始化GPIO*/

    GPIO_InitStructure.GPIO_Pin=KEY_DOWN_Pin|KEY_LEFT_Pin|KEY_RIGHT_Pin;

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;   //上拉输入 

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(KEY_Port,&GPIO_InitStructure);

}


u8 KEY_Scan(u8 mode)

{

   int i,j;

    static u8 key = 1;

    if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))  

    {

         for(i = 0;i < 10;i++)

         {

          for(j = 0;j < 50; j++)

   {}

}

          key=0;

          if(K_UP==1){

               return KEY_UP;

           }

          else if(K_DOWN==0){

              return KEY_DOWN;

          }

          else if(K_LEFT==0){

              return KEY_LEFT;

          }

          else{

              return KEY_RIGHT;

          }

    }

    else if(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1)    

         {

             key=1;

          }

    if(mode==1)    //??????

         {

              key=1;

           }

      return 0;

 }


扫描模式带有一个形参,0扫描一次,1持续扫描


关键字:stm32  按键控制  消抖 引用地址:stm32 按键控制实验

上一篇:stm32 蜂鸣器
下一篇:stm32 系统滴答定时器

推荐阅读最新更新时间:2024-11-20 11:04

STM32——GPIO的CRL、CRH和CNF与MODE的关系
GPIO的CRL、CRH和CNF与MODE的关系 STM32的CRL控制着每个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。 CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。
[单片机]
STM32如何使用定时器实现微秒(us)级延时?
在STM32微控制器中,可以使用定时器实现微秒级延时。具体来说,可以使用定时器的计数器和自动重装载寄存器来生成精确的延时。 以下将详细介绍如何使用定时器实现微秒级延时的步骤: 步骤 1:配置定时器 首先,需要选择一个适合的定时器。大多数STM32微控制器都配备了多个定时器,因此,可以根据需求选择一个可用的定时器。一般来说,TIM2和TIM3定时器是常用的,具备较高的精度和可编程性。 接下来,需要进行定时器的基本配置,包括时钟源、计数模式、分频系数等。可以根据具体需求,选择合适的配置参数。通常情况下,可以选择内部时钟源作为定时器的时钟源,并将分频系数设置为最小,以获得最高的精度。 步骤 2:设置计数周期 接下来,需要设置定时器的计数
[单片机]
STM32学习015_2_IIC通信
IIC也是一种串行通信方式,由飞利浦公司提出,并形成一个标准; IIC有以下特点: 1.二线制,串行数据线SDA和串行时钟线SCA; 2.无中心主机,每个器件有一个唯一的地址,既可以工作在主模式,又可以工作在从模式,(多主多从如何通信?) 3,软件寻址; 4.应答式数据传输过程(保证数据的稳定和可靠); 5.节点可带电接入或者撤出;(采用开漏输出,一般接口处会接上拉) 开始信号:空闲状态下,SDA 是1,SCL保持1,SDA来一个下降沿 停止信号:SCL保持1,SDA来一个上升沿 发送数据的过程:8位数据传输 第一个字节是7个从器件的地址+1个方向位,从器件会有一个应答位A(应答位为低电平),第二个字节开始发数据包,一直到发送数据
[单片机]
STM32固件库V3.4移值到Keil MDK v4.12 图文详解
1:本例所用到的MCU是STM32F103VET6,已经过测试,如果是其它MCU的话,只需作小许修改即可。 2:首先按下图所示建立相应用的文件夹,注意层次关系: 3:下图是工程文件夹里相应的文件: 接照上图所示,在相应的文件夹里放放相关的 .C 文件,在startup里放入相应的 .s文件 ,对于Keil 其文件在 \Libraries\startup\arm 里面可找到。 4:接着就打开Keil MDK V4.12,新建一个工程并选择好器件: 点击 品 字形的图标,建好组: 5:下图是建好组后的图并在CoreSupport组里 Add Files 了一个文件: 6:下
[单片机]
<font color='red'>STM32</font>固件库V3.4移值到Keil MDK v4.12 图文详解
stm32 printf函数重定向
#include stm32f10x.h #include stdio.h void RCC_Configuration(void);//首先设置系统时钟为8MHZ void GPIO_Configuration(void); void USART_Configuration(void); /* Function Name : fputc Description : 重定向这个C库中的(stdio) printf函数,文件流到串口流USART1 Input : ch,*f Output : None Return : None */ int fputc(int ch,F
[单片机]
<font color='red'>stm32</font> printf函数重定向
STM32 GPIO使用超强总结
STM32GPIO使用 操作步骤: 1. 使能GPIO对应的外设时钟 例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE); 2. 声明一个GPIO_InitStructure结构体 例如: GPIO_InitTypeDef GPIO_InitStructure; 3. 选择待设置的GPIO管脚 例如://选择待设置的GPIO第7、8、9管脚位 ,中间加“|”符号 GPIO_InitStructure.GPIO_Pin = G
[单片机]
STM32 x 翌控科技 x 米尔电子 | STM32MP135开放式高实时高性能PLC控制器解决方案发布
01前言 随着工业数字化进程加速与IT/OT深入融合,不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产,而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点,如何获取更加精准的OT数据对数字化进程起到至关重要的作用,同时随着国内工业控制系统逐步进入中高端应用,更加精准的控制至关重要,因此工业控制系统高实时高性能需求尤其突出。 面对以上挑战,合作伙伴翌控科技基于米尔STM32MP135开发板发布开放式高实时高性能PLC控制器解决方案,将高精准数据采集、预处理、存储、通信与高实时控制融为一体,为控制系统迈向完全数字化中高端控制提供一个非常好的选择。 02STM32MP135处理器简介 STM32MP1
[嵌入式]
<font color='red'>STM32</font> x 翌控科技 x 米尔电子 | STM32MP135开放式高实时高性能PLC<font color='red'>控制</font>器解决方案发布
STM32+FATFS文件系统连续在同一个txt文件里写入内容
移植好fatfs文件系统之后,我们经常要在一个txt文件下写入数据,但是这些数据可能需要多次写入,那怎么办呢? 通过这几天的学习,有以下函数可以帮助我们进行多次写入数据。 1.打开文件 f_open(filescr2, 0:/201711022.txt , FA_OPEN_DEFAULT); 2.写数据 f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1); 3.关闭文件 f_close(filescr1);//一定要关闭 第二次写入数据 1.打开文件 f_open(filescr2, 0:/201711022.txt , FA_OPEN_DEFAULT); 2.
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved