笔记(6) —— GPIO检测高低电平
文章目录
- 一、适用功能
- 二、 硬件设计(参考)
- 三、 软件设计
- ① 使用到的固件库文件
- ② 代码整理
一、适用功能
检测按键,光电开关,水位传感器等检测 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检测高低电平相关推荐
- 笔记(5) —— GPIO 输出高低电平
文章目录 一. 适用功能 二. 硬件设计(参考) 三. 软件设计 ① 使用到的固件库文件 ② 代码整理 一. 适用功能 GPIO 翻转.LED 闪烁.无源蜂铃器.跑马灯等 GPIO 输出高低电平控制. ...
- 2.02-外设篇-GPIO输出高低电平
ESP8266:SDK开发(源码见资料源码) 开发板购买链接:开发板购买链接 资料源码:https://gitee.com/yang456/Learn8266ForSDK.git 开发软件:https ...
- 16、JETSON NANO 对特定目标进行识别和gpio输出高低电平报警
基本思想:需要对特定目标进行识别和报警,TensorRT做的的效果会极其好,但是没时间,先使用ncnn的yolo-fastest做个例子吧,后期修改为TensorRT框架识别吧,该博客主要学习如何控制 ...
- GPIO设置高低电平
问题: 当按键按下设置某个GPIO为高电平时,如果按键一直不释放,则会一直去设置 解决思路: 设置一个标志,设置了一次后就将标志位置1.会出现两个问题: 如果执行了,但是实际当前设置ODR寄存器时出错 ...
- STM32配置GPIO的高低电平
一.在keil对应的工程文件的对应位置新建gpio.h和gpio.c文件: 二.编辑gpio.c文件: #include "stm32f10x.h" //引用头文件 #includ ...
- R40gpio输出无高低电平变化【原创】
在配置GPIO控制继电器时,其中有几个在GPIO发送高低电平继电器没有变化,测试继电器是好的,于是用万用表测IO,发现推送高低电平时,没有发生改变.几经折腾,发现该组PG的电源没开,硬件同事找到该组G ...
- 关于单片机检测高电平
IO口检测高点平的问题,曾经而困扰我不少时间,呵呵. 这几天做一个项目,又有点晕呼了,查了不少资料,做了一个总结,和大家分享~~ 1.51单片机的I/O 口检测高低电平是需要首先让该端口置为1的.此时 ...
- 【STM32F407学习笔记】GPIO(一)
[STM32F407学习笔记]GPIO(一) 1. GPIO基础知识 1.1 GPIO工作方式 1.2 GPIO相关配置寄存器 1.2.1 端口模式寄存器:GPIOx_MODER 1.2.2 输出类型 ...
- A40i使用笔记:GPIO操作方式(用于测试设备io驱动性能)(传统方式、设备树方式、寄存器方式操作GPIO)
一.前言 前文介绍了文件io的驱动方式,可以用于led点灯灭灯或者一些简单的不需求时序控制的ic操作,但是用于功能类ic,如AD采集芯片等时序控制需求高的,就不行了,这时候就需求高速io去实现指定的芯 ...
最新文章
- David与Vincent的博弈游戏[树型DP]
- 【Object类、日期、StringBuilder】
- [LOJ500]ZQC的拼图
- 第三次学JAVA再学不好就吃翔(part78)--List类
- 靠一个不存在的基因,写了学位论文顺利毕业的上交大硕士,被学校撤销了学位!...
- mysql force index报错_新特性解读 | MySQL 8.0 索引特性4-不可见索引
- javascript问题积累
- 原生态JS和JQuery版的动态添加、删除表格行
- c语言冒泡排序字母排序,排序与查找之冒泡排序篇(C语言实现)
- 强行进入远程计算机,远程桌面强制连接命令
- 全减器及其相关概念的理解
- fgo日服服务器维护,【FGO日服】活动维护公告(10/25)
- ndt_matching解读
- zabbix 使用教程
- Tableau仪表板制作
- 弘辽科技:关于老店盘活的基础思路。
- 消息中间件 一 之 AMQP译文(下)
- ipad上html语言编辑,在 iPad 上键入和编辑文本的小技巧
- linux 上查询cache 大小的方法
- ES6 Generator函数