首页 > 其他分享 >矩阵键盘的基本操作

矩阵键盘的基本操作

时间:2023-10-05 11:34:29浏览次数:42  
标签:R5 R6 DisplayKeyNum 矩阵 键盘 while num Keynum 基本操作

矩阵键盘的基本操作

1、矩阵键盘的扫描思想
与独立按键不同的是,按键的两个引脚都分别连接的单片机的I/O端口,一个作为行信号,另外一个作为列信号。我们以4X4的矩阵键盘为例,试着探讨其工作方式和扫描思路。

162041kqz3pk95ykxfa1nh.png.thumb

在上面的矩阵键盘中,要识别出黄色按键的按下状态,应该怎么做呢?
对于矩阵键盘,我们只能逐行扫描,然后读取列的状态信号。如果R3行输出低电平,那么黄色按键如果有按下动作的话,那读取C2列信号也应该为低电平,而该行上其他没有按下动作的按键的列信号则为高电平。因此,我们可以得到矩阵键盘的基本扫描步骤:
<1> R1输出点电平,R2、R3、R4输出高电平,逐个读取判断列信号,如果都为高电平则R1行上没有按键按下。
<2> R2输出点电平,R1、R3、R4输出高电平,逐个读取判断列信号。
<3> R3输出点电平,R1、R2、R4输出高电平,发现C2列信号为低电平,那么可以判断得R3行的C2列的按键有按下动作。
<4> R4输出点电平,R1、R3、R4输出高电平,逐个读取判断列信号。
如此循环往复,扫描的按键的状态。
我们知道有按键按下动作,那么又怎么知道是哪一个按键按下呢?这时,我们最好定义一个键值全局变量,给矩阵行列上的每一个的按键编一个唯一的号码。当扫描的某一行某一列的按键动作后,把对应的编号复制给键值变量,这样我们判断这个键值,就知道是那个按键有触发动作了。

20231004170145

由上可知:

对于该单片机与51单片机相比的差别在于电路变化,其P37=>P44 ,P36=>P42,且都按下后为低电平

代码如下:

#include <REGX52.H>
// 由于51单片机没有对于P4口的定义
sfr P4 = 0XC0;
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;


sbit R5 = P3^4;
sbit R6 = P3^5;
sbit R7 = P4^2;
sbit R8 = P4^4;
// 此数码管为共阳数码管
unsigned char code num[] = {
	0xc0,  //0  // 1100 0000
	0xf9,  //1      // 1111 1001
	0xa4,  //2      // 1010 0100
	0xb0,  // 3     // 1011 0000
	                // dp g f e   d c b a  
	0x99,      // 4         1001      1001
	0x92,       // 5       1 0 0 1   0 0 10
	0x82,           // 6   1  000    0010
	0xf8, 	// 7       1111   1000
	0x80,       // 8        1000  0000
	0x90,            // 9     1001 0000
	0x88,             // A       1000   1000
	0x83,                 // b    1000  0011
	0xc6,        	// C     1100 0110
	0xa1,              // d    1010   0001
	0x86,                   //E    1000  0110
	0x8e                     // F   1000  1110
};
// 单片机使能
void SelectHC573(unsigned char chinnel) {
	switch(chinnel) {  // LED使能
		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 SystemInit(void) {
	SelectHC573(4);
	P0 = 0xFF;  // LED回到初始状态,全关
	SelectHC573(5);
	P0 = 0x00;  // 关闭蜂鸣器和继电器
}

void DisplayKeyNum(unsigned char value) {
	SelectHC573(6);
	P0 = 0x01;   // 选择数码管第一位使能
	SelectHC573(7);
	P0 = value;  // 段选传值
}
unsigned char Keynum;
void ScanKeyMulti(void) {
    // 此采用逐行扫描模式
    // 首先将该行所在的列全部置为高电平,如果有该行所在的列被按下时,就为低电平
	R1 = 0;  // P30 = 0  
	R2=R3=R4=R5=R6=R7=R8=1;
	if(R8==0){while(R8==0);Keynum=0;DisplayKeyNum(num[Keynum]);}  // S7
	if(R7==0){while(R7==0);Keynum=1;DisplayKeyNum(num[Keynum]);} // S11
	if(R6==0){while(R6==0);Keynum=2;DisplayKeyNum(num[Keynum]);} // S15
	if(R5==0){while(R5==0);Keynum=3;DisplayKeyNum(num[Keynum]);} // S19
	
	R2 = 0; // P31 = 0
	R1=R3=R4=R5=R6=R7=R8=1;
	if(R8==0){while(R8==0);Keynum=4;DisplayKeyNum(num[Keynum]);} // S6
	if(R7==0){while(R7==0);Keynum=5;DisplayKeyNum(num[Keynum]);} // S10
	if(R6==0){while(R6==0);Keynum=6;DisplayKeyNum(num[Keynum]);} // S14
	if(R5==0){while(R5==0);Keynum=7;DisplayKeyNum(num[Keynum]);} // S18
	
	R3 = 0;  // P32=0
	R1=R2=R4=R5=R6=R7=R8=1;
	if(R8==0){while(R8==0);Keynum=8;DisplayKeyNum(num[Keynum]);} // S5
	if(R7==0){while(R7==0);Keynum=9;DisplayKeyNum(num[Keynum]);} // S9
	if(R6==0){while(R6==0);Keynum=10;DisplayKeyNum(num[Keynum]);} // S13
	if(R5==0){while(R5==0);Keynum=11;DisplayKeyNum(num[Keynum]);} //S17
	
	R4 = 0; // P33 = 0
	R1=R3=R2=R5=R6=R7=R8=1;
	if(R8==0){while(R8==0);Keynum=12;DisplayKeyNum(num[Keynum]);} // S4
	if(R7==0){while(R7==0);Keynum=13;DisplayKeyNum(num[Keynum]);} // S8
	if(R6==0){while(R6==0);Keynum=14;DisplayKeyNum(num[Keynum]);} // S12
	if(R5==0){while(R5==0);Keynum=15;DisplayKeyNum(num[Keynum]);} // S16
}
void main() {
	SystemInit();
	while(1) {
		ScanKeyMulti();
	}

}

标签:R5,R6,DisplayKeyNum,矩阵,键盘,while,num,Keynum,基本操作
From: https://www.cnblogs.com/bky111/p/17743180.html

相关文章

  • 矩阵的乘法运算与css的3d变换(transform)
    theme:qklhk-chocolate引言:你有没好奇过,在一个使用了transform变换的元素上使用window.getComputedStyle(htmlElement)['transform']查询出来的值代表什么?为什么硬件加速要使用transform,以及为什么硬件加速会快?小科普:关于矩阵的乘法 以两个二阶齐次矩阵相乘为例 [......
  • Docker 基本操作
    Docker1安装(CentOS)卸载老旧版本sudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\......
  • 矩阵成真!Pytorch最新工具mm,3D可视化矩阵乘法、Transformer注意力
    前言 Pytorch团队推出的最新3D可视化最新工具mm,能够将矩阵乘法模拟世界还原。本文转载自新智元仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理【C......
  • 05-独立按键的基本操作与扩展应用
    05-独立按键的基本操作与扩展应用在写代码前需做如下,否则独立按键无响应:由电路图可知:独立按键默认为高电平,当按键按下时为低电平即S7(P30)、S6(P31)、S5(P32)、S4(P33)当按下按键时,P3口对应低电平,松开后对应高电平,判断是否一直按下此时需要使用while(1)死循环,由于是按下点......
  • win卸载输入法之后,在系统设置的键盘中还有这个输入法
    解决方法:删除对应的注册表进入计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\CTF\TIP里面有很多的{}包括的选择查看里面的有LanguageProfile的项,点击里面的第二层,若是里面有这个输入法的,将这个LanguageProfile删除即可。......
  • 图像的基本操作
    ......
  • linux系统中rootfs根文件系统制作及挂载基本操作
    今天给大家介绍一下rootfs根文件系统制作和挂载方式,希望这篇文章对大家有所帮助。本章主要是对rootfs根文件系统制作和挂载方式进行详细讲解。Linux“三巨头”已经完成了2个了,就剩最后一个rootfs(根文件系统)了,本章我们就来学习一下根文件系统的组成以及如何构建根文件系统。这是......
  • 点云配准算法-旋转矩阵估计-Kabsch-Umeyama algorithm
    Kabsch-Umeyamaalgorithm参考文献:https://www.wikiwand.com/en/Kabsch_algorithm面向点云配准,最小化两点集均方根误差(RMSD,rootmeansquareddeviation)来计算最佳旋转矩阵。注:该算法只能计算旋转矩阵,做点云配准还需要计算平移向量。当平移和旋转都正确计算出,该算法有......
  • pthread实现多线程矩阵乘法
    #include<pthread.h>#include<stdio.h>#include<windows.h>#include<iostream>usingnamespacestd;#pragmacomment(lib,"pthreadVC2.lib")#definerowCount1300#definemediumCount1500#definecolumnCount5000#definen_threa......
  • python numpy 稀疏矩阵与密集矩阵
    在NumPy中,稀疏矩阵和密集矩阵是两种不同的数据表示方式,用于存储矩阵数据。它们之间的主要区别在于存储元素的方式和内存占用。稀疏矩阵(SparseMatrix):区别:存储方式:稀疏矩阵只存储非零元素的位置和数值,而忽略零元素,从而节省内存。内存占用:由于只存储非零元素,稀疏矩阵在处理大规模......