Hal库_stm32开发之矩阵键盘,可移植

矩阵键盘的原理:        

本文采用的扫描原理是:所有行设为输出模式高电平),所有列设为输入模式。(上拉

       1. 先判断第一行的按键;设置第一行为低电平,其余行为高电平,然后按顺序依次读取第一个到第四个按键,哪一个为低电平,哪一个就被按下。

        2.再判断第二行的按键;设置第二行为低电平,其余行为高电平,然后按顺序依次读取第五个到第八个按键,哪一个为低电平,哪一个就被按下。

        3.以此类推,就可以完成全部矩阵键盘的读取了。

矩阵键盘原理图(仅供参考)

R1即row1(第一排)

C1即column1(第一列)

剩下的以此类推

Cubemx的配置

代码如下

Matrixkey.c

#include "main.h"
#include "usart.h"
//#include "gpio.h"

int MatrixKey()  //修改
{
		int KeyNumber = 0;  //储存按键值
		int cnt = 0; //长按计数
		
			HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET); //  PB13 = 0 
//		HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); //  PB12 = 1
//		HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); //  PB15 = 1
//		HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); //  PB14 = 1
		if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 1; }
		if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 2; }	
		if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 3; }
		if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 4; }
		
		HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); //  PB13 = 1 			
		HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_RESET); //  PB12 = 0
//		HAL_GPIO_WritePin(R3_GPIO_Port, R3_PinR3_PinR3_PinR3_Pin, GPIO_PIN_SET); //  PB15 = 1
//		HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); //  PB14 = 1
		if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 5; }
		if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 6; }	
		if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 7; }
		if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 8; }			
			
		HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); //  PB13 = 1 			
		HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); //  PB12 = 1
		HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_RESET); //  PB15 = 0
//		HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); //  PB14 = 1
		if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 9; }
		if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 10; }	
		if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 11; }
		if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 12; }
			
		HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); //  PB13 = 1 			
		HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); //  PB12 = 1
		HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); //  PB15 = 1
		HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_RESET); //  PB14 = 0
		if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 13; }
		if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 14; }	
		if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 15; }
		if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
			{		HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 16; } //长按效果
		HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); //  PB13 = 1 			
		HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); //  PB12 = 1
		HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); //  PB15 = 1
		HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); //  PB14 = 1
			
//			if(KeyNumber != 0)
//			{
//				printf("%d",KeyNumber);
//				KeyNumber = 0;
//			}	
	return KeyNumber;
}

Matrixkey.h

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__

int MatrixKey();

#endif

  • 11
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值