学习笔记二.矩阵按键

#学习笔记二:GPIO的探索与矩阵按键
##1.在配置cubemx时,对gpio的配置有开漏输出和推挽输出两种方式,在这里插入图片描述
###这里有一篇文章(别人的文章)讲的很详细link戳这里跳转

通俗来讲,推挽输出,可以输出高电平,也可以输出低电平。

而开漏输出,输出低电平,在有上拉电阻时,可以正常工作,他可以有多个上拉电阻,并且是与关系。
开漏输出
所谓的推挽输出模式,是根据这两个 MOS 管的工作方式来命名的。在该结构中输入高电平时,经过反向后,上方的 P-MOS 导通,下方的 N-MOS 关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后,N-MOS 管导通,P-MOS 关闭,对外输出低电平。当引脚高低电平切换时,两个管子轮流导通,P 管负责灌电流,N 管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为 0 伏,高电平为 3.3 伏,具体参考图 7_2,它是推挽输出模式时的等效电路。

在这里插入图片描述
开漏输出
开漏输出模式时,上方的 P-MOS 管完全不工作。如果我们控制输出为 0,低电平,则 P-MOS管关闭,N-MOS 管导通,使输出接地,若控制输出为 1 (它无法直接输出高电平) 时,则 P-MOS管和 N-MOS 管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须外部接上拉电阻,参考图 7_3 中等效电路。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平,0 伏。
在这里插入图片描述
##2.还有就是对IO口拉高还是拉低的问题。
这里有三种情况,pull down(拉低),pull up(拉高),no pull down no pull up(什么也不干),这是对IO口初始状态的设定。后面结合实例进行讲解。
##3.GPIO的函数
1.void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
功能: GPIO初始化
实例:HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);

2.void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
功能:在函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值

实例:HAL_GPIO_Init(GPIOC, GPIO_PIN_4);

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取引脚的电平状态、函数返回值为0或1

实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:引脚输入高低电平

实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
翻转引脚的电平状态

实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4); 常用在LED上

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:锁住引脚电平,比如说一个管脚的当前状态是1,当这个管脚电平变化时保持锁定时的值。

实例:HAL_GPIO_LockPin(GPIOC, GPIO_PIN_4);

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
功能: 外部中断服务函数,清除中断标志位

实例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
功能: 中断回调函数,可以理解为中断函数具体要响应的动作。

实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);
这些函数可以在下图这个.h文件找到。
在这里插入图片描述
下面贴上一段矩阵按键的扫描,帮助理解。

	HAL_GPIO_WritePin (R1_PORT, R1_PIN, GPIO_PIN_RESET);//在MX中设为output,只有这个函数能改变引脚电平状态,拉低一个,剩下的拉高
	HAL_GPIO_WritePin (R2_PORT, R2_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R3_PORT, R3_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R4_PORT, R4_PIN, GPIO_PIN_SET);
	
	if (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN))) 		//在MX中设置为input型,pull up拉高电平,这个函数读取io口电平,不是高即为按下,就锁定了一行中所在的一列
	{
		while (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN))); 
  return 13;                                          //S13   1
	}
	
	if (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)));   
	return 9;		          //S9 2
	}
	if (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)));   
	return 5;                                                      //S5    3
		
	}
		if (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)));   
		return 1;              //S1       4
		
	}

以这段代码为例(4*4矩阵按键),在cubemx中设置引脚状态为output,用HAL_GPIO_WritePin这个函数改变引脚电平,将第一行四列的引脚电平分别写为低,高高高,接下来扫描行,
if (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)))
{
while (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)));
return 9; //S9 2
}
我们知道按键按下,电路接通,即低电平按键生效,当读到的电平不是高电平,就锁定了行和列。
下面给出完整代码

uint8_t read_key(void)             //矩阵键盘扫描作用函数
{
		
	HAL_GPIO_WritePin (R1_PORT, R1_PIN, GPIO_PIN_RESET);//在MX中设为output,只有这个函数能改变引脚电平状态,拉低一个,剩下的拉高
	HAL_GPIO_WritePin (R2_PORT, R2_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R3_PORT, R3_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R4_PORT, R4_PIN, GPIO_PIN_SET);
	
	if (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN))) 		//在MX中设置为input型,pull up拉高电平,这个函数读取io口电平,不是高即为按下,就锁定了一行中所在的一列
	{
		while (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN))); 
  return 13;                                          //S13   1
	}
	
	if (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)));   
	return 9;		          //S9 2
	}
	if (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)));   
	return 5;                                                      //S5    3
		
	}
		if (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)));   
		return 1;              //S1       4
		
	}
	
	
	HAL_GPIO_WritePin (R1_PORT, R1_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R2_PORT, R2_PIN, GPIO_PIN_RESET);
	HAL_GPIO_WritePin (R3_PORT, R3_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R4_PORT, R4_PIN, GPIO_PIN_SET);
	if (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN)));   //S14    5
		return 14;              
	}
	if (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)));   //S10    6
	return 10; 
	}
	if (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)));    //S6   7
  return 6;  
	}
	if (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)));   //S2   8
return 2; 
		
	}
	
	HAL_GPIO_WritePin (R1_PORT, R1_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R2_PORT, R2_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R3_PORT, R3_PIN, GPIO_PIN_RESET);
	HAL_GPIO_WritePin (R4_PORT, R4_PIN, GPIO_PIN_SET);
	if (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN)));    //S15  9
return 15; 
	}
	if (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)));   //S11  0
return 11;  
	}
	
	if (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)))
	{

		while (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)));   //S7  K1

		return 7;
	}


		if (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)))             //S3   K2
	{


		while (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)));   

		return 3;
	
	}

		HAL_GPIO_WritePin (R1_PORT, R1_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R2_PORT, R2_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R3_PORT, R3_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin (R4_PORT, R4_PIN, GPIO_PIN_RESET);
	if (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C1_PORT, C1_PIN)));   //S16  K3
	return 16;
	}
	if (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C2_PORT, C2_PIN)));   //S12  K4

		return 12;
	}
	if (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C3_PORT, C3_PIN)));   //S8     K5
	return 8; 
	}

		if (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)))
	{
		while (!(HAL_GPIO_ReadPin (C4_PORT, C4_PIN)));   //S4      K6

		return 4;
	}
	return 0;
}

下面是.h文件

#ifndef _key_H_
#define _key_H_


#include "main.h"

#define R3_PORT GPIOC
#define R3_PIN GPIO_PIN_10

#define R2_PORT GPIOC
#define R2_PIN GPIO_PIN_9

#define R1_PORT GPIOC
#define R1_PIN GPIO_PIN_8

#define C2_PORT GPIOC
#define C2_PIN GPIO_PIN_12

#define C4_PORT GPIOC
#define C4_PIN GPIO_PIN_7

#define C3_PORT GPIOC
#define C3_PIN GPIO_PIN_6

#define C1_PORT GPIOD
#define C1_PIN GPIO_PIN_2

#define R4_PORT GPIOC
#define R4_PIN GPIO_PIN_11
uint8_t OLED_change(uint8_t SS);
uint8_t  read_key(void);
unsigned int call(unsigned int  high_time);



#endif

欢迎指正

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《机器学习学习笔记.pdf》是一本关于机器学习学习笔记的电子书,其内容涵盖了机器学习的基本概念、算法原理和实践应用等方面。 该电子书的主要内容包括但不限于以下几个方面: 1. 机器学习基础:介绍了机器学习的基本概念、发展历史和核心原理,帮助读者建立起对机器学习的整体认识和理解。 2. 机器学习算法:详细介绍了常见的机器学习算法,包括监督学习算法(如线性回归、逻辑回归、决策树、支持向量机等)、无监督学习算法(如聚类算法、降维算法等)和强化学习算法等,使读者能够了解和掌握不同类型的机器学习算法及其应用场景。 3. 机器学习实践:讲解了机器学习的实践方法和流程,涵盖了数据预处理、特征工程、模型选择和评估等方面的内容,帮助读者掌握如何在实际问题中应用机器学习技术。 4. 应用案例:通过实际案例的介绍和分析,展示了机器学习在自然语言处理、计算机视觉、推荐系统等领域的应用,激发读者对机器学习在实际问题中的应用的兴趣和思考能力。 通过阅读《机器学习学习笔记.pdf》,读者可以系统地学习机器学习的基础知识和算法原理,了解机器学习的应用场景和实践方法,并通过实际案例的分析深对机器学习技术的理解。这本电子书可以作为机器学习初学者的入门学习资料,也适合有一定机器学习基础的读者作为参考和进一步学习的资料。希望通过这本电子书的阅读,读者能够理解和掌握机器学习的相关知识,为未来在机器学习领域的学习和研究打下坚实的基础。 ### 回答2: 《机器学习学习笔记.pdf》是一本介绍机器学习学习资料。机器学习是一种通过利用数据来训练计算机算法的方法,使其能够自动地从数据中学习和提高性能。这本学习笔记涵盖了机器学习的基本概念、原理和方法,适合初学者和对机器学习感兴趣的读者。 首先,学习笔记从机器学习的基本概念入手,包括机器学习的定义、应用领域以及机器学习的三个主要任务:监督学习、无监督学习和强化学习。然后,详细介绍了机器学习的基本原理,如训练集、测试集、特征选择和模型评估等。此外,学习笔记还介绍了几种常见的机器学习算法,如决策树、支持向量机和深度学习等。 除了理论知识,学习笔记还提供了实践案例和代码示例,帮助读者更好地理解和应用机器学习算法。读者可以通过实践案例来掌握机器学习算法的具体应用,并且可以利用代码示例进行实际编程实践。同时,学习笔记还讨论了机器学习的一些挑战和未来的发展方向,如数据质量、模型解释性和自动化机器学习等。 总的来说,《机器学习学习笔记.pdf》是一本全面介绍机器学习学习资料。它结合理论和实践,旨在帮助读者建立对机器学习的基本理解,并具备在实际问题中应用机器学习算法的能力。无论是初学者还是有一定机器学习基础的读者,都可以从中获得有益的知识和经验。 ### 回答3: 《机器学习学习笔记.pdf》是一本关于机器学习学习笔记文档。机器学习是人工智能领域的重要分支,它研究如何使计算机系统自动从数据中学习和改进,以完成特定任务。这本学习笔记以简洁明了的方式介绍了机器学习的基本概念、算法和实践应用。 笔记中首先介绍了机器学习的基础知识,包括监督学习、无监督学习和强化学习等不同的学习类型。然后详细讲解了常用的机器学习算法,如线性回归、逻辑回归、决策树、支持向量机等。每种算法都给出了清晰的定义和示例,并详细解释了算法的原理和应用场景。 此外,《机器学习学习笔记.pdf》还包括了机器学习的实践应用和案例分析。它介绍了如何通过Python等编程语言和机器学习库进行实际的机器学习项目开发,包括数据预处理、特征工程、模型训练和评估等环节。对于初学者来说,这部分内容非常有价值,可以帮助他们快速进入实际应用的阶段。 总结来说,《机器学习学习笔记.pdf》是一本很好的机器学习入门教材,它详细介绍了机器学习的基本概念和常用算法,并提供了实际项目的实践指导。无论是对于想要了解机器学习基础知识的初学者,还是对于已经有一定机器学习经验的开发者来说,这本学习笔记都是一本值得阅读和参考的资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球先生_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值