03_51入门_矩阵按键

导语

独立按键在系统中大量使用,会占用大量的IO口,因此采用矩阵按键的设计。使用 8 个 IO可实现了 16 个按键,与此对应的也可以设计更为复杂的电路,来实现更少的IO,更多的按键,本质上都是通过IO捕获电平上的变化。

矩阵按键

电路

通过行与列的扫描来检查那个IO电平被按下,而当某一个按键按下时,改按键对应的行和列就会短接,当按键按下时,一个高电平和低电平短接会把高电平拉低。

逐行扫描:高4位P17-P14链接每一行,依次把每一行设置为低电平,把低4位设置未高电平,然后检测第四位是否全为1,如果不全为1,说明有按键按下,电平被拉低,也就是对应的按键被按下,如此循环检测每一行;其实根据原理可以看出来,除了逐行扫描,也可以逐列扫描,原理相同;

行列扫描:和逐行或逐列扫描不通的是行列扫描;扫描原理是先把高4位设置为低电平,把低4位设置为高电平,这样如果低4位中有电平变低,说明该列有按键按下,但不知道具体是哪一行的按键;接着反过来操作,把高4位设置为高电平,低四位设置为低电平,检测高4位哪一位被拉低,那么按键就在对应的行上,这样通过两次扫描就知道该按键在哪一行哪一列了, 也就知道具体是哪个按键被按下了。

image-20220822085308571

程序

void KeyScan()
{
	//4*4矩阵键盘扫描
	P3 = 0XF0;//列扫描
	if(P3 != 0XF0)//判断按键是否被按下
	{
		delay(10);//软件消抖10ms
		if(P3 != 0XF0)//判断按键是否被按下
		{
			switch(P3) //判断那一列被按下
			{
				case 0xe0:	KeyValue = 0;	break;//第一列被按下
				case 0xd0:	KeyValue = 1;	break;//第二列被按下
				case 0xb0:	KeyValue = 2;	break;//第三列被按下
				case 0x70:	KeyValue = 3;	break;//第四列被按下 
			}
			P3 = 0X0F;//行扫描
			switch(P3) //判断那一行被按下
			{
				case 0x0e:KeyValue = KeyValue;break;//第一行被按下
				case 0x0d:KeyValue = KeyValue + 4;break;//第二行被按下
				case 0x0b:KeyValue = KeyValue + 8;break;//第三行被按下
				case 0x07:KeyValue = KeyValue + 12;break;//第四行被按下 
			}
			while(P3 != 0X0F);//松手检测	
		}
	}
	P3 = 0XFF;//独立按键扫描
	if(P3 != 0XFF)
	{
		delay(10);//软件消抖10ms
		if(P3 != 0XFF)
		{
			switch(P3) //判断那一行被按下
			{
				case 0xfe:	KeyValue = 16;	break;//S2被按下
				case 0xfd:	KeyValue = 17;	break;//S3被按下
				case 0xfb:	KeyValue = 18;	break;//S4被按下
				case 0xf7:	KeyValue = 19;	break;//S5被按下 
			}
			while(P3 != 0XFF);//松手检测			
		}	
	}
}
 

其他键盘

8个IO控制64个IO。

在这里插入图片描述

元器件是电路良好运行的基本保证,找元器件现货上唯样商城,原厂授权 正品保障,品类齐全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天才小狸花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值