当前位置:   article > 正文

STM32-GPIO按键输入-按键控制LED_stm32通过gpio按键输入控制led亮

stm32通过gpio按键输入控制led亮

一、软件设计

固件库点亮LED相同,我们需要一个工程模板详情可以用看(1条消息) STM32固件库点亮LED灯_学c入门到入土的博客-CSDN博客

1、编程要点

1)使能GPIO端口时钟。

2)初始化GPIO目标引脚,并设置为输入模式(浮空输入模式)如果想要知道底层逻辑详情可以看(1条消息) STM32-GPIO外设详解_学c入门到入土的博客-CSDN博客

3)编写简单测试程序,检测KEY按键的状态,实现按键控制LED 。

LED头文件

  1. #ifndef _LED_H_ //判断标号_LED_H_是否被定义,如果没有则#ifndef到#endif代码有效
  2. #define _LED_H_
  3. #include <stm32f10x.h>
  4. #define LED_GPIO_PORT GPIOA //LED的GPIO端口
  5. #define LED_GPIO_CLK RCC_APB2Periph_GPIOA //LED相对应的时钟端口开启
  6. #define LED_GPIO_PIN GPIO_Pin_0 //LED的GPIO引脚号
  7. void LED_GPIO_Config(void); //LEDGPIO端口初始化函数
  8. #endif

LED.C文件

  1. #include "led.h"
  2. void LED_GPIO_Config(void)
  3. {
  4. RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
  5. /*开启LED相关的GPIO外设时钟*/
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. /*定义一个GPIO_InitTypeDef类型的结构体*/
  8. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  9. /*设置引脚模式为通用推挽输出*/
  10. GPIO_InitStructure.GPIO_Pin=LED_GPIO_PIN;
  11. /*选择要控制的引脚*/
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  13. /*设置引脚速率为50MHz*/
  14. GPIO_Init(LED_GPIO_PORT,&GPIO_InitStructure);
  15. /*调用库函数初始化GPIO*/
  16. }

KEY头文件

  1. #ifndef _KEY_H_ //判断标号_KEY_H_是否被定义,如果没有则#ifndef到#endif代码有效
  2. #define _KEY_H_
  3. #include <stm32f10x.h>
  4. #define KEY_GPIO_PORT GPIOB
  5. //KEY的GPIO端口
  6. #define KEY_GPIO_CLK RCC_APB2Periph_GPIOB
  7. //KEY相对应的时钟端口开启
  8. #define KEY_GPIO_PIN GPIO_Pin_0
  9. //KEY的GPIO引脚号
  10. #define KEY_ON 0 //不一定低电平就是按下,这样可以根据自己需要所更改
  11. //KEY按键状态:按下
  12. #define KEY_OFF 1
  13. //KEY按键状态:按键未按下
  14. void KEY_GPIO_Config(void);
  15. //KEY GPIO端口初始化函数
  16. void delay_ms(unsigned int ms);
  17. //延时函数
  18. uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
  19. /*功能:检查是否有按键被按下
  20. *输入参数1:GPIOx:具体的端口,x可以是(A~G)
  21. *输入参数2:GPIO_Pin:具体的端口:GPIO_Pin_x(x可以是0~15)
  22. *返回值:按键状态
  23. *KEY_ON:按键按下
  24. *KEY_OFF:按键未按下
  25. */
  26. #endif

KEY.C文件

  1. #include "KEY.h"
  2. void KEY_GPIO_Config(void)
  3. {
  4. RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);
  5. /*开启KEY相关的GPIO外设时钟*/
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. /*定义一个GPIO_InitTypeDef类型的结构体*/
  8. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  9. /*设置引脚模式为浮空输入模式*/
  10. GPIO_InitStructure.GPIO_Pin=KEY_GPIO_PIN;
  11. /*选择要控制的引脚*/
  12. GPIO_Init(KEY_GPIO_PORT,&GPIO_InitStructure);
  13. /*调用库函数初始化GPIO*/
  14. }
  15. void delay_ms(unsigned int ms) //延时函数
  16. {
  17. unsigned int i,j;
  18. for(i=ms;i>0;i--)
  19. for(j=110;j>0;j--);
  20. }
  21. uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  22. {
  23. /*检测按键是否被按下*/
  24. if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
  25. {
  26. /*按键去抖动*/ //如果你使用的是硬件有按键去抖处理那么这部分可以去掉
  27. delay_ms(50);
  28. /*再次确定按键是真的被按下去了*/
  29. if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
  30. {
  31. /*等待按键释放*/
  32. while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON);
  33. return KEY_ON;
  34. }
  35. else
  36. return KEY_OFF;
  37. }
  38. else
  39. return KEY_OFF;
  40. }

main.C文件

  1. #include "led.h"
  2. #include "key.h"
  3. int main()
  4. {
  5. LED_GPIO_Config();
  6. //调用LED初始化函数
  7. KEY_GPIO_Config();
  8. //调用KEY初始化函数
  9. while(1)
  10. {
  11. //调用按键判断函数,使用固件库函数拉高LED引脚电平
  12. if(KEY_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN)==KEY_ON)
  13. {
  14. GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);
  15. }
  16. //调用按键判断函数,使用固件库函数拉低LED引脚电平
  17. if(KEY_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN)==KEY_ON)
  18. {
  19. GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN);
  20. }
  21. }
  22. }

这个小程序就完了,没有什么特别介绍的,只是吧我们前面所学的知识组合了一下 这里面使用到了一个新的固件库函数

函数名GPIO_ReadInputDataBit()
函数原型u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
功能描述读取指定端口引脚的输入
输入参数 1GPIOx:x可以是A,B,C,D,来选择GPIO外设
输入参数 2

GPIO_Pin:待读取端口位

该参数可以取GPIO_Pin_x(x可以是0到15的任意组合)

返回值输入端口引脚值

函数基本原理就是读取GPIO-IDR(端口输入数据寄存器)的状态并进行返回值处理。

关注我下面我会继续更新GPIO外设输入输出的实际小程序,来帮助大家更好的理解GPIO外设的功能,后面还会更新STM32的所有特色外设。 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号