文章目录

  • 一、适用功能
  • 二、 硬件设计(参考)
  • 三、 软件设计
    • ① 使用到的固件库文件
    • ② 代码整理

一、适用功能

检测按键,光电开关,水位传感器等检测 GPIO 输入电平信号。

二、 硬件设计(参考)

三、 软件设计

① 使用到的固件库文件

#include stm32f10x_gpio.c/stm32f10x_gpio.h
#include stm32f10x_rcc.c/stm32f10x_rcc.h

② 代码整理

  • delay.h
#ifndef __DELAY_H
#define __DELAY_H#include "stm32f10x.h"void Delay(__IO uint32_t nCount);#endif
  • delay.c
#include "delay.h"void Delay(__IO uint32_t nCount) // 简单的延时函数
{for(; nCount != 0; nCount--);
}
  • led.h
#ifndef _LED_H
#define _LED_H#include "stm32f10x.h"void LED_Init(void);
void LED0_Level(unsigned char Level);
void LED1_Level(unsigned char Level);#endif
  • led.c
#include "led.h"/*******************************************************************************
* 函 数 名         : LED_Init
* 函数功能         : LED初始化函数
* 输    入         : 无
* 输    出         : 无
* 说 明          :无
*******************************************************************************/
void LED_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能PB端口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;          // LED0-->PB.5 端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;   // 推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // IO口速度为50MHzGPIO_Init(GPIOB,&GPIO_InitStructure);             // 根据设定参数初始化GPIOB.5GPIO_SetBits(GPIOB,GPIO_Pin_5);                  // PB.5 输出高RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // 使能PE端口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;            // LED1-->PE.5 端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;   // 推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // IO口速度为50MHzGPIO_Init(GPIOE,&GPIO_InitStructure);             // 根据设定参数初始化GPIOB.5GPIO_SetBits(GPIOE,GPIO_Pin_5);                  // PE.5 输出高
}/*******************************************************************************
* 函 数 名         : LED0_Level
* 函数功能         : LED0——IO电平输出
* 输    入         : Level: 1 —— 输出高;   0 —— 输出低
* 输    出         : 无
* 说 明          :无
*******************************************************************************/
void LED0_Level(unsigned char Level)
{if (Level == 1){// PB.5 输出高GPIO_SetBits(GPIOB,GPIO_Pin_5);}else if (Level == 0){// PB.5 输出低GPIO_ResetBits(GPIOB,GPIO_Pin_5);}
}/*******************************************************************************
* 函 数 名         : LED1_Level
* 函数功能         : LED1——IO电平输出
* 输    入         : Level: 1 —— 输出高;   0 —— 输出低
* 输    出         : 无
* 说 明          :无
*******************************************************************************/
void LED1_Level(unsigned char Level)
{if (Level == 1){// PB.5 输出高GPIO_SetBits(GPIOE,GPIO_Pin_5);}else if (Level == 0){// PB.5 输出低GPIO_ResetBits(GPIOE,GPIO_Pin_5);}
}
  • key.h
#ifndef __KEY_H
#define __KEY_H #include "sys.h"
#include "delay.h"enum E_KEY_PRES
{// 没按键按下E_KEY_PRES_NULL = 0,// KEY0 按下E_KEY_PRES_0,// KEY1 按下E_KEY_PRES_1,//KEY2 按下E_KEY_PRES_2,//KEY_UP 按下 (即WK_UP/KEY_UP)E_KEY_PRES_WK_UP
};#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) // 读取按键0
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) // 读取按键1
#define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) // 读取按键2
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) // 读取按键3(WK_UP) void KEY_Init(void);
unsigned char KEY_Scan(void);   #endif
  • key.c
#include "key.h"/*******************************************************************************
* 函 数 名         : KEY_Init
* 函数功能         : KEY初始化函数
* 输    入         : 无
* 输    出         : 无
* 说 明          :无
*******************************************************************************/
void KEY_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;// KEY0// 使能 KEY0 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);// KEY0 按键的引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;// 设置按键的引脚为上拉输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;// 初始化 KEY0GPIO_Init(GPIOE, &GPIO_InitStructure);// KEY1// 使能 KEY1 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);// KEY1 按键的引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;// 设置按键的引脚为上拉输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;// 初始化 KEY1GPIO_Init(GPIOE, &GPIO_InitStructure);// KEY2// 使能 KEY2 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);// KEY2 按键的引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;// 设置按键的引脚为上拉输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;// 初始化 KEY2GPIO_Init(GPIOE, &GPIO_InitStructure);// WK_UP// 使能 WK_UP 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// WK_UP 按键的引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;// 设置按键的引脚为下拉输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;// 初始化 WK_UPGPIO_Init(GPIOA, &GPIO_InitStructure);
}/*******************************************************************************
* 函 数 名         : KEY_Scan
* 函数功能         : KEY检测函数
* 输    入         : 无
* 输    出         : E_KEY_PRES_NULL:没有按键被按下E_KEY_PRES_0:KEY0被按下E_KEY_PRES_1:KEY1被按下E_KEY_PRES_2:KEY2被按下E_KEY_PRES_WK_UP:WK_UP被按下
* 说 明          :注意此函数有响应优先级,KEY0>KEY1>KEY2>WK_UP!!
*******************************************************************************/
unsigned char KEY_Scan(void)
{if ((0 == KEY0) || (0 == KEY1) || (0 == KEY2) || (1 == WK_UP)){// 去抖动Delay(0xff);if (0 == KEY0){// 等待按键松手while(0 == KEY0);return E_KEY_PRES_0;}else if (0 == KEY1){// 等待按键松手while(0 == KEY1);return E_KEY_PRES_1;}else if (0 == KEY2){// 等待按键松手while(0 == KEY2);return E_KEY_PRES_2;}else if (1 == WK_UP){// 等待按键松手while(1 == WK_UP);return E_KEY_PRES_WK_UP;}}return E_KEY_PRES_NULL;
}
  • main
#include "led.h"
#include "delay.h"
#include "key.h"unsigned char Key_Status;int main(void)
{   // LED GPIO 初始化LED_Init();// KEY GPIO 初始化KEY_Init();while(1){Key_Status = KEY_Scan();switch (Key_Status){case E_KEY_PRES_0:{LED0_Level(0);LED1_Level(0);}break;case E_KEY_PRES_1:{LED0_Level(1);LED1_Level(0);}break;case E_KEY_PRES_2:{LED0_Level(0);LED1_Level(1);}break;case E_KEY_PRES_WK_UP:{LED0_Level(1);LED1_Level(1);}break;}}
}

KEY GPIO 设置上拉模式、下拉模式或者浮空模式,这个取决于硬件。

当硬件有默认电平信号(非高阻态)时,只要按键按下时,会发生电平翻转,这种情况可以设置为浮空模式。

当硬件没有默认电平信号时,按下按键电平置 0 ,这种情况可以设置为上拉模式。
当硬件没有默认电平信号时,按下按键电平置 1 ,这种情况可以设置为下拉模式。

笔记(6) —— GPIO检测高低电平相关推荐

  1. 笔记(5) —— GPIO 输出高低电平

    文章目录 一. 适用功能 二. 硬件设计(参考) 三. 软件设计 ① 使用到的固件库文件 ② 代码整理 一. 适用功能 GPIO 翻转.LED 闪烁.无源蜂铃器.跑马灯等 GPIO 输出高低电平控制. ...

  2. 2.02-外设篇-GPIO输出高低电平

    ESP8266:SDK开发(源码见资料源码) 开发板购买链接:开发板购买链接 资料源码:https://gitee.com/yang456/Learn8266ForSDK.git 开发软件:https ...

  3. 16、JETSON NANO 对特定目标进行识别和gpio输出高低电平报警

    基本思想:需要对特定目标进行识别和报警,TensorRT做的的效果会极其好,但是没时间,先使用ncnn的yolo-fastest做个例子吧,后期修改为TensorRT框架识别吧,该博客主要学习如何控制 ...

  4. GPIO设置高低电平

    问题: 当按键按下设置某个GPIO为高电平时,如果按键一直不释放,则会一直去设置 解决思路: 设置一个标志,设置了一次后就将标志位置1.会出现两个问题: 如果执行了,但是实际当前设置ODR寄存器时出错 ...

  5. STM32配置GPIO的高低电平

    一.在keil对应的工程文件的对应位置新建gpio.h和gpio.c文件: 二.编辑gpio.c文件: #include "stm32f10x.h" //引用头文件 #includ ...

  6. R40gpio输出无高低电平变化【原创】

    在配置GPIO控制继电器时,其中有几个在GPIO发送高低电平继电器没有变化,测试继电器是好的,于是用万用表测IO,发现推送高低电平时,没有发生改变.几经折腾,发现该组PG的电源没开,硬件同事找到该组G ...

  7. 关于单片机检测高电平

    IO口检测高点平的问题,曾经而困扰我不少时间,呵呵. 这几天做一个项目,又有点晕呼了,查了不少资料,做了一个总结,和大家分享~~ 1.51单片机的I/O 口检测高低电平是需要首先让该端口置为1的.此时 ...

  8. 【STM32F407学习笔记】GPIO(一)

    [STM32F407学习笔记]GPIO(一) 1. GPIO基础知识 1.1 GPIO工作方式 1.2 GPIO相关配置寄存器 1.2.1 端口模式寄存器:GPIOx_MODER 1.2.2 输出类型 ...

  9. A40i使用笔记:GPIO操作方式(用于测试设备io驱动性能)(传统方式、设备树方式、寄存器方式操作GPIO)

    一.前言 前文介绍了文件io的驱动方式,可以用于led点灯灭灯或者一些简单的不需求时序控制的ic操作,但是用于功能类ic,如AD采集芯片等时序控制需求高的,就不行了,这时候就需求高速io去实现指定的芯 ...

最新文章

  1. David与Vincent的博弈游戏[树型DP]
  2. 【Object类、日期、StringBuilder】
  3. [LOJ500]ZQC的拼图
  4. 第三次学JAVA再学不好就吃翔(part78)--List类
  5. 靠一个不存在的基因,写了学位论文顺利毕业的上交大硕士,被学校撤销了学位!...
  6. mysql force index报错_新特性解读 | MySQL 8.0 索引特性4-不可见索引
  7. javascript问题积累
  8. 原生态JS和JQuery版的动态添加、删除表格行
  9. c语言冒泡排序字母排序,排序与查找之冒泡排序篇(C语言实现)
  10. 强行进入远程计算机,远程桌面强制连接命令
  11. 全减器及其相关概念的理解
  12. fgo日服服务器维护,【FGO日服】活动维护公告(10/25)
  13. ndt_matching解读
  14. zabbix 使用教程
  15. Tableau仪表板制作
  16. 弘辽科技:关于老店盘活的基础思路。
  17. 消息中间件 一 之 AMQP译文(下)
  18. ipad上html语言编辑,在 iPad 上键入和编辑文本的小技巧
  19. linux 上查询cache 大小的方法
  20. ES6 Generator函数

热门文章

  1. 快速中值滤波——Python实现
  2. 脱壳--02.exe
  3. PQMAGIC磁盘分区大师
  4. mapstruct使用的正确姿势
  5. html注释的爱情故事,才女李清照的爱情故事:才下眉头,却上心头
  6. 宋晓丽20190905-1 每周例行报告
  7. java达内项目_达内课程:完成一个项目的整个流程
  8. iphone游戏开发_iPhone开发的10个步骤
  9. halcon,分享一个想法,数米粒个数
  10. 小学生学机器人编程有意义吗