野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14397|回复: 5

GPIO输入-按键检测

[复制链接]
发表于 2020-2-19 23:20:40 | 显示全部楼层 |阅读模式
跟着视频一起做的,做完后,为什么按键松开,小灯还是亮着??
回复

使用道具 举报

发表于 2020-2-20 09:17:58 | 显示全部楼层
什么都没有怎么判断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 11:31:04 | 显示全部楼层
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

#endif /* __BSP_KEY_H */
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 11:32:49 | 显示全部楼层
bsp_led.c文件
// bsp  board support package  板级支持包

#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);
       
}
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 */

帮忙看一下哪里出错了  谢谢

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 12:45:09 | 显示全部楼层
WishWish 发表于 2020-2-20 09:17
什么都没有怎么判断

已解决   打扰了
回复 支持 反对

使用道具 举报

发表于 2020-6-4 09:12:29 | 显示全部楼层
我刚刚也碰到这个问题,然后发现自己蠢了,按的是复位键
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-13 11:18 , Processed in 0.028166 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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