io翻转 stm32 标准库 |
您所在的位置:网站首页 › stm32io口翻转速度 › io翻转 stm32 标准库 |
【STM32】标准库与HAL库对照学习教程外设篇--按键控制
一、前言二、准备工作三、按键介绍四、硬件图五、标准库控制按键六、HAL库控制按键
一、前言
本篇介绍关于如何使用STM32控制按键,并使用标准库与HAL库同时配置按键以增加您对按键的理解,希望对您有所帮助。
本篇讲解的是使用软件控制按键,关于使用中断控制按键,可以参考这篇文章:【STM32】标准库与HAL库对照学习教程五–外部中断详讲与配置 二、准备工作 STM32开发板(我用的是普中的STM32F103ZE开发板)cubemx软件、keil 5(MDK)开发板原理图 三、按键介绍按键是一种电子开关,使用时按开关按钮,开关导通,当松开手时,开关断开。 抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。如下图所示 按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。 按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。 硬件消抖:按键电路有过滤的电容,可以吸收不稳定的抖动信号。软件消抖:通过软件延时一段时间,等抖动时间过去后再进按键状态判断,一般为5ms 到 10ms。我的开发板没有过滤电容进行硬件消抖,所以我用的是软件消抖(一般也是用软件消抖) 四、硬件图根据自己开发板的原理图来。 关于工程配置在我写的教程篇中已有详细介绍,这里不进行阐述,直接给出控制程序。 main.c #include "LED.h" #include "Delay.h" #include "System.h" #include "key.h" /************************************************* *函数名: main *函数功能: 主函数 *输入: 无 *返回值: 无 **************************************************/ int main() { SysTick_Init(72); LED_Init(); KEY_Soft_Init(); while(1) { Key = KEY_Scan(1); switch(Key) { case NONE: break; case key_up: LED_0 = !LED_0; break; //LED0电平翻转 case key0: LED_1 = 0; break; //LED1点亮 case key1: LED_1 = 1; break; //LED1熄灭 default :break; } } }key.c #include "key.h" #include "Delay.h" #include "System.h" /************************************************* *函数名: KEY_Soft_Init *函数功能: 按键初始化 *输入: 无 *返回值: 无 **************************************************/ void KEY_Soft_Init() { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(KEY_UP_RCC|KEY_RCC, ENABLE); //打开对应端口时钟 /************引脚初始化************/ GPIO_InitStruct.GPIO_Pin = KEY_UP_Pin; //WU_UP引脚 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; //下拉输入模式 GPIO_Init(KEY_UP_GPIO_Port, &GPIO_InitStruct); //初始化引脚 GPIO_InitStruct.GPIO_Pin = KEY_Pin; //KEY1与KEY0引脚 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式 GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct); //初始化引脚 } /************************************************* *函数名: KEY_Scan *函数功能: 按键扫描 *输入: Mode:1-支持连按,0-不支持连按 *返回值: key枚举类型,key_up:KEY_UP按键按下,Key1: KEY1按键按下 ,Key0: KEY0按键按下,NONE: 没有按键按下 **************************************************/ key KEY_Scan(u16 Mode) { static u16 KEY_Value = 1; if(Mode == 1) KEY_Value = 1; //是否支持连按 if( KEY_Value == 1 && (KEY_UP == 1 || KEY1 == 0 || KEY0 == 0)) //如果有按键按下 { KEY_Value = 0; Delay_ms(10); //消抖 if(KEY_UP == 1) return key_up; //判断KEY_UP按键按下 else if(KEY1 == 0) return key1; //判断KEY1按键按下 else if(KEY0 == 0) return key0; //判断KEY0按键按下 else return NONE; //没有按键按下 } else if(KEY_UP == 0 && KEY1 == 1 && KEY0 == 1) //没有按键按下时 KEY_Value = 1; return NONE; }key.h #ifndef KEY_H_ #define KEY_H_ #include "stm32f10x.h" /************IO口宏定义便于移植************/ //引脚按键接高电平 #define KEY_UP_GPIO_Port GPIOA #define KEY_UP_Pin GPIO_Pin_0 #define KEY_UP_RCC RCC_APB2Periph_GPIOA //引脚按键接地 #define KEY_GPIO_Port GPIOE #define KEY_Pin GPIO_Pin_3|GPIO_Pin_4 #define KEY_RCC RCC_APB2Periph_GPIOE /************位带操作************/ #define KEY_UP PAin(0) #define KEY1 PEin(3) #define KEY0 PEin(4) /************使用枚举将按键值化************/ typedef enum key { NONE = 0, key_up = 1, //KEY_UP按键按下 key0 = 2, //KEY0按键按下 key1 = 3 //KEY1按键按下 }key; static key Key; //枚举变量申明 /************函数申明************/ void KEY_Soft_Init(void); //按键初始化 key KEY_Scan(u16 Mode); //扫描函数 #endif工程程序涉及位带与延时函数的知识,可以看这两文章理解: 【STM32】标准库与HAL库对照学习教程四–延时函数详解 【STM32】标准库与HAL库对照学习教程六–位带操作 六、HAL库控制按键HAL库我们使用cubemx配置工程,相关配置操作在我写的教程篇中有详细说明,这里只放相关配置图,具体生成工程不再详细阐述。 ① 程序 ① ② 是不是和标准库差不多呀,只是IO口的配置交给了cubemx配置了。 关于想要更深入了解按键的使用,可以看这篇文章: 一个学妹写的按键检测函数把我秀翻了 挺高级的。 那么关于按键的使用到这里就结束啦! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |