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

这篇具有很好参考价值的文章主要介绍了单片机03--按键--寄存器版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GPIO端口相关寄存器(STM32F40x芯片)

目标:

开关KEY1控制开灯。

单片机03--按键--寄存器版,单片机,单片机,嵌入式硬件

分析:

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

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

实现:
按键初始化

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

单片机03--按键--寄存器版,单片机,单片机,嵌入式硬件

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

单片机03--按键--寄存器版,单片机,单片机,嵌入式硬件

③设置GPIO端口输入模式

单片机03--按键--寄存器版,单片机,单片机,嵌入式硬件

/*****************************************
函数功能:按键初始化
函数接口: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的状态

单片机03--按键--寄存器版,单片机,单片机,嵌入式硬件

单片机03--按键--寄存器版,单片机,单片机,嵌入式硬件

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可以在社区获得。

单片机03--按键--寄存器版,单片机,单片机,嵌入式硬件

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

单片机03--按键--寄存器版,单片机,单片机,嵌入式硬件

点亮LED的方法:

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

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

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

两个按键检测&&按键位带使用举例:文章来源地址https://www.toymoban.com/news/detail-837105.html

//双按键检测
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;
}

到了这里,关于单片机03--按键--寄存器版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 单片机学习笔记——特殊功能寄存器(SFR)_(上)

    单片机学习笔记——特殊功能寄存器(SFR)_(上)

    目录 片内RAM的特殊功能寄存器 F0H——寄存器B 单片机乘法原理 单片机除法原理 E0H——累加器ACC ACC和A的区别和联系 寄存器和存储器的区别和联系 D0H——程序状态控制字PSW B8H——中断优先级控制寄存器IP A8H——中断允许寄存器IE B0H——特殊功能寄存器P3 A0H——特殊功能寄存

    2024年02月03日
    浏览(12)
  • 【51单片机】利用【与或赋值法】优化【配置TMOD寄存器】

    前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 本文是YY入门【【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)】配合博客的其中一部分,

    2024年02月19日
    浏览(5)
  • 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信  2.1 串口简要模式图  2.2 相关寄存器 (1)PCON、SCON、SBUF (2)IE、IPH、IP (3)配置T1定时器 2.3 波特率和系统时钟和TH1和TL1计算  3.串口通信简单收发使用代码   3.1 在STC-isp使用端口助手,从单片机发送字节  3.2 通过端口助手利用主

    2024年02月05日
    浏览(15)
  • 嵌入式学习笔记——使用寄存器编程操作GPIO

    嵌入式学习笔记——使用寄存器编程操作GPIO

    上一篇重点介绍了STM32 GPIO的输入输出模式,在整个框图中我们发现需要我们使用代码来控制GPIO的模式,本文的重点就是使用寄存器的编程方式,实现对于GPIO口的操作。 在这里首先需要做一个区分,我们常见的STM32的开发方式有两种,也就是寄存器开发与库函数开发。寄存器

    2023年04月09日
    浏览(10)
  • 嵌入式51单片机04-矩阵按键系列

    嵌入式51单片机04-矩阵按键系列

    一、矩阵按键基础知识 矩阵按键工作原理 : 逐行扫描 :通过高四位轮流输出低电平来对矩阵键盘进行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过判断低四位数据中哪一位为零来判断哪一个按键被按下。 逐列扫描 :通过低四位轮流输出低电平来

    2024年02月07日
    浏览(18)
  • 嵌入式中详解 ARM 几个常见的寄存器方法

    嵌入式中详解 ARM 几个常见的寄存器方法

    大家好,今天来聊聊对于ARM几个特殊寄存器的理解,FP、SP和LR。 1、介绍 FP:栈顶指针,指向一个栈帧的顶部,当函数发生跳转时,会记录当时的栈的起始位置。 SP:栈指针(也称为栈底指针),指向栈当前的位置, LR:链接寄存器,保存函数返回的地址。 关于gcc就有一个关

    2024年02月20日
    浏览(8)
  • 嵌入式:ARM间接寻址、变址寻址与多寄存器寻址

    嵌入式:ARM间接寻址、变址寻址与多寄存器寻址

    寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令: 第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。 ARM的数据传送指令都是基于寄存器间接寻址,即通过

    2024年02月09日
    浏览(12)
  • 单片机接口与技术 实验03 显示器与按键

    单片机接口与技术 实验03 显示器与按键

    目录 前言: 1、实验目的: 2、实验内容: 第一版:lcd1602显示器: 代码 电路图 第二版(提高版): 代码: lcd1602.h lcd1602.c main.c 电路图: 电路图详解: 代码详解: lcd1602.h lcd1602.c lcd1602命令字 重点:         首先是初始化         显示字符串         设置光标位置    

    2024年02月08日
    浏览(8)
  • 嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置

    嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置

    上一篇中,对串口做了个概述,主要是介绍了串口通信的特征,异步串行全双工通信,然后就是结合串口的框图梳理了一下STM32中USART的配置流程以及发送接收数据的流程,本文将接着上篇的内容,对串口的寄存器做个介绍,然后实现一个简单的收发实验。 根据之前GPIO的经验

    2024年02月05日
    浏览(9)
  • 【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】

    在 C 语言中,可以使用宏定义来创建用于清除(清零)或设置(置一)32位地址中特定位的函数。以下是两个宏定义的示例: 这里的 addr 是指向目标32位地址的指针, bit 是需要操作的位的索引(从0开始计数)。 示例使用方式 假设要操作的是一个具有可读写属性的寄存器,它

    2024年03月22日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包