单片机03--按键--寄存器版

news2025/5/19 16:07:10

GPIO端口相关寄存器STM32F40x芯片

目标:

开关KEY1控制开灯。

分析:

KEY1---PA0--->输入---->浮空输入/下拉输入

KEY1不导通时,PA0输入为低电平,KEY1导通时,PA0输入为高电平。

实现:
按键初始化

①查找PA连接的时钟线,开启时钟。

②设置GPIO端口模式---->输入模式

③设置GPIO端口输入模式

/*****************************************
函数功能:按键初始化
函数接口:KEY1--PA0--浮空/下拉输入
******************************************/
void KEY_Init(void)
{
	RCC->AHB1ENR |= 1<<0;	//按键PA0时钟使能
	
	GPIOA->MODER &= ~(3<<0*2);	//清零&&输入模式
	GPIOA->PUPDR &= ~(3<<0*2);	//清零&&浮空
	GPIOA->PUPDR |= 2<<0*2;	//下拉
}
按键消抖

①获取KEY1/PA0的状态

GPIOA->IDR只允许读,不允许写。获取PA0口的状态需要(GPIOA->IDR & 1<<0)。

②if两次读取GIPA->IDR的第0位,实现消抖。

③设静态变量flag作为标志位,防止已有按键按下时,其他按键按下仍能进行操作

/*****************************************
函数功能:按键消抖
函数接口:KEY1--PA0--浮空/下拉输出
返回参数:返回0:没有按下,返回1:按键按下
******************************************/
uint8_t KEY_Scan(void)
	{	static uint8_t flag =0;	//0:按键未按下,1:按键已按下
	if((flag ==0) && (GPIOA->IDR & 1<<0))	//判断按键是否按下,IDR第0位为1时按下
	{
		flag = 1;
		delay(500);
		if(GPIOA->IDR & 1<<0)
		{
			return 1;
		}
	}
	else if((flag==1)&& !(GPIOA->IDR & 1<<0))	//松手检测
	{
		flag = 0;	//按键松手
	}
	return 0;
}
位带头文件

io_bit.h可以在社区获得。

 将位带头文件包含到编辑的头文件中,通过宏定义,可实现更简单操作寄存器。

点亮LED的方法:

LED6 = 0; //PB3低电平点亮

GPIOB->ODR &=  ~(1<<4); //PB4低电平点亮

GPIOB->ODR &=  ~(1<<5); //PB5低电平点亮

两个按键检测&&按键位带使用举例:

//双按键检测
uint8_t KEY_Scan2(void)
{
	static uint8_t flag = 0;
	if((flag == 0)&&(GPIOA->IDR & 1<<0 || GPIOA->IDR & 1<<1))
	{
		delay(1000);
		if(GPIOA->IDR & 1<<0)
		{
			return 1;
		}
		if(GPIOA->IDR & 1<<1)
		{
			return 2;
		}
	}
	else if((flag == 1) && (!(GPIOA->IDR & 1<<0) || !(GPIOA->IDR & 1<<1)))
	{
		flag = 0;
	}
	return 0;
}

//位带使用
uint8_t KEY_Scan3(void)
{
	static uint8_t flag = 0;
	if((flag == 0)&&(KEY1==1 || KEY2 == 1))
	{
		delay(1000);
		if(KEY1==1)
		{
			return 1;
		}
		if(KEY2==1)
		{
			return 2;
		}
	}
	else if((flag == 1) && (KEY1==0 || KEY2==0))
	{
		flag = 0;
	}
	return 0;
}

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

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

相关文章

Elasticsearch 别名(Aliases)的作用

Elasticsearch 8.4.3 别名&#xff08;Aliases&#xff09; 一. 介绍二. 别名的优势三. 别名的基本操作3.1 创建别名3.2 查询别名关联的索引3.3 删除别名3.4 更新别名3.5 通过别名查询数据 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接…

2024.2.21

1、用多线程进行文件拷贝 #include<myhead.h>//参数结构体创建 typedef struct INFO {const char *srcfile;const char *destfile;int length; }Info;//定义获取文件长度的函数 int get_file_len(const char *srcfile,const char *destfile){int srcfd,destfd;//只读形式…

MySQL 查询遇到Illegal mix of collations的错误

业务同学线上业务执行 SQL 时报错&#xff0c; ### Error querying database. Cause: java.sql.SQLException: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) for operation like含义是对like操作非法混合了排序规则(utf8mb4_ge…

qml 电池控件设计(手把手从零开始)

一、说明 做 qt 开发也有好几年了&#xff0c;一直基于QWidget 框架做的开发&#xff0c;使用重写 paint 函数实现各种显示效果&#xff0c;在复杂的 ui 开发中&#xff0c;控件一多或者刷新频率一高&#xff0c;其实也是存在性能限制。 一般来说&#xff0c;qt 的界面对象全部…

MKS T3BI集成蝶阀说明T3B-T3PRS-232Supplement

MKS T3BI集成蝶阀说明T3B-T3PRS-232Supplement

洛谷 P1016 [NOIP1999 提高组] 旅行家的预算【贪心】

原题链接&#xff1a;https://www.luogu.com.cn/problem/P1016 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市&#xff08;假设出发时油箱是空的&#xff09;。给定两个城市之间的距离 D1​、汽车油箱的容量 C&#xff08;以升为单位&#xff09;、每升汽…

计网day5

六 传输层 6.1 传输层概述 6.2 UDP协议 6.3 TCP协议 TCP连接管理&#xff1a; TCP可靠传输&#xff1a; TCP拥塞控制&#xff1a;

unity学习(32)——跳转到角色选择界面(父子类问题)

新问题 应该是两个脚本之间缺少继承关系 its children 解决起来很简单&#xff0c;把ResceneScript也绑到canvas上就可以了 。 此时&#xff0c;在账号密码正确的情况下&#xff0c;是可以完成场景切换。 对应的代码如下&#xff1a; TMP_Text d GameObject.FindWithTag(&…

【问题解决】删除node节点后如何把node节点重新加入

环境明细 docker版本&#xff1a; 25.0.3kubeadm 版本&#xff1a;v1.25.0 1 在master节点删除node节点 [rootk8s-master ~]# kubectl delete nodes k8s-node-02 node "k8s-node-02" deleted [rootk8s-master ~]# kubectl get nodes -o wide NAME STAT…

基于 GTSAM 的因子图简单实例

Title: 基于 GTSAM 的因子图简单实例 文章目录 I. 引言II. GTSAM 的安装与配置III. 基于 GTSAM 的因子图实例的 C 实现1. C 源码2. CMakeLists.txt 脚本3. 数值结果 IV. 基于 GTSAM 的因子图实例的 Python 实现1. Python 源码2. 数值结果3. 可视化结果 V. 总结 关联博文: 因子图…

day2:信号与槽

思维导图 使用手动连接&#xff0c;将登录框中的取消按钮使用t4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"123",密码是否为"…

springboot集成JWT实现token权限认证

vuespringboot登录与注册功能的实现 注&#xff1a;对于JWT的学习&#xff0c;首先要完成注册和登录的功能&#xff0c;本篇博客是基于上述博客的进阶学习&#xff0c;代码页也是在原有的基础上进行扩展 ①在pom.xml添加依赖 <!-- JWT --> <dependency><grou…

【Linux】git操作 - gitee

1.使用 git 命令行 安装 git yum install git 2.使用gitee 注册账户 工作台 - Gitee.com 进入gitee&#xff0c;根据提示注册并登录 新建仓库 仓库名称仓库简介初始换仓库 3.Linux-git操作 进入仓库&#xff0c;选择“克隆/下载” 复制下面的两行命令进行git配置 然后将仓库clo…

Vue3引用第三方模块报错Could not find a declaration file for module ***.

在引用第三方的组件时候报错如下 原因是&#xff1a;该组件可能不是.ts文件而是.js文件 解决方案&#xff1a; 1.在Src的目录下面新建一个文件为shims-vue.d.ts的文件 2.文件内容为 declare module xxx&#xff0c;xxx就是你报错的模块 例如我这样 declare module vue3-pu…

【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

欢迎大家来到c语言知识小课堂&#xff0c;今天的知识点是操作符和进制 目录 一、进制之间的转化1、什么是二进制&#xff0c;八进制&#xff0c;十进制&#xff0c;十六进制2、进制之间的转化其他进制转化为十进制十进制转化为二进制二进制转化为八进制八进制转化为二进制二进…

2023年最新阿里云服务器价格表(配置价格+磁盘+带宽)

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

P2957 [USACO09OCT] Barn Echoes G

P2957 [USACO09OCT] Barn Echoes G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P2957 题目分析 对于求单个字符串的哈希值相当于求前缀和&#xff0c;而求单个字符串的子串的哈希值则相当于求其区间和&#xff1b; 那么只需求两个…

fail-safe机制与fail-fast机制分别有什么作用

fail-safe和fail-fast&#xff0c;是多线程并发操作集合时的一种失败处理机制。 Fail-fast&#xff1a;表示快速失败&#xff0c;在集合遍历过程中&#xff0c;一旦发现容器中的数据被修改了&#xff0c;会立刻抛出ConcurrentModificationException异常&#xff0c;从而导致遍…

Selenium基于Python web自动化测试框架 -- PO

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

代码随想录第二十一天 701.二叉搜索树中的插入操作 108.将有序数组转换为二叉搜索树

701.二叉搜索树中的插入操作 题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&a…