学习笔记——矩阵键盘的扫描原理与基本应用

一、任务简述

在CT107D单片机上,使按键S4-S19组成4X4的矩阵键盘,在扫描按键的过程中,发现有按键触发信号后(不做去抖动处理),待按键松开后,在数码管的第一位显示相应的数字:从左至右,从上到下,依次显示0-F。

二、实现方法

数码管显示和573锁存器选择设置可以参考上几篇博客,在此就不再做过多讲解。重点讲解下怎么构成矩阵键盘:

第一行(R1):S7,S11,S15,S19;
第一行(R2):S6,S10,S14,S18;
第一行(R3):S5,S9,S13,S17;
第一行(R4):S4,S8,S12,S16;
第一列(C1):S7,S6,S5,S4;
第一列(C2):S11,S10,S9,S8;
第一列(C3):S15,S14,S13,S12;
第一列(C4):S19,S18,S17,S16;
即 P3引脚控制矩阵键盘。
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

sbit C4 = P3^4;
sbit C3 = P3^5;
sbit C2 = P3^6;
sbit C1 = P3^7;
如何判断是哪一个按键按下:令R1为低电平,其他行为高电平;先令C1为低电平,其他列为高电平,判断是否为S7按下,若不是则令C2为低电平,其他为高电平,判断是否为S6按下,若不是,则继续依次方法类推,直至判断出是哪一个按键按下。

在这里插入图片描述

三、参考代码

#include "reg52.h"



sbit R1 = P3^0; 
sbit R2 = P3^1; 
sbit R3 = P3^2; 
sbit R4 = P3^3; 

sbit C4 = P3^4;
sbit C3 = P3^5;
sbit C2 = P3^6;
sbit C1 = P3^7;


unsigned char code SEG[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
	
void Select_HC573(unsigned char channel)
{
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
	}
}
void dispaly(unsigned char val)
{
	Select_HC573(6);
	P0 = 0x01;
	Select_HC573(7);
	P0 = val;	
}
unsigned char KeysVal;
void ScanKeysMulti()
{
	R1 = 0;
	R2 = R3 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
	if(C1 == 0)
	{
		while(C1 == 0);
		KeysVal = 0;
		dispaly(SEG[KeysVal]);
	}
	else if(C2 == 0)
	{
		while(C2 == 0);
		KeysVal = 1;
		dispaly(SEG[KeysVal]);
	}
	else if(C3 == 0)
	{
		while(C3 == 0);
		KeysVal = 2;
		dispaly(SEG[KeysVal]);
	}

	else if(C4 == 0)
	{
		while(C4 == 0);
		KeysVal = 3;
		dispaly(SEG[KeysVal]);
	}
	//2
	R2 = 0;
	R1 = R3 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
	if(C1 == 0)
	{
		while(C1 == 0);
		KeysVal = 4;
		dispaly(SEG[KeysVal]);
	}
	else if(C2 == 0)
	{
		while(C2 == 0);
		KeysVal = 5;
		dispaly(SEG[KeysVal]);
	}
	else if(C3 == 0)
	{
		while(C3 == 0);
		KeysVal = 6;
		dispaly(SEG[KeysVal]);
	}

	else if(C4 == 0)
	{
		while(C4 == 0);
		KeysVal = 7;
		dispaly(SEG[KeysVal]);
	}
	//3
	R3 = 0;
	R2 = R1 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
	if(C1 == 0)
	{
		while(C1 == 0);
		KeysVal = 8;
		dispaly(SEG[KeysVal]);
	}
	else if(C2 == 0)
	{
		while(C2 == 0);
		KeysVal = 9;
		dispaly(SEG[KeysVal]);
	}
	else if(C3 == 0)
	{
		while(C3 == 0);
		KeysVal = 10;
		dispaly(SEG[KeysVal]);
	}

	else if(C4 == 0)
	{
		while(C4 == 0);
		KeysVal = 11;
		dispaly(SEG[KeysVal]);
	}
	//4
	R4 = 0;
	R2 = R3 = R1 = 1;
	C1 = C2 = C3 = C4 = 1;
	if(C1 == 0)
	{
		while(C1 == 0);
		KeysVal = 12;
		dispaly(SEG[KeysVal]);
	}
	else if(C2 == 0)
	{
		while(C2 == 0);
		KeysVal = 13;
		dispaly(SEG[KeysVal]);
	}
	else if(C3 == 0)
	{
		while(C3 == 0);
		KeysVal = 14;
		dispaly(SEG[KeysVal]);
	}

	else if(C4 == 0)
	{
		while(C4 == 0);
		KeysVal = 15;
		dispaly(SEG[KeysVal]);
	}


}

	
void main()
{
	while(1)
	{
		ScanKeysMulti();
	}
}
	

学习来源于:https://www.bilibili.com/video/BV1Bt41187hw?p=3

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Born_toward

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

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

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

打赏作者

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

抵扣说明:

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

余额充值