野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16979|回复: 2

GPIO输入-按键检测

[复制链接]
发表于 2020-2-20 12:29:14 | 显示全部楼层 |阅读模式
按下按键时灯光变弱,但还亮着,求大神解答一下,谢谢
这是代码:

mian.c文件
#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./key/bsp_key.h"

void delay(uint32_t count)
{
         for(; count!=0; count--);

}


int main(void)
{
         /* 在程序来到main函数这里的时候,系统时钟已经配置成72M */
         /* LED接口初始化 */
   LED_GPIO_Config();

         /* 初始化按键 */
         KEY_GPIO_Config();
         
         while(1)
         {
                 
                 if( KEY_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON )
                 {
                         /* LED1闪烁一次 TOGGLE */
                         LED1_TOGGLE;
                        
                 }
                 
                 
                 if( KEY_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON )
                 {
                         /* LED2闪烁一次 TOGGLE */
                         LED2_TOGGLE;
                 }

                 
         }
}


bsp_key.c文件
#include "./key/bsp_key.h"


void KEY_GPIO_Config(void)
{
         GPIO_InitTypeDef GPIO_InitTStruct;
         /* 第一步:打开外设时钟 */
         RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK, ENABLE);
         
         /* 第二步:配置外设相关的结构体  */
         GPIO_InitTStruct.GPIO_Pin = KEY1_GPIO_PIN;
         GPIO_InitTStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
         
         /* 第三步:调用外设初始化函数,把配置好的结构体成员写到寄存器里面 */
         GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitTStruct);
         
         /* 第二个按键  */
         GPIO_InitTStruct.GPIO_Pin = KEY2_GPIO_PIN;
         
         /* 第三步:调用外设初始化函数,把配置好的结构体成员写到寄存器里面 */
         GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitTStruct);
}

uint8_t KEY_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
         if( GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON )
         {
                 while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
                         return KEY_ON;
         }
         
         else return KEY_OFF;
         
}


bsp_key.h文件
#ifndef __BSP_KEY_H
#define __BSP_KEY_H

#include "stm32f10x.h"

#define KEY_ON                                1
#define KEY_OFF                                0

#define KEY1_GPIO_CLK                                        RCC_APB2Periph_GPIOA
#define KEY1_GPIO_PORT                                GPIOA
#define KEY1_GPIO_PIN                                        GPIO_Pin_0

#define KEY2_GPIO_CLK                                        RCC_APB2Periph_GPIOC
#define KEY2_GPIO_PORT                                GPIOC
#define KEY2_GPIO_PIN                                        GPIO_Pin_13

void KEY_GPIO_Config(void);
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

#endif /* __BSP_KEY_H */

bsp_led.h文件
#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f10x.h"

#define LED1_GPIO_CLK       RCC_APB2Periph_GPIOB
#define LED1_GPIO_PORT      GPIOB
#define LED1_GPIO_PIN       GPIO_Pin_0
#define LED2_GPIO_CLK       RCC_APB2Periph_GPIOB
#define LED2_GPIO_PORT      GPIOB
#define LED2_GPIO_PIN       GPIO_Pin_1
#define LED3_GPIO_CLK       RCC_APB2Periph_GPIOB
#define LED3_GPIO_PORT      GPIOB
#define LED3_GPIO_PIN       GPIO_Pin_5
// C语言知识点,^:两个数异或(^),相同的话为0,不同的话为1
#define digitalTOGGLE(p,i)      {p->ODR ^=i;}
#define LED1_TOGGLE          digitalTOGGLE(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_TOGGLE          digitalTOGGLE(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED3_TOGGLE          digitalTOGGLE(LED3_GPIO_PORT,LED3_GPIO_PIN)
void LED_GPIO_Config(void);

#endif /* __BSP_LED_H *

bsp_led.c文件
#include "./led/bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitTStruct;
/* 第一步:打开外设时钟 */
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);

/* 第二步:配置外设初始化结构体 */
GPIO_InitTStruct.GPIO_Pin = LED1_GPIO_PIN;
GPIO_InitTStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitTStruct.GPIO_Speed = GPIO_Speed_10MHz;

/* 第三步:调用外设初始化函数,把配置好的结构体成员写到寄存器里面 */
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitTStruct);
/* 关闭所有led1灯 */
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);

// led 2 蓝
GPIO_InitTStruct.GPIO_Pin =LED2_GPIO_PIN;

GPIO_Init(LED2_GPIO_PORT, &GPIO_InitTStruct);

  GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
// led 3 红
GPIO_InitTStruct.GPIO_Pin = LED3_GPIO_PIN;

    /* 第三步:调用外设初始化函数,把配置好的结构体成员写到寄存器里面 */
GPIO_Init(LED3_GPIO_PORT, &GPIO_InitTStruct);

GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);

}

回复

使用道具 举报

 楼主| 发表于 2020-2-20 12:44:32 | 显示全部楼层
已解决   打扰了
回复 支持 反对

使用道具 举报

发表于 2020-6-11 11:04:49 | 显示全部楼层

我这边也出现了这个问题  请问你是怎么解决的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 17:28 , Processed in 0.034688 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表