【蓝桥杯—单片机】矩阵键盘的基本操作| 备赛 | 笔记

前言

学习资料参考

课程资料
【【小蜜蜂笔记】蓝桥杯大赛-单片机设计与开发基础技能与进阶强化教程】https://www.bilibili.com/video/BV1Bt41187hw?p=7&vd_source=e2191f89c557f5ac44bb6c7aa3967c7c

数码管的基本控制可以参考以下笔记
https://blog.csdn.net/zicheng_G/article/details/142304378?fromshare=blogdetail&sharetype=blogdetail&sharerId=142304378&sharerefer=PC&sharesource=zicheng_G&sharefrom=from_link

本节训练重点

  1. 矩阵键盘扫描
  2. 矩阵键盘的识别和基本处理:在扫描过程中,发现与按键触发信号后(不做去抖),待按键松开后,数码管的第一位显示相应的数字:从左至右,从上到下,一次显示0~F。

矩阵键盘

原理图

在这里插入图片描述
对矩阵键盘进行控制,要先将J5的跳帽接到1~2引脚。

编程思路

/*头文件声明区域*/
#include <REGX52.H>

/*变量声明区域*/
sfr P4 = 0xc0;//用于P4口的调用

sbit HC138_A0_A = P2^5;
sbit HC138_A1_B = P2^6;
sbit HC138_A2_C = P2^7;

sbit L1 = P4^4;//用与矩阵键盘列的调用
sbit L2 = P4^2;
sbit L3 = P3^5;
sbit L4 = P3^4;

sbit C1 = P3^0;//用与矩阵键盘行的调用
sbit C2 = P3^1;
sbit C3 = P3^2;
sbit C4 = P3^3;

unsigned char code lib_Bit_Number[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

/*138译码器Y口选中情况*/
void HC138_NumberY(unsigned char x)
{
	switch(x)
		{
			case 6:
				{
					HC138_A0_A=0;
					HC138_A1_B=1;
					HC138_A2_C=1;
					break;
				}
			case 7:
				{
					HC138_A0_A=1;
					HC138_A1_B=1;
					HC138_A2_C=1;
					break;
				}
		}
}
        
/*单个数码管的静态显示*/
void SMG(unsigned char Bit)
{ 
        HC138_NumberY(6);     //数码管位选
        P0=0x01;
 
        HC138_NumberY(7);      //数码管段选
        P0=lib_Bit_Number[Bit];
}

/*按键检测*/
void MatK_Scan()
{
	/*扫描第一列*/
	L1=0;
	L2=L3=L4=1;
	if(C1==0)//判断S7是否按下
	{
		while(C1==0);
		SMG(0);//数码管显示0
	}
	if(C2==0)//判断S6是否按下
	{
		while(C2==0);
		SMG(4);//数码管显示4
	}
	if(C3==0)//判断S5是否按下
	{
		while(C3==0);
		SMG(8);//数码管显示8
	}
	if(C4==0)//判断S4是否按下
	{
		while(C4==0);
		SMG(12);//数码管显示c
	}
	
	/*扫描第二列*/
	L2=0;
	L1=L3=L4=1;
	if(C1==0)//判断S11是否按下
	{
		while(C1==0);
		SMG(1);//数码管显示1
	}
	if(C2==0)//判断S10是否按下
	{
		while(C2==0);
		SMG(5);//数码管显示5
	}
	if(C3==0)//判断S9是否按下
	{
		while(C3==0);
		SMG(9);//数码管显示9
	}
	if(C4==0)//判断S8是否按下
	{
		while(C4==0);
		SMG(13);//数码管显示d
	}
	
	/*扫描第三列*/
	L3=0;
	L1=L2=L4=1;
	if(C1==0)//判断S15是否按下
	{
		while(C1==0);
		SMG(2);//数码管显示2
	}
	if(C2==0)//判断S14是否按下
	{
		while(C2==0);
		SMG(6);//数码管显示6
	}
	if(C3==0)//判断S13是否按下
	{
		while(C3==0);
		SMG(10);//数码管显示a
	}
	if(C4==0)//判断S12是否按下
	{
		while(C4==0);
		SMG(14);//数码管显示e
	}
	
	/*扫描第四列*/
	L4=0;
	L1=L2=L3=1;
	if(C1==0)//判断S19是否按下
	{
		while(C1==0);
		SMG(3);//数码管显示3
	}
	if(C2==0)//判断S18是否按下
	{
		while(C2==0);
		SMG(7);//数码管显示7
	}
	if(C3==0)//判断S17是否按下
	{
		while(C3==0);
		SMG(11);//数码管显示b
	}
	if(C4==0)//判断S16是否按下
	{
		while(C4==0);
		SMG(15);//数码管显示f
	}
}

/*主函数*/
void main()
{
	while(1)
		{
			MatK_Scan();
		}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值