IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32白话文教程(三)内置按键模块、外接按键检测 三句话让你玩明白按键 水银倾斜模块 -> 正文阅读

[嵌入式]STM32白话文教程(三)内置按键模块、外接按键检测 三句话让你玩明白按键 水银倾斜模块

还不知道检测输入电平信号用什么输入模式?

就简单的记住:
检测端口输入低电平0要用上拉 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
检测端口输入高电平1要用下拉 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

你不知道你外接按键的原理图,不知道检测什么电平?

最简单的方法:
用电压表黑接地,红接输入端,一测便知。

没有外部按键模块?

骚操作:‘’所有的IO口都是外部按键‘’!
你甚至可以直接用杜邦线接VCC或地来模拟输入高低电平,起到按键效果。

看过第一篇你应该知道怎么初始化GPIO了
所以只讲一些新技巧,也就是上面三点。
下面是每一点的解释。

检测输入电平信号用什么输入模式?

在这里插入图片描述
PE2/PE3/PE4 按下后接地,输入为0,所以用上拉
PA0 按下后通3.3V电压,输入为1,所以用下拉

你不知道你外接按键的原理图,不知道检测什么电平?

你可以在模块上分清 VCC(中间) 和GND(—),那剩下的 Signal(S) 就是输入到STM32引脚来检测电平的。请添加图片描述

用电压表检测
GND和Signal两端电压电压3.3V
按下后为0
这不跟上面内置的3个按键一样吗?
所以用上拉输入

水银倾斜检测模块

用电压表检测
GND和Signal两段电压电压3.3V

请添加图片描述
水银将内部连通之后 指示灯点亮
GND和Signal两端电压电压0
跟以上按键类比 是一样的道理
请添加图片描述

没有外部按键模块?

按键的检测不就是检测一个引脚的高低电平吗?

你可以直接:
上拉一个引脚
用杜邦线接地就是一次按键
下拉一个引脚
用杜邦线接VCC也是一次按键

如果你不想外部按键在PA6 想改成PE9 怎么办?
只需把初始化与PA6相关的做修改

以下为相关代码

只需改这3处  也必须要同时全部改掉这3RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_Init(GPIOA, &GPIO_InitStructure);
/*-----------------------
文件名称:main.c
文件描述:按键控制LED闪烁,按下按键
S1取反LED2,
S2取反LED3,
S4同时取反LED2,LED3
The_Key(外部按键)使LED2,LED3闪烁5次
---------------------------*/
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"

int main(void)
{
  uint8_t j; //定义变量 用于后面for循环
  LED_Init();//LED初始化
  KEY_Init();//内置按键初始化
  The_Key_Init();//外部按键初始化
  Daley_Init();//延时初始化
  while (1)
  {
		if(!S1)
		{
			Delay_ms(10);
			//延迟消抖 51单片机教程按键中已讲过
			if(!S1)	
			{
				 while(!S1);//等待按键释放
				 LED2_REV;
			}
		}
		if(!S2)
		{
			Delay_ms(10);
			if(!S2)	
			{
				 while(!S2);
				 LED3_REV;
			}
		}
//按键3类比1、2 此处省略
		if(S4)
		{
			Delay_ms(10);
			if(!The_Key)	
			{
				 while(!The_Key);
				 LED2_REV;
				 LED3_REV;
			}
		}
		//外接按键PA6 
		//你也可以直接用杜邦线接VCC或地来模拟输入高低电平 起到按键效果
	 if(!The_Key)
		{
			Delay_ms(10);
			if(S4)	
			{
			while(S4);
				for(j=0;j<10;j++)
				{
				 LED2_REV;
				 LED3_REV;
				 Delay_ms(100);
				}
			}
		}
  }
}
/*------------------------------
文件名称:key.c
文件描述:配置按键初始化参数       
--------------------------------*/
#include "key.h"

void KEY_Init(void)//内部按键 PE2/PE3/PE4/PA0
{
	GPIO_InitTypeDef GPIO_InitStructure;
	//打开PE口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	//PE2,PE3,PE4引脚设置	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
	//端口速度
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	//端口模式,此为输入上拉模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	//初始化对应的端口
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	//PA0、PA6引脚设置	
	//打开PA口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	//端口速度
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	//端口模式,此为输入下拉模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	//初始化对应的端口
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void The_KEY_Init(void)//外部按键  我用PA6去读取
{
	GPIO_InitTypeDef GPIO_InitStructure;
	//打开PA口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//PA0引脚设置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	//端口速度
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	// 端口输入低电平0要上拉  输入高电平1要下拉
	//端口模式,此为输入上拉模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	//初始化对应的端口
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*------------------------------
文件名称:key.h      
--------------------------------*/
#ifndef __KEY_H
#define __KEY_H

#include "stm32f10x.h"

#define S1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define S2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define S3 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define S4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define The_Key GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)

void KEY_Init(void);

void The_KEY_Init(void);

#endif
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:46:05  更:2021-08-12 16:46:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 12:07:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码