51单片机学习记录笔记(5)--矩阵键盘

学习链接:

[6-1] 矩阵键盘_哔哩哔哩_bilibili

相关知识点:

基础

电路图:

电路图的原理其实跟我们数码管的很像, 但矩阵按键是逐列扫描,P13,P12,P11,P10是控制整个列,如果该列输入高电平,那一整列没有按钮按下,同时P17、P16、P15、P14是控制对应列的对应行的,例如比如说S6按下,那么P12为0,P16为0.

 MatrixKey.c

#include <REGX52.H>
#include "Delay.h"

/**
  * @brief  矩阵键盘读取按键键码
  * @param  无
  * @retval KeyNumber 按下按键的键码值
			如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0
  */
unsigned char MatrixKey()
{
	unsigned char KeyNumber=0;
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
	
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
	
	return KeyNumber;
}

这里的代码设置就是先确定是哪一列,然后再确定是哪一行。

因为我的LED1602可能G了,我这里就用我们的老朋友LED模块来试一试,矩阵键盘有16个按键,可以代表16种状态,我们可以直接把这个数据输入到LED模块中,观察有什么变化。

10000 0001D1不亮
20000 0010D2不亮
30000 0011D1、D2不亮
40000 0100D3不亮
50000 0101D1、D3不亮
60000 0110D2、D3不亮
70000 0111D1、D2、D3不亮
80000 1000D4不亮
90000 1001D1、D4不亮
100000 1010D2、D4不亮
110000 1011D1、D2、D4不亮
120000 1100D3、D4不亮
130000 1101D1、D3、D4不亮
140000 1110D2、D3、D4不亮
150000 1111D5,D6,D7,D8亮
160001 0000D5不亮

main.c

#include <REGX52.H>
#include "MatrixKey.h"	//包含矩阵键盘头文件

unsigned char KeyNum;

void main()
{

	while(1)
	{
		KeyNum=MatrixKey();				//获取矩阵键盘键码
		if(KeyNum)						//如果有按键按下
		{
			P2=KeyNum;
		}
	}
}

效果:

补充:使用template可以快速填充代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值