STM32F103(库函数)——按键检测

发布者:捡漏来了最新更新时间:2019-05-22 来源: eefocus关键字:STM32F103  库函数  按键检测 手机看文章 扫描二维码
随时随地手机看文章

在我的STM32F103ZET6核心板上有四个按键,其中一个是复位按键,其余三个原理图如下图所示。


其中KEY0和KEY1分别接在PE3和PE4上,然后低有效。WK_UP接在PA0上,高电平有效。而且根据原理图,在外部电路中是没有上下拉电阻的,所以我们需要在STM32中设置上下拉电阻。


一样,因为设置按键也是配置IO口工作方式。


main.c


/*******************************************************************************

* 文件名:main.c

* 描  述:

        1.按下KEY0,LED0状态切换

        2.按下KEY1,LED1状态切换

        3.按下WK_UP,LED0和LED1状态切换

* 作  者:小默haa

* 版本号:v1.0

* 日  期: 2019年1月28日

* 备  注:独立按键控制LED点亮

*         

*******************************************************************************/

#include "stm32f10x.h"

#include "led.h"

#include "key.h"

#include "delay.h"

#include "sys.h"

 

int main(void)

{

static u8 flag = 0;

LED_Init();

KEY_Init();

delay_init();

while(1)

{

flag = KEY_Scan(0);

switch(flag)

{

case 1:LED0 = !LED0; break;

case 2:LED1 = !LED1; break;

case 3:LED0 = !LED0; LED1 = !LED1; break;

default:break;

}

}

}

LED.c


#include "led.h"

 

/*******************************************************************************

* 函数名 :LED_Init

* 输入值 :无

* 返回值 :无

* 作者 :小默haa

* 时间 :2019年1月26日

* 功能描述:LED初始化

* 备注 :        

*******************************************************************************/

void LED_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);//设能PB和PE口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0->PB5 端口配置

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_Init(GPIOB, &GPIO_InitStructure); //根据参数设定参数配置GPIO

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1->PE5 端口配置

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_Init(GPIOE, &GPIO_InitStructure); //根据参数设定参数配置GPIO

}

LED.h


#ifndef __LED_H__

#define __LED_H__

 

#include "sys.h"

 

#define LED0 PBout(5)

#define LED1 PEout(5)

 

void LED_Init(void);

 

 

#endif

key.c


#include "key.h"

 

/*******************************************************************************

* 函数名 :KEY_Init

* 输入值 :无

* 返回值 :无

* 作者 :小默haa

* 时间 :2019年1月28日

* 功能描述:按键初始化

* 备注 :        

*******************************************************************************/

void KEY_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE);//设能PA和PE口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; //GPIOE3,GPIOE4

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉输入模式

GPIO_Init(GPIOE, &GPIO_InitStructure); //根据参数设定参数配置GPIOE

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置为下拉输入模式

GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数设定参数配置GPIOA

}

 

/*******************************************************************************

* 函数名 :KEY_Scan

* 输入值 :u8 mode

* 返回值 :按键值

* 作者 :小默haa

* 时间 :2019年1月28日

* 功能描述:按键扫描

* 备注 :mode = 0 -> 不支持按键长按

mode = 1 -> 支持按键长按

*******************************************************************************/

int KEY_Scan(u8 mode)

{

static u8 key_up = 1; //按键弹起标志

if(mode)

key_up = 1; //支持按键长按核心代码

if(key_up && (!KEY0 || !KEY1 || WK_UP)) //检测到按键按下

{

delay_ms(10); //延时10ms消抖

key_up = 0;

if(!KEY0)

return KEY0_PRESS;

else if(!KEY1)

return KEY1_PRESS;

else if(WK_UP)

return WK_UP_PRESS;

}

else if(KEY0 && KEY1 && !WK_UP)

key_up = 1;

return 0;

}

 

 

 

 

 

 

 

key.h


#ifndef __KEY_H__

#define __KEY_H__

 

#include "sys.h"

#include "delay.h"

 

#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)

#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)

#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

 

#define KEY0_PRESS 1 //KEY0按下

#define KEY1_PRESS 2 //KEY1按下

#define WK_UP_PRESS 3 //WK_UP按下

 

void KEY_Init(void);

int  KEY_Scan(u8 mode);

 

#endif

关键字:STM32F103  库函数  按键检测 引用地址:STM32F103(库函数)——按键检测

上一篇:stm32端口“重映射” &&串口学习
下一篇:STM32F103(库函数)——点亮LED并且使用软件延时实现led闪烁

推荐阅读最新更新时间:2024-11-11 19:49

STM32-自学笔记(14.NVIC和外部中断,程序用到的库函数介绍)
1.GPIO_EXTILineConfig 函数原型:void GPIO_EXTILineConfig(u8 GPIO_PortSource,u8 GPIO_PinSource) 功能:选择GPIO引脚用作外部中断线路 参数: GPIO_PortSource:选择用作外部中断源的GPIO端口 GPIO_PinSource:待设置的外部中断引脚。该参数可以取GPIO_PinSourcex(x可以是0~15) 返回值:无 参数:GPIO_PortSource GPIO_PortSourceGPIOA 选择GPIOA GPIO_PortSourceGPIOB 选择GPIOB GPIO_Port
[单片机]
STM32-自学笔记(14.NVIC和外部中断,程序用到的<font color='red'>库函数</font>介绍)
STM32F103单片机串口通信带奇偶校验位
在调试Modubus协议时需要用到串口的奇偶校验位,但是平时用串口时很少用到奇偶校验位,网上搜相关的历程也很少,将自己写的串口奇偶校验代码分享上来方便以后查阅。 如果用库函数的话,添加奇偶检验位就很简单,在初始化串口的时候,将默认的无校验位修改为奇校验或者偶校验,同时将数据位设置为9位。 串口初始化代码如下: #include uart2.h #define CHECK_NONE_ONE_STOP 0 //无校验位 1个停止位 1有效 0 无效 #define CHECK_NONE_TWO_STOP 1 //无校验位 2个停止位 1有效 0 无效 #define CHECK_EVEN 1 //偶数
[单片机]
<font color='red'>STM32F103</font>单片机串口通信带奇偶校验位
STM32串口通信实验-库函数
这里先给出程序源码: 调用库函数: #include sys.h #include usart.h #include led.h #include delay.h int main() { u8 i; u8 len; u32 times = 0; //中断分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //初始化延时函数 delay_init(84); //初始化串口 uart_init(115200); //初始化led LED_Init(); //循环 LED0 = 0; while (1) { //检验接受标志 //若接
[单片机]
STM32串口通信实验-<font color='red'>库函数</font>
基于stm32f103zet6的外部中断学习
一、关于中断中的结构体EXTI_InitTypeDef 原型:uint32_t EXTI_InitTypeDef::EXTI_Line { uint32_t EXTI_Line FunctionalState EXTI_LineCmd EXTIMode_TypeDef EXTI_Mode EXTITrigger_TypeDef EXTI_Trigger }含有4个成员 1、Specifies the EXTI lines to be enabled or disabled. This parameter can be any combination of EXTI_Lines EXTI_Lines的取值可以是下面的数字 #defi
[单片机]
STM32F103标准库开发:外部中断(EXTI)实验
一、外部中断(EXTI)—简介 EXTI (External interrupt/event controller)——外部中断/事件控制器。 互联型STM32有20个能够产生事件/中断请求的边沿检测器,STM32F103系列有19个能够产生事件/中断请求的边沿检测器。 每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。 每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。 二、外部中断(EXTI)—框图 三、外部中断(EXTI)—线路映像 通用I/O端口以下图的方式连接到16个外部中断/事件线上: 四、外部中断(EXTI)—寄存器 从外部中断(
[单片机]
<font color='red'>STM32F103</font>标准库开发:外部中断(EXTI)实验
MSP430利用IO中断方式来实现按键检测
/************************************************************************ **********MSP430F14-利用IO中断方式实现按键检测程序*********** 以下是结合MC430F14开发板来实现的按键检处理程序实验。分别使用了采个三个按键接到MSP430的通用IO口,按任意一个按键可以使板上的LED反转。例程中,单片机一直处于最低功耗状态,用户可以通过按下按键后唤醒单片机。单片机唤醒后再进行去抖动动作,同时执行键处理程序;处理完后再次进入LPM4低功耗模式。 在本程序中用户可以灵活地修改程序来实现你相关的功能。 本程序适用在手持设备或电池
[单片机]
基于stm32f103zet6之UC/OS_II的学习1(初步移植OS--点灯大法)
代码这里可以下载 http://download.csdn.net/detail/king_bingge/5353528 一、uc/OS的实时性是靠什么实现的? 1、uC/OS的实时性就是靠定时中断来完成。 2、每个时钟节拍到来,就会产生一次定时中断,中断后进行任务调度,运行就绪表中优先级最高的任务(非抢先型内核中断后继续运行被中断任务)。 即过一段时间就检测是否有重要任务需要运行,是的就转而运行更重要的任务,从而确保实时性(裸机程序就无法这样做了)。 当然这里没有把系统调用考虑进去。 二、首先整体把握一下在M3上运行ucosII的架构 这就是整个系统各模块之间的关系,好的接下来就按照手册来分析一下移植的时候需要注意的地
[单片机]
基于<font color='red'>stm32f103</font>zet6之UC/OS_II的学习1(初步移植OS--点灯大法)
基于超声波的围岩松动圈实时监测系统设计
引言 巷道的安全支护在煤矿安全生产中起到重要的作用,也是煤矿安全生产中的难点。对巷道的安全支护的关键是要实时地掌握嗣岩松动圈的破碎状态。 巷道开挖后破坏了原岩的应力平衡状态,从而导致:第一,巷道周边径向应力下降为零,围岩强度明显下降;第二,围岩中出现应力集中现象。当这种应力超过围岩强度之后,在巷道周边围岩所形成的破碎带便是围岩松动圈。其物理状态表现为破裂缝的增加及岩体应力水平的降低。松动圈测试就是测试开巷后新的破坏裂缝及其分布范围,围岩中有新破裂缝与没有破裂缝的界面位置就是松动圈的边界。参考文献介绍了基于松动圈测试的检测原理相应的测试方法,包括超声波探测法、多点位移计量测法和地质雷达探测法。参考文献中根据震波在不同状态的岩层中
[单片机]
基于超声波的围岩松动圈实时监测系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved