OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2124|回复: 5

F103按键检测输入,程序烧写后按键没按下前后灯都是亮的,求大神解答。

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-3-7
在线时间
12 小时
发表于 2020-3-8 12:20:59 | 显示全部楼层 |阅读模式
4金钱
F103按键检测输入,程序烧写后按键没按下前后灯都是亮的,只是按键按下后灯变暗了些,但还是亮的,怎默回事?求大神解答。以下是代码:

bsp_keyscan.h:
#ifndef BSP_KEYSCAN_H
#define BSP_KEYSCAN_H
#include "stm32f10x.h"
#define Key_on         1
#define Key_off        0
void GPIO_Config(void);
void GPIO_Keyscan(void);
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
#endif

bsp_keyscan.c:
#include "stm32f10x.h"
#include "bsp_keyscan.h"

void GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void GPIO_Keyscan()
{
  GPIO_InitTypeDef GPIO_Keyscan_Struct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_Keyscan_Struct.GPIO_Pin=GPIO_Pin_0;
        GPIO_Keyscan_Struct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_Keyscan_Struct);
}

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;
}


main.c:

#include "stm32f10x.h"
#include "bsp_keyscan.h"
int main(void){
GPIO_Config();
GPIO_Keyscan();
        while(1)
        {
             if(Key_Scan(GPIOA,GPIO_Pin_0)==Key_on)
                        {
                           GPIOB->ODR  ^= GPIO_Pin_0;
                        }
        }
}


最佳答案

查看完整内容[请看2#楼]

你可以在原来的代码上while (GPIO_ReadInputDataBit( GPIOx, GPIO_Pin)==Key_on)后边加一个“;”,效果也会很明显
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
883
金钱
883
注册时间
2018-4-20
在线时间
491 小时
发表于 2020-3-8 12:21:00 | 显示全部楼层
你可以在原来的代码上while (GPIO_ReadInputDataBit( GPIOx, GPIO_Pin)==Key_on)后边加一个“;”,效果也会很明显
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-3-7
在线时间
12 小时
 楼主| 发表于 2020-3-8 12:54:55 | 显示全部楼层
本帖最后由 凌曦月 于 2020-3-8 12:56 编辑

我又修改了以下我的main函数,能够进行正常按键检测了,修改内容如下:
#include "stm32f10x.h"
#include "bsp_keyscan.h"
int main(void){
GPIO_Config();
GPIO_Keyscan();
        while(1)
        {
             if(Key_Scan(GPIOA,GPIO_Pin_0)==Key_on)
                        {
                           GPIO_SetBits( GPIOB, GPIO_Pin_0);
                        }
                        else
                        GPIO_ResetBits( GPIOB, GPIO_Pin_0);
                        
        }
}
但我觉得修改前和修改后两者原理上并没有什么本质上的差别,但为什么现象不一样呢,请求各位大神解答以下。
回复

使用道具 举报

0

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2018-7-6
在线时间
133 小时
发表于 2020-3-8 18:09:25 | 显示全部楼层
初始化里你也没写开始灯亮 还是灭,状态肯定是不确定的
没改程序前你只写了按键按下灯亮,那按键弹起后灯肯定还是维持亮的状态,你没给他灭的指令,他咋灭
回复

使用道具 举报

0

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
883
金钱
883
注册时间
2018-4-20
在线时间
491 小时
发表于 2020-3-9 09:19:20 | 显示全部楼层
你没改之前的代码是按键按下时不停的翻转灯的状态,所以按下时灯会变的暗些;改之后是按下按键不停的点亮灯,松开是不停的关灯,所以效果会明显很多
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-3-7
在线时间
12 小时
 楼主| 发表于 2020-3-10 20:56:15 | 显示全部楼层
人生丶如梦 发表于 2020-3-9 09:19
你没改之前的代码是按键按下时不停的翻转灯的状态,所以按下时灯会变的暗些;改之后是按下按键不停的点亮灯 ...

嗯嗯,明白了,谢谢你!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 08:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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