【STM32F103】按键检测(GPIO输入)

最新更新时间:2019-04-09来源: eefocus关键字:STM32F103  按键检测  GPIO输入 手机看文章 扫描二维码
随时随地手机看文章

按键硬件电路:


分析电路:按键K1按下,接通高电平3.3V,为了保护GPIO,加了限流电阻(R7),没按下的时候是接地的,上升沿输入。


PA0具有自动唤醒的功能(必须上升沿才能唤醒),电容C6用以硬件消抖(电容不断充放电),这样软件就不用延时来消抖,


K2电路同。


GPIO输入:GPIO数据输入寄存器IDR,只要读取这个寄存器就可以。


bsp_key.c 按键初始化:


#include "bsp_key.h"

 

 

void KEY_GPIO_Config(void)

{

GPIO_InitTypeDef  GPIO_InitStruct;

RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);

RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);

GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);

 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);

}

 

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_PIN              GPIO_Pin_0

#define KEY1_GPIO_PORT             GPIOA

#define KEY1_GPIO_CLK              RCC_APB2Periph_GPIOA

 

#define KEY2_GPIO_PIN              GPIO_Pin_13

#define KEY2_GPIO_PORT             GPIOC

#define KEY2_GPIO_CLK              RCC_APB2Periph_GPIOC

 

void KEY_GPIO_Config(void);

uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);

 

#endif /* __BSP_KEY_H */

 

main.c


#include "stm32f10x.h"   // 

#include "bsp_led.h"

#include "bsp_key.h"

 

void Delay( uint32_t count )

{

for(; count!=0; count--);

}

 

int main(void)

{

LED_GPIO_Config();

KEY_GPIO_Config();

while(1)

{

if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) ==KEY_ON )

LED_G(1)

if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) ==KEY_ON )

LED_G(0)

// if

}

}

 

 

led_bsp.c与led_bsp.h参考上一篇使用库函数点亮LED。


以此我们能够通过这个程序检测按钮是否按下,并将值输入到对应PORT,保存在GPIO数据输入寄存器IDR中。


主函数通过读取对应PORT的值来控制灯的亮灭,KEY1按下时灯点亮,KEY2按下时灯熄灭。效果很明显,图片不方便展示。

关键字:STM32F103  按键检测  GPIO输入 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news040943747.html

上一篇:STM32F103+HAL+PWM+DMA+WS2812
下一篇:STM32F103ZET6 — WWDG

推荐阅读

STM32F103以SPI 驱动128*128的TFT彩屏
0.  关于本文:其实我一直都比较懒,不喜欢写博客。但网上关于详细讲解SPI驱动LCD的文章比较少,虽然也能下载到一些案例程序,但对于初学者来说,如果不懂LCD驱动的原理,不懂如何对文字和图片取模,即便拿到了别人的代码,也是一脸懵很难移植。所以写下本文,大家有不明白的,欢迎留言区一起交流,谢谢!1.  实验任务:本实验使用 STM32F103R6 芯片,通过软件SPI的方式,控制128*128分辨率的LCD,实现在液晶屏上显示汉字,英文,数字,图片等内容。2. 实验效果展示:   3.  硬件设计4. 硬件SPI和软件SPI的比较本实验用的是软件SPI的方式来控制LCD。好处是可以使
发表于 2022-01-25
<font color='red'>STM32F103</font>以SPI 驱动128*128的TFT彩屏
STM32F103单片机使用内部RC振荡器做时钟源
平时在做项目的时候都用的是外部晶振做为时钟源,想试试用内部RC振荡器做为时钟源,在网上搜了一下如何设置内部时钟,发现资料比较少的。决定将设置内部RC振荡器做为时钟源的方法记录下来。用的单片机是STM32F103C8T6,项目工程是在正点原子的示例代码上修改来的。用一个LED工程测试,在主程序中闪烁LED灯。#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"int main ( void ){    delay_init();   
发表于 2022-01-06
STM32F103单片机生成16路PWM波
单片机输出pwm波在项目中是恨常用的一个功能,今天就总结一下用STM32F103C8T6单片机输出16路 pwm波。使用keil5软件,用标准库函数来实现。首先看定时器初始化void TIM1_PWM_Init(u16 arr, u16 psc){    GPIO_InitTypeDef GPIO_InitStructure;    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;    TIM_OCInitTypeDef TIM_OCInitSturcture;     RCC_APB2Pe
发表于 2022-01-06
<font color='red'>STM32F103</font>单片机生成16路PWM波
STM32F103单片机输出相位可调PWM波
STM32定时器功能如下通常使用的是PWM模式,可以通过PWM功能可以生成频率和占空比可调的方波信号,有时候需要生成初始相位可调的方波,PWM功能就就不能满足要求了。可以通过输出比较模式来实现。输出比较模式是将计数器CNT的值和捕获比较寄存器CCR的对比,当CNT值等于CCR的值时,翻转输出电平。通过捕获比较寄存器CCMR模式设置位的描述可以看出,输出比较模式只有当 CCR = CNT时,输出电平才会翻转。而PWM模式下 CNT < CCR 时输出一个电平,CNT > CCR时输出相反的电平。通过一个示意图来看看PWM输出模式上图中是PWM输出的示意图,可以看出CNT的值从变化范围是 0---ARR,之间,CNT的值在C
发表于 2022-01-06
<font color='red'>STM32F103</font>单片机输出相位可调PWM波
STM32F103输出互补PWM波
STM32F103单片机定时器自带互补PWM波形输出功能,利用定时器输出比较模式,不仅可以输出互补的 PWM波,还可以设置输出方波的起始相位和死区时间。下面就总结一下如何实现PWM互补输出。void TIM1_PWM_DeadtimeInit( u16 arr, u16 psc, u16 ccr1, u16 ccr2, u16 deadtime ){    GPIO_InitTypeDef GPIO_InitSturcture;    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;    TIM_OCInitTypeDe
发表于 2022-01-06
<font color='red'>STM32F103</font>输出互补PWM波
STM32F103单片机JTAG端口重映射
STM32单片机复位后,JTAG口默认是被占用的。如果想将JTAG占用的几个IO口设置为普通IO口,就需要进行端口重映射。复位后端口默认功能可以在STM32参考手册上看到要将JTAG占用的这些口设置为普通IO口时,需要用复用功能重映射,在程序开始执行时将JTAG口重映射为普通IO口。将JTAG要设置为普通 IO口时,需要设置AFIO_MAPR寄存器的SWJ_CFG位。如果用寄存器操作的话,就直接设置这个寄存器的值就行。如果用库函数操作的话,可以直接调用库函数void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)。这个库函数的具体实现可以在stm3
发表于 2022-01-05
<font color='red'>STM32F103</font>单片机JTAG端口重映射
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved