首页 > 其他分享 >独立按键与矩阵键盘

独立按键与矩阵键盘

时间:2024-03-12 18:33:13浏览次数:26  
标签:Delay P1 消抖 矩阵 键盘 while keynumber 按键

独立按键

轻触按键:相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。

 独立按键在开发板内部的原理图如下:

4个独立按键的右端都公共接地,左端引出四个编号,接单片机的I/O口上。当单片机上电时,所有I/O口默认都是高电平,当按键没有按下时,I/O口保持高电平;当按键按下后,I/O口变为低电平。

寄存器会检测I/O口的电平,再读回寄存器中。比如按下K1后,寄存器检测到P3_1为低电平,寄存器内的值为0,即P3_1==0。


按键抖动

按键开关一般是由弹性金属制成,当机械触点被按下时,会经历波动过程,然后再稳定;弹起时也会产生类似情况。通常我们称此现象为按键抖动,也被称为接触弹跳

而单片机运行速度很快,按键抖动会被检测出来,从而对按键的判断产生一些误操作(比如按一下会产生按多下的效果),因此必须要消除抖动才能正常使用按键。

一开始为高电平,按下按键后,经过5~10ms的抖动才稳定为低电平;松开按键后,同样经过5~10ms的抖动才稳定为高电平。

按键消抖分为两种:软件消抖硬件消抖

硬件消抖:通过滤波电路或者其他电路实现,此处不做讨论。

软件消抖:简单的消抖方法为延时消抖,即检测到状态变化后,延时大约10ms,再次确认状态,如果相同才识别为有效。通常通过延时代码来实现,如下所示:

void Delay1ms(int xms)		//@12.000MHz,实际根据晶振选频率
{
	unsigned char i, j;
	while(xms){
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

上述代码可自己设定参数来决定延时的时间。


矩阵按键

当键盘中按键比较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,所以称为矩阵按键。采用逐行或逐列的“扫描”,就能实现读出任何位置按键的状态。

矩阵键盘识别比独立按键略微复杂,但是相比独立按键可节省大量IO口,实际开发中应用较多。以下是矩阵按键原理图:

可以看出按键以矩阵方式连接,P1.0~P1.3 为列线,P1.4~P1.7为行线。

 具体如何通过代码来检测哪个按键被按下了呢?如下代码所示:

此代码为按下第几个按键就在LCD显示屏上显示几的代码,此处采用逐列扫描:循环设置单个列线为0,检测每列对应行线,确定按键位置。

unsigned char MatrixKey()
{
	unsigned char keynumber=0;
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay();while(P1_7==0);Delay();keynumber=1;}
//假设按下此行代码对应按键,则P1_7会由高电平变为低电平。
	if(P1_6==0){Delay();while(P1_6==0);Delay();keynumber=5;}
	if(P1_5==0){Delay();while(P1_5==0);Delay();keynumber=9;}
	if(P1_4==0){Delay();while(P1_4==0);Delay();keynumber=13;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay();while(P1_7==0);Delay();keynumber=2;}
	if(P1_6==0){Delay();while(P1_6==0);Delay();keynumber=6;}
	if(P1_5==0){Delay();while(P1_5==0);Delay();keynumber=10;}
	if(P1_4==0){Delay();while(P1_4==0);Delay();keynumber=14;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay();while(P1_7==0);Delay();keynumber=3;}
	if(P1_6==0){Delay();while(P1_6==0);Delay();keynumber=7;}
	if(P1_5==0){Delay();while(P1_5==0);Delay();keynumber=11;}
	if(P1_4==0){Delay();while(P1_4==0);Delay();keynumber=15;}
	
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay();while(P1_7==0);Delay();keynumber=4;}
	if(P1_6==0){Delay();while(P1_6==0);Delay();keynumber=8;}
	if(P1_5==0){Delay();while(P1_5==0);Delay();keynumber=12;}
	if(P1_4==0){Delay();while(P1_4==0);Delay();keynumber=16;}
	
	return keynumber;
}

标签:Delay,P1,消抖,矩阵,键盘,while,keynumber,按键
From: https://blog.csdn.net/qq_74114817/article/details/136606512

相关文章

  • R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化
    全文链接:https://tecdat.cn/?p=33760原文出处:拓端数据部落公众号概述:众所周知,心脏疾病是目前全球最主要的死因。开发一个能够预测患者心脏疾病存在的计算系统将显著降低死亡率并大幅降低医疗保健成本。机器学习在全球许多领域中被广泛应用,尤其在医疗行业中越来越受欢迎。机器......
  • 矩阵乘法与快速幂
    矩阵乘法定义:给定矩阵\(A\)规模为\(n\timesm\),矩阵\(B\)规模为\(m\timesp\),定义\(A\timesB=C\),矩阵\(C\)规模为\(n\timesp\),满足:\[c_{ij}=\sum_{k=1}^ma_{ik}b_{kj}\]记住一个口诀:左行右列。注意:对于矩阵乘法,满足乘法结合律和乘法分配律,不满足乘法交......
  • abc336F 旋转矩阵谜题
    有一个大小为W*H的矩阵,每个格子里分别有1~W*H的某个数字,对应1~W*H的一个排列。每次可以选择大小为(W-1)*(H-1)的子矩阵旋转180度。给定初始状态,问20步以内是否可以将它还原?如果可以,输出最小步数,否则输出-1。3<=H,W<=8;1<=a[i][j]<=H*W;a[i][j]各不相等bfs搜索,由于每一步都......
  • [牛客]小红走矩阵
    题目思路直接套bfs模板代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e3+5,INF=0x3f3f3f3f;structNode{ intx,y,s;}t,t1;chargraph[N][N];boolvis[N][N];queue<Node>q;intdx[4]={0,0,1,1};intdy[4]={-1,1,0......
  • SSK:超级键盘模拟器,调用底层,可模拟所有按键
    SSK-吵架键盘模拟器SuperSimulatorofKeyboard调用系统底层,能够模拟所有键盘操作!本程序结合快Key(QuicKeys智能登录助手)一起使用,能够创造更多奇迹!【下载】点击下载 SSK:超级键盘模拟器:https://files.cnblogs.com/files/BigSystemsView/SSK-%E8%B6%85%E7%BA%A7%E9%94%A......
  • abc332D 将矩阵A变成B的最小步数
    题面:给定两个H行W列的矩阵A和B,每次操作可以交换相邻的行或列,问是否可以将A变成B?如果可以,输出最少操作步数;如果不行,输出-1。范围:2<=H,W<=5,1<=A[i][j],B[i][j]<=1e9思路:数据规模小,直接bfs搜索,如果范围再大点可以用双向bfs优化效率。需要用到哈希来快速判重。#include<bits/std......
  • C++中OpenCV、Armadillo矩阵数据格式的转换方式
      本文介绍在C++语言中,矩阵库Armadillo的mat、vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法。  在C++语言的矩阵库Armadillo与计算机视觉库OpenCV中,都有矩阵格式的数据类型;而这两个库在运行能力方面各有千秋,因此实际应用过程中,难免会遇到需要将二者的矩阵格......
  • 代码随想录算法训练营第二天| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋
    977.有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/description/publicstaticint[]sortedSquares(int[]nums){intleft=0;intright=nums.length-1;int[]result=newint[nums.length];intwrite=......
  • 矩阵乘法
    GEMM(GeneralMatrixMultiplication)-通用矩阵乘BLAS(BasicLinearAlgebraSubprograms)-基本线性代数子程序SGEMM(SingleprecisionGeneralMatrixMultiply)-单精度矩阵乘法DGEMM(DoubleprecisionGeneralMatrixMultiply)-双精度矩阵乘法CGEMM(Complexsingl......
  • matlab教程_台大lecture1基本操作和矩阵输入
    matlab教程视频matlabascalculatorcommendline直接用命令行计算部分ans是结果运算法则和平时一样((),^乘除加减)onlinehelpeg:helpsin&直接搜索嵌套式公式sin(cos(pi))==cos(pi)sin(ans)其中,ans是第一个的结果变量可以用who查看变量,whos详细信息一些保留......