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

发布时间:2024-10-12

按键硬件电路:

【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://www.eeworld.com.cn/mcu/2019/ic-news040943747.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F103+HAL+PWM+DMA+WS2812
下一篇:最后一页

【STM32F103】按键检测(GPIO输入)
关注eeworld公众号
快捷获取更多信息
【STM32F103】按键检测(GPIO输入)
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F103 超声波 串口输出数据

#include "cj.h"#include "stm32f10x.h"#include "delay.h"#include "usart.h"unsigned int overcount=0;void NVIC_Config(void)//优先级设置{NVIC_InitTypeDef NVIC_InitStructer;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitSt
发表于 2019-04-08

基于STM32L151//STM32F407的矩阵键盘程序(不规则接口)

最近在做一个有关按键的项目,需要用到矩阵键盘,上网找了很多都是基于一些规则接口的程序,感觉无语,因为画PCB由于布线原因不太可能矩阵键盘的几条线是连接连续的GPIO口,所以经过我自己思考,做出了自己基于STM32的不规则程序,由于每种矩阵键盘的连接原理有时是不同,所以首先先讲明我的矩阵键盘的连接原理4条行线初始化时全为1,列线全为0,由于我的列先有接10K的电阻,有按键按下时,被按下的列线为1,行线一次置为1、0、0、0\0,1,0,0,0,1,0,0,0,1基于STM32L151//STM32F407的矩阵键盘程序(不规则接口):行接口:PA8,PA12,PB3,PB4列接口:PA11,PB5,PB9void
发表于 2019-04-08

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

STM32F4实现矩阵键盘

(cord_l!=0X0F)            {                    /* 交换输入信号读取行线值 */                    /* 列线 推挽输出 */                    GPIO_InitSt
发表于 2019-04-08

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

STM32F103 Slave I2C配置

才接触STM32开发,由于项目需求需要,需要linux系统与STM32通过I2C进行通讯,网上合适资料有限,花了不少时间,所以记录在此。描述:Linux发送数据后,每隔10ms轮询stm32(应该做中断触发的,但由于硬件接口限制),只读一个字节判断是否有数据,如果有则读相应长度的内容。自定义缓冲区格式:首字节为长度信息,后面是内容信息,如uint8_t I2C_Buffer_Rx[128];//0:len  1...=>data(1)I2C Slave初始化void IIC_Init(void){  GPIO_InitTypeDef GPIO_InitStructure; 
发表于 2019-04-08

STM32F103RC硬件I2C从入坑到出坑

第一天手上有啥资源可利用的?1.一块MPU60502.一块stm32f103rc最小系统版,上面移植了ucos3,跑了几个任务,包括一个LCD任务(优先级最低)3.st的固件库4.ALIENTEK的MPU6050例程5.stm32各种数据手册文档,ucos各种资料好,开工。先阅读stm32数据手册了解研究I2C模块原理架构,懵懵懂懂,若有所知的样子,行了不看了。然后看看ALIENTEK的MPU6050例程。咦?怎么是用软件模拟I2C?stm32集成了I2C控制器都不用,这么浪费,不看了。。。还是再看一下,看看MPU6050大致是怎么操作的。大概就是有个设备地址0x68,有很多寄存器,数据通信通的就是寄存器的数据,每次传输数据都是
发表于 2019-04-08

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

stm32f3的i2c使用小结

这几天拿到了stm32f3discovery,拿到手的第一件事就是测试了硬件i2c,使用stm32cube生成库,测试对象为AD5934与ADG715。经过两天的调试,完美调通。中间也碰到了些问题。1、一开始用的I2C1,一仿真就会出现死机的情况。        由于I2C1与swd接口重合,所以调用HAL_I2C_Init()函数后就死机,改成I2C2后问题解决。2、无法访问指定地址的设备        库函数中的入口地址并不是7bit地址,需要输入8bit。我的设备地址为13,始终无法访问设备,改为26后解决。3、可以读写单个地址的数据
发表于 2019-04-02

销售各类正规品牌电容,大量现货库存,24小时内发货、欢迎咨询……*@_@*

咨询热线:135-6483-0031