STM32G4之按键实验_正点原子stm32g4(1)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的, 并且外部都没有上下拉电阻,所以,需要在 STM32F4 内部设置上下拉,STM32G4是可以看到外部接了上拉电阻的,所以程序里面没有设置上下拉模式

输入上拉:无论输入管脚悬空或者被高电平驱动时,读取的都是1. 只有在输入端为0的时,读取到的值才是0。

要判断KEY0,1,2的IO口电平,只有按键按下了,输入端为0 ,才能检测读取到低电平,所以这三个引脚选择输入上拉模式

输入下拉:无论输入管脚悬空或者被低电平驱动时,读取的都是0. 只有在输入端为1的时,读取到的值才是1。

要判断KEY_UP的IO口电平,只有按键按下了,输入端为1,才能检测读取到高电平,所以这这个引脚选择输入下拉模式

GPIO模式详细介绍:GPIO模式

二、程序编写

按键GPIO设置为浮空输入,使用STM32CubeMX配置

在这里插入图片描述

将里面按键IO的初始化移植到LED的工程下。

1.按键扫描函数

unsigned char Key\_Scan(void)
{
	unsigned char unKey_Val = 0;
	
	if(HAL\_GPIO\_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
		unKey_Val = 1;

	if(HAL\_GPIO\_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
		unKey_Val = 2;

	if(HAL\_GPIO\_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET)
		unKey_Val = 3;
	
	if(HAL\_GPIO\_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
		unKey_Val = 4;	
	
	return unKey_Val;
}


2.按键处理函数


__IO uint32\_t uwTick_Set_Point = 0;

unsigned char ucKey_Val,ucKey_Down,ucKey_Up,ucKey_Old;
void Key\_Proc(void)
{
	// uwTick每隔1ms加1 刚开始肯定差值大于100ms
	if((uwTick -uwTick_Set_Point) < 100) return; // 每隔100ms扫描一次 
	uwTick_Set_Point = uwTick;  // 记录每次扫描时的uwTick值
	
	ucKey_Val = Key\_Scan();
	ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);
	ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);
	ucKey_Old = ucKey_Val;
	
	if(ucKey_Down == 4)
	{
		LED\_Display(0x88);
	}
	if(ucKey_Down == 1)
	{
		LED\_Display(0x00);
	}
}

&(按位与): 两个操作数都为1 ,才为1  1&0 = 0 0&1 = 0 1&1 = 1
|(按位或):两个操作数只要有一个为1 ,结果为1  1|0 = 1 1|1= 1  0|0 = 0
^(按位异或):两个操作数相同为0 ,不同才为1 0^0 = 1 1^0 = 0
~(取反):0变为1 ,1变为 0 ~0=1

位运算参考:位运算

按键扫描可以分为三种情况:

情况1 : 100ms扫描了两次,按键返回的结果从0 变为4(按键4被按下了),产生了下降沿
ucKey_Val = 4 (0000 0100)
ucKey_Down = 0000 0100 & (0000 0000 ^ 0000 0100) = 0000 0100 & 0000 0100 = 0000 0100 =4
ucKey_Up = ~0000 0100 & (0000 0000 ^ 0000 0100) = 1111 1011 & 0000 0100 = 0 
ucKey_Old = 4

情况2 : B4产生了下降沿后,按键一直按着
ucKey_Val = 4
ucKey_Down = 0000 0100 & (0000 0100 ^ 0000 0100) = 0000 0100 & 0000 = 0
ucKey_Up = 1111 1011 & 0000 0000 =0
ucKey_Old = 0000 0100 = 4


![img](https://img-blog.csdnimg.cn/img_convert/bf6ae013755d9552d82816a0de7a0e16.png)
![img](https://img-blog.csdnimg.cn/img_convert/f908400bb226041c6a6b841e27d043f0.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值