按键输入实验(stm32)

news2024/10/5 16:31:17

目录

  • 按键的相关代码
    • key.c
    • key.h
  • LED的相关代码
  • BEEP的相关代码
    • beep.c
    • beep.h
  • main.c
  • 代码的相关说明
  • 相关硬件说明
  • 实验结果

说明:以下内容参考正点原子资料

按键的相关代码

key.c

void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3

	//初始化 WK_UP-->GPIOA.0	  下拉输入
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉	  
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.
}

//key_handle function
u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(WK_UP==1)return WKUP_PRES;
	}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; 	    
 	return 0;// 无按键按下
}


key.h

#ifndef __KEY_H
#define __KEY_H	 

#include "sys.h"
#define KEY0   GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
#define KEY1   GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1
#define WK_UP  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) 

 
#define KEY0_PRES 	1	//KEY0按下
#define KEY1_PRES	2	//KEY1按下
#define WKUP_PRES   3	//KEY_UP按下(即WK_UP/KEY_UP)

void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8);  	//按键扫描函数					    
#endif

LED的相关代码

参考前面文章:流水灯实验的代码

BEEP的相关代码

beep.c

void BEEP_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能GPIOB端口时钟
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //BEEP-->PB.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据参数初始化GPIOB.8
 
 GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出
}

beep.h

#ifndef __BEEP_H
#define __BEEP_H	 

#include "sys.h"
//蜂鸣器端口定义
#define BEEP PBout(8)	// BEEP,蜂鸣器接口		   
void BEEP_Init(void);	//初始化	 				    
#endif

main.c

int main(void)
 {
 	vu8 key=0;	
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  		//初始化与LED连接的硬件接口
	BEEP_Init();         	//初始化蜂鸣器端口
	KEY_Init();         	//初始化与按键连接的硬件接口
	LED0=0;					//先点亮红灯
	while(1)
	{
 		key=KEY_Scan(0);	//得到键值
	   	if(key)
		{						   
			switch(key)
			{				 
				case WKUP_PRES:	//控制蜂鸣器
					BEEP=!BEEP;
					break; 
				case KEY1_PRES:	//控制LED1翻转	 
					LED1=!LED1;
					break;
				case KEY0_PRES:	//同时控制LED0,LED1翻转 
					LED0=!LED0;
					LED1=!LED1;
					break;
			}
		}else delay_ms(10); 
	}	 
}

代码的相关说明

按键读取函数

#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) 

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;
  
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); 
  
  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;
}

typedef enum
{ 
  Bit_RESET = 0,
  Bit_SET
}BitAction;
  • IDR:端口输入数据寄存器
    在这里插入图片描述

相关硬件说明

在这里插入图片描述

在这里插入图片描述

实验结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ModaHub魔搭社区:可视化的AI原生云向量数据库 Milvus 2.2.9 :JSON、PartitionKey、Dynamic Schema

目录 新特性 功能增强 其他优化 问题修复 亮点颇多、精彩程度堪比大版本的 Milvus 2.2.9 来啦! 随着 LLM 的持续火爆,众多应用开发者将目光投向了向量数据库领域,而作为开源向量数据库的领先者,Milvus 也充分吸收了大量来自社…

ROS:话题名称设置

目录 一、 前言二、rosrun设置话题重映射三、launch文件设置话题重映射四、编码设置话题名称4.1C4.1.1全局名称4.1.2相对名称4.1.3私有名称 4.2Python 实现4.2.1全局名称4.2.2相对名称4.2.3私有名称 一、 前言 在ROS中节点名称可能出现重名的情况,同理话题名称也可…

[攻防世界] [RE] [APK] app2

解题思路 导入jadx查看manifest.xml 查看主函数并未发现有价值的东西&#xff0c;于是查看manifest.xml中主函数下一个<activity> 截取FileDataActivity代码 package com.tencent.testvuln;import android.os.Bundle; import android.widget.TextView; import com.tence…

2022年真题 - 15 - 磁盘管理(vdo磁盘)

磁盘管理 - vdo磁盘 题目配置验证配置题目 StorageSrv - 磁盘管理 在 storagesrv 上新加一块 10G 磁盘;创建 vdo 磁盘,并开启 vdo 磁盘的重删和压缩;名字为 vdodisk,大小为150G,文件系统为 ext4;并设置开机自动挂载。挂载到 /vdodata。配置 新加一块 10G 磁盘; 安装…

驱动 作业 day4

编写LED灯的驱动&#xff0c;创建三个设备文件&#xff0c;每个设备文件和一个LED灯绑定&#xff0c;当操作这个设备文件时只能控制设备文件对应的这盏灯。 此时没有安装led2 和led3的驱动所以会打开设备文件失败 装完以后就可以正常控制了 以下是设备现象 head.h ubuntuu…

docker 的整体架构及各模块组件 《深入docker底层原理》

1.Docker 整体架构 Docker 是一个 C/S 模式的架构&#xff0c;后端是一个松耦合架构&#xff0c;模块各司其职。 1、用户是使用 Docker Client 与 Docker Daemon 建立通信&#xff0c;并发送请求给后者。 2、Docker Daemon 作为 Docker 架构中的主体部分&#xff0c;首先提供…

Windows如何设置自动关闭未响应的程序?Windows设置自动关闭未响应的程序方法,带图详解

Windows系统程序经常出现程序未响应现象&#xff0c;如何通过注册表使其自动关闭呢 1、首先快捷键winR唤出【运行】 输入regedit 2、确定后就打开了注册表编辑器&#xff0c;定位到【HKEY_CURREnT_UsER\Control panel\desktop】项下 3、在右侧找【AutoEndTasks】数值数据&#…

yolo.h5文件问题的解决 - 吴恩达深度学习:目标检测之YOLO算法

1.下载下载yad2k: git clone https://github.com/allanzelener/yad2k.git 这里面顺便有yad2k.py文件 2.下载yolov2.cfg https://github.com/pjreddie/darknet/tree/master/cfg 3.下载yolov2.weights http://pjreddie.com/media/files/yolo.weights 需要这三个文件 自己去githup…

易模为真人3D手办制作带来了创新

3d打印技术是一项近年来迅速发展的先进制造技术&#xff0c;逐渐在各个领域展现出无限的潜力。其中&#xff0c;3d打印真人手办成为了一个备受关注的领域。在市面上&#xff0c;我们常常可以看到一些热门动漫角色或明星的真人3d手办&#xff0c;逼真的细节和完美的再现度让人们…

iOS上架报错:无法添加以供审核

无法提交以供审核 要开始审核流程 必须提供以下项目 您必须为要添加的 app 提供版权信息。 您在提交 app 审核时遇到的问题是因为需要提供版权信息&#xff0c;而您的 app 缺少相关的版权信息。以下是解决此问题的步骤&#xff1a; 确认您是否拥有 app 的版权&#xff1a;在提…

mac苹果电脑,怎么把mkv转换mp4格式

mac苹果电脑&#xff0c;怎么把mkv转换mp4格式&#xff1f;如果你是一名mac苹果电脑的用户&#xff0c;在电脑上下载到mkv格式的视频后会发现它使用起来非常的麻烦&#xff0c;甚至不能直接打开播放。mkv其实也是一种时间比较久远的视频文件格式&#xff0c;但是不知道是什么原…

eNSP-OSPF组播拓展

OSPF组播拓展 文章目录 OSPF组播拓展一、拓扑结构二、基础配置三、测试验证 启动 OSPF 协议后 &#xff0c; OSPF 将向本地所有运行 OSPF 协议的接口以组播224.0.0.5的形式发送hello报 文 &#xff1b; hello 报文中将携带本地 RID 值 &#xff0c; 以及本地已知的邻居的RID值&…

nginx反向代理 404 问题

发现我们设置了反向代理没有起作用&#xff0c;最后发现原来是伪静态惹得祸 解决nginx添加反向代理代码不生效-与原rewrite伪静态规则冲突了 以thinkphp官方给的伪静态为例 if (!-e $request_filename){rewrite ^(.*)$ /index.php?s$1 last; break;}仔细研究发现发现问…

Android OpenGL ES 学习(十三) -离屏渲染FBO(截图)RBO, OES转 FBO

Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投屏 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EB…

威胁和漏洞管理增强远程 IT 安全性

威胁和漏洞管理是保护组织设备和数据的主动方法。它可以帮助管理员识别漏洞并检查安全设置是否薄弱。通过使用此方法&#xff0c;可以在任何弱点成为安全漏洞之前对其进行修复。 对远程威胁和漏洞管理工具的需求 随着越来越多的员工远程工作&#xff0c;网络攻击的可能性也在…

基于Unity 3D实现的融合多元素风格游戏

完整资料进入【数字空间】查看——baidu搜索"writebug" 1.综合描述 1.1 产品背景 随着人们对游戏的追求&#xff0c;越来越多的优秀游戏被开发出来。目前&#xff0c;多风格元素游戏深受大众喜爱&#xff0c;例如绝地求生融合了 FPS 射击与生 存元素&#xff0c;守…

【软件分析/静态分析】chapter4 课程05/06 数据流分析—基础(Data Flow Analysis—Foundations)

&#x1f517; 课程链接&#xff1a;李樾老师和谭天老师的&#xff1a; 南京大学《软件分析》课程05&#xff08;Data Flow Analysis - Foundations I&#xff09;_哔哩哔哩_bilibili 目录 第四章 数据流分析——基础 4.1 从另一个视角看迭代算法&#xff08;Iterative Algor…

【乌鲁木齐】基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域应用

【原文链接】&#xff1a;【乌鲁木齐】基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247545692&idx1&sn1934aa8be717557c6c97c6b5e2a49151&chksmfe68f5…

web---text示例1

一、题目&#xff1a; <!-- 题目&#xff1a; 今日搜索热词 1、阿卡贝拉阿卡贝拉 (意大利: Acappella )即无伴奏合唱。 其起源可追溯至中世纪的教会音乐&#xff0c;当时的教会音乐只以人声清唱&#xff0c;并不应用乐器。 音频示例:阿卡贝拉.千与千寻2、翻唱“翻唱”…

Windows server防火墙如何设置阻止IP访问防火墙限制ip地址访问

无论是服务器还是本机电脑&#xff0c;安全都是非常重要的&#xff0c;一些安全软件设置后会拦截到一些异常IP&#xff0c;我们可以通过防火墙将异常IP加入黑名单&#xff0c;禁止访问&#xff0c;今天芳芳就和你们分享Windows防火墙如何设置IP禁止访问&#xff0c;希望可以帮助…