-
同时按住多个按键的识别;矩阵键盘扫描原理详解——单片机191216
2019-12-16 17:38:13矩阵键盘扫描原理详解 根据原理图 键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。 一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现...矩阵键盘扫描原理详解
根据原理图
键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。
现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?
当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。
首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;
其次,单片机将P11输出低电平,其它P10、P12、P13仍为高电平,此时再来读取列线数据,发现列线读到的数据有低电平,数值为1011(0x0B),如果我们的键盘布局已经确定,那么0x0B就代表S5的值了。转到S5键功能处理子程序就可以达到目的。
/*****************************************************************************/
PS:同时按住S5,S6也是可以识别的。
首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;
其次,单片机将P11输出低电平,其它P10、P12、P13仍为高电平,此时再来读取列线数据,发现列线读到的数据有低电平,数值为1001(0x09),如果我们的键盘布局已经确定,那么0x09就代表S5,S6的值了。
/**************************************************************************/
/*
功能:矩阵键盘扫面,按键显示键值程序
作者:siriuszxn
*/
#include "reg51.h"
#define KEYPORT = P1unsigned char i;
unsigned char Keynum;
unsigned char Line; //行
unsigned char Mask;
unsigned char Col; //列
unsigned char ScanCode;unsigned char code psegs_table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F
void delay_ms(unsigned int t) //ms延时程序
{
unsigned char i;
unsigned int x;
x=t;
while(x--)
{
for(i=0;i<113;i++);
}
}
/* 键盘扫描程序 */
void keyscan()
{
while (1) //循环扫描键盘
{
P1 = 0xff; //开始
Line = 1;
Mask = 0x01;for(i = 0; i < 4; i++)
{
P1 = ~Mask;ScanCode = P1 & 0xf0;
if (ScanCode != 0xf0)
{
delay_ms(5);
}ScanCode = P1 & 0xf0;
switch(ScanCode)
{
case 0xe0:Col=1;break;
case 0xd0:Col=2;break;
case 0xb0:Col=3;break;
case 0x70:Col=4;break;
default :Col=0;break;
}if (Col > 0)
{
//根据行列计算键值
Keynum = (Line - 1) * 4 + Col;
//通过P0口接数码管显示
P0 = psegs_table[Keynum-1];while(1)
{
ScanCode = P1 & 0xf0;
if(ScanCode == 0xf0)
{
break;
}
}
Mask <<= 1;
Line++;
}
}
}
}void main()
{
while(1)
{
keyscan();
}
}
————————————————
版权声明:本文为CSDN博主「zxnsirius」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zxnsirius/article/details/51088946 -
4x4矩阵键盘工作原理及扫描程序_单片机学习:单片机独立按键和矩阵键盘概念及原理...
2020-12-28 17:09:261.按键分类与输入原理按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最...1.按键分类与输入原理
按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。
在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入时与软件结构密切相关的过程。
对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将按键输入,并检查是哪一个按键按下,将该键号送人累加器,然后通过跳转指令转入执行该键的功能程序,执行完成后再返回主程序。
2.按键结构与特点
微机键盘通常使用机械触点式按键开关,其主要功能式把机械上的通断转换为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便于通用数字系统的逻辑电平相容。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定的时间触点机械抖动,然后其触点才稳定下来。其抖动过程如下图1所示,抖动时间的长短与开关的机械特性有关,一般为5-10ms。在触点抖动期间检测按键的通与断,可能导致判断出错,即按键一次按下或释放错误的被认为是多次操作,这种情况是不允许出现的。为了克服你、按键触点机械抖动所致的检测误判,必须采取消抖措施。按键较少时,可采用硬件消抖;按键较多式,采用软件消抖。
图1 按键触点机械抖动
(1)按键编码
一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构的不同,采用不同的编码。无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的键值,以实现按键功能程序的跳转。
(2)键盘程序
一个完整的键盘控制程序应具备以下功能:
a.检测有无按键按下,并采取硬件或软件措施消抖。
b.有可靠的逻辑处理办法。每次只处理一个按键,期间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。
c.准确输出按键值(或键号),以满足跳转指令要求。
3.独立按键与矩阵键盘
(1)独立按键
单片机控制系统中,如果只需要几个功能键,此时,可采用独立式按键结构。
独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立按键的典型应用如图所示。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。独立按键如图2所示。
图2 独立键盘
独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
(2)矩阵键盘
单片机系统中,若使用按键较多时如电子密码锁、电话机键盘等一般都至少有12到16个按键,通常采用矩阵键盘。
矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
矩阵键盘的工作原理
最常见的键盘布局如图3所示。一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,4*4矩阵键盘的内部电路如图4所示。
图3 矩阵键盘布局图
图4 矩阵键盘内部电路图
当无按键闭合时,P3.0~P3.3与P3.4~P3.7之间开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。判断有无按键按下的方法是:第一步,置列线P3.4~P3.7为输入状态,从行线P3.0~P3.3输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P3.4~P3.7读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。
识别按键的方法很多其中,最常见的方法是扫描法
按键按下时,与此键相连的行线与列线导通,行线在无按键按下时处在高电平。如果所有的列线都处在高电平,则按键按下与否不会引起行线电平的变化,因此必须使所有列线处在电平。这样,当有按键按下时,改键所在的行电平才回由高变低。才能判断相应的行有键按下。
独立按键数量少,可根据实际需要灵活编码。矩阵键盘,按键的位置由行号和列号唯一确定,因此可以分别对行号和列号进行二进制编码,然后两值合成一个字节,高4位是行号,低4位是列号。
4.键盘的工作方式
对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中的CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常键盘的工作方式有三种,编程扫描、定时扫描和中断扫描。
(1)编程扫描方式
编程扫描方式是利用CPU完成其它工作的空余时间,调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键盘为止。
(2)定时扫描方式
定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间(例如10ms)的定时,当定时时间到就产生定时器溢出中断。CPU响应中断后对键盘进行扫描,并在有按键按下时识别出该键,再执行该键的功能程序。
(3)中断扫描方式
上述两种键盘扫描方式,无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。
为提高CPU工作效率,可采用中断扫描工作方式。其工作过程如下:当无按键按下时,CPU处理自己的工作,当有按键按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。
-
4x4矩阵键盘工作原理及扫描程序_51单片机独立按键和矩阵按键实现
2020-12-30 18:38:04独立按键实验 按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开。我们开发板上使用的按键及内部简易图如下图所示 管脚与管脚之间(注意是距离)距离长的是导通状态,短的是接通状态。...独立按键实验
按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,
开关断开。我们开发板上使用的按键及内部简易图如下图所示
管脚与管脚之间(注意是距离)距离长的是导通状态,短的是接通状态。
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号
如下图所示:
如图所示,按键闭合式不会立刻稳定的接通,断开时也不会一下子断开,会伴随一些抖动。抖动的时间长短有按键特性决定,一般为5Ms到10ms.按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。
消抖
消抖可分为硬件消抖和软件消抖。为了使电路更加简单,通常采用软件消抖。
一般来说一个简单的按键消抖就是先读取按键的状态, 如果得到按键按下之后, 延时 10ms, 再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。 其中延时 10ms 就是软件消抖处理。
消抖过程(软件)
1,先设置 IO 口为高电平(由于开发板 IO 都有上拉电阻,所以默认 IO 为高电平)。
2,读取 IO 口电平确认是否有按键按下。
3,如有 IO 电平为低电平后,延时几个毫秒。
4,再读取该 IO 电平,如果任然为低电平,说明对应按键按下。
5,执行相应按键的程序。
键盘
键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的键盘称为非编码键盘,在单片机组成的各种系统中,用的较多的是非编码键盘。非编码键盘又分为独立键盘和行列式键盘(常说的矩阵键盘)。独立按键用的就是独立键盘。
实现原理
原理图:
独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其他引脚分别接到单片机 IO 口。
单片机的 IO 口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地,另一端与单片机的某个 I/O 口相连,开始时先给该 IO 口赋一高电平,然后让单片机不断地检测该 I/O 口是否变为低电平,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电平,程序一旦检测到 I/O 口变为低电平则说明按键被按下,然后执行相应的指令。
由图可以看出,单片机的管脚(p1,p3,等管脚)都接有上拉电阻,上拉电阻接高电平。因此我们在消抖检测时,若按键以已经按下,则管脚接地,变为低电平,若管脚为低电平,则说明按键已经按下,执行LED灯点亮的步骤。
代码实现
#include <reg52.h> #include <intrins.h> typedef unsigned char u8; //重定义全局字符型变量 typedef unsigned int u16; //重定义全局整型变量 sbit LED=P2^0 ; //LED接P2口 sbit K1=P3^1; //按键k1接p3口,也可以是其他管脚 /*延时函数*/ void dealy(u16 i) { while(i--); } /*独立按键执行函数 */ void KeyProcess() { if(K1==0){ dealy(1000); //一个int型的所占的时间大约为10微妙,所以乘1000大约为10ms. if(K1==0){ //消抖后仍为低电平,则执行点亮进程 LED=~LED; //为了让LED产生明暗变化 } while(!K1); //判断按键是否松开,假如松开,则K1为真,加!为假,则循环结束跳出循环 } } void main() { LED=0; //初始时灯位熄灭状态(LED原理), while(1) { KeyProcess(); } }
矩阵按键实验
- 前面我们讲到独立按键,接下来我们引入独立按键。为什么引入矩阵按键?
独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O 口资源。单片机系统中 I/O 口资源往往比较宝贵,多个按键时为了减少 I/O 口引脚。 - 4 * 4键盘的工作原理
矩阵按键原理图
开发板上将 16 个按
键排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每
个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,我们将
这 8 根线连接到单片机的 8 个 I/O 口上,通过程序扫描键盘就可检测 16 个
键。- 矩阵按键的消抖
1.检查按键是否按下
由原理图可知,独立按键和矩阵按键是有所不同的。独立按键的各个按键一端接引脚,一端并联在一起接地。所以检测按键是否按下只需要看单片机的管脚是否为低电平即可。而矩阵按键,他们的两端分别并联在一起,
每一行(共4行)并联在一起接高位管脚上(7~4),每一列(共4列)并联在一起接到低位管脚上(3~0)。
所以检测方法有所不同。
一般情况下有两种方法。
方法一:
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。逐行扫描的时间是非常快的,肉眼难以观察。
举个例子,假设此时p7管脚为低电平,那么第一行按键的一段都为低电平,另一端分别连接低4位的管脚,只有当某一个开关按下,低4位的管脚与其中一个低电平的管脚连接变为低电平,所以只要查看低4位那个管脚为低电平就可以确定那个按键以按下。其他三行同理,每一行依次不断进行。
方法二:
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。相当于第一次确定列,第二次确定行,行列交叉形成点,这个点就是我们要找的已经闭合的按键。- 静态数码管显示按键
如图,每一个按键可用一个键值来代替,让对应的键值号来作为静态数码管的段选,从而实现按下按键显示数字的效果。- 代码实现
采用第二种行列扫描的检测方法
#include <reg52.h> //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define GPIO_DIG P0 //宏定义p0口(静态显示数码管对应的管脚) #define GPIO_KEY P1 //矩阵按键对应管脚 u8 KeyValue; //用来存放读取到的键值 u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值 /*延时·函数*/ void delay(u16 i) { while(i--); } /*检测按键是否按下,消抖,读取键值*/ void KeyDown(void) { char a=0; GPIO_KEY=0x0f; //0x0f转化为为二进制为0000 1111,即矩阵按键的八个管脚,高位为低电平(0),低位为高电平(1) if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay(1000);//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 { /*对列进行测试(高位低电平,低位高电平)*/ GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; //对应管脚高低电平0000 0111,第0列 case(0X0b): KeyValue=1;break; //对应管脚高低电平0000 1011,第1列 case(0X0d): KeyValue=2;break; //对应管脚高低电平0000 1101,第2列 case(0X0e): KeyValue=3;break;//对应管脚高低电平0000 1110,第3列 } /*对行进行测试(低位高电平,高位低电平)*/ GPIO_KEY=0XF0; switch(GPIO_KEY) { /*上一行对应的列号加上相应有规律的字号就等于按键号,可由原理图查看*/ case(0X70): KeyValue=KeyValue;break; //对应管脚高低电平0111 0000,第0行 case(0Xb0): KeyValue=KeyValue+4;break; //对应管脚高低电平1011 0000,第1行 case(0Xd0): KeyValue=KeyValue+8;break;//对应管脚高低电平1101 0000,第2行 case(0Xe0): KeyValue=KeyValue+12;break; //对应管脚高低电平1110 0000,第0行 } } } while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测(只有当按键松开时矩阵连接的管脚高位和低位才会互换继续检测行。否则进行循环延迟) { delay(100); a++; } } /*主函数*/ void main() { while(1) { KeyDown(); //按键判断函数 GPIO_DIG=~smgduan[KeyValue]; // } }
-
8.5 单片机独立按键的扫描
2019-02-18 17:17:17原理搞清楚了,那么下面我们就先编写一个独立按键的程序,把最基本的功能验证一下。 #include <reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED =...原理搞清楚了,那么下面我们就先编写一个独立按键的程序,把最基本的功能验证一下。
#include <reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit LED9 = P0^7; sbit LED8 = P0^6; sbit LED7 = P0^5; sbit LED6 = P0^4; sbit KEY1 = P2^4; sbit KEY2 = P2^5; sbit KEY3 = P2^6; sbit KEY4 = P2^7; void main(){ ENLED = 0; //选择独立 LED 进行显示 ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P2 = 0xF7; //P2.3 置 0,即 KeyOut1 输出低电平 while (1){ //将按键扫描引脚的值传递到 LED 上 LED9 = KEY1; //按下时为 0,对应的 LED 点亮 LED8 = KEY2; LED7 = KEY3; LED6 = KEY4; } }
本程序固定在 KeyOut1 上输出低电平,而 KeyOut2~4 保持高电平,就相当于是把矩阵按键的第一行,即 K1~K4 作为 4 个独立按键来处理,然后把这 4 个按键的状态直接送给LED9~6 这 4 个 LED 小灯,那么当按键按下时,对应按键的输入引脚是 0,对应小灯控制信号也是 0,于是灯就亮了,这说明上述关于按键检测的理论都是可实现的。
绝大多数情况下,按键是不会一直按住的,所以我们通常检测按键的动作并不是检测一个固定的电平值,而是检测电平值的变化,即按键在按下和弹起这两种状态之间的变化,只要发生了这种变化就说明现在按键产生动作了。
程序上,我们可以把每次扫描到的按键状态都保存起来,当一次按键状态扫描进来的时候,与前一次的状态做比较,如果发现这两次按键状态不一致,就说明按键产生动作了。当上一次的状态是未按下而现在是按下,此时按键的动作就是“按下”;当上一次的状态是按下而现在是未按下,此时按键的动作就是“弹起”。显然,每次按键动作都会包含一次“按下”和一次“弹起”,我们可以任选其一来执行程序,或者两个都用,以执行不同的程序也是可以的。下面就用程序来实现这个功能,程序只取按键 K4 为例。
#include <reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit KEY1 = P2^4; sbit KEY2 = P2^5; sbit KEY3 = P2^6; sbit KEY4 = P2^7; unsigned char code LedChar[] = { //数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; void main(){ bit backup = 1; //定义一个位变量,保存前一次扫描的按键值 unsigned char cnt = 0; //定义一个计数变量,记录按键按下的次数 ENLED = 0; //选择数码管 DS1 进行显示 ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P2 = 0xF7; //P2.3 置 0,即 KeyOut1 输出低电平 P0 = LedChar[cnt]; //显示按键次数初值 while (1){ //当前值与前次值不相等说明此时按键有动作 if (KEY4 != backup){ //如果前次值为 0,则说明当前是由 0 变 1,即按键弹起 if (backup == 0){ cnt++; //按键次数+1 //只用 1 个数码管显示,所以加到 10 就清零重新开始 if (cnt >= 10){ cnt = 0; } P0 = LedChar[cnt]; //计数值显示到数码管上 } backup = KEY4; //更新备份为当前值,以备进行下次比较 } } }
先来介绍出现在程序中的一个新知识点,就是变量类型——bit,这个在标准 C 语言里边是没有的。51 单片机有一种特殊的变量类型就是 bit 型。比如 unsigned char 型是定义了一个无符号的 8 位的数据,它占用一个字节(Byte)的内存,而 bit 型是 1 位数据,只占用 1 个位(bit)的内存,用法和标准 C 中其他的基本数据类型是一致的。它的优点就是节省内存空间,8 个bit 型变量才相当于 1 个 char 型变量所占用的空间。虽然它只有 0 和 1 两个值,但也已经可以表示很多东西了,比如:按键的按下和弹起、LED 灯的亮和灭、三极管的导通与关断等等,联想一下已经学过的内容,它是不是能用最小的内存代价来完成很多工作呢?
在这个程序中,我们以 K4 为例,按一次按键,就会产生“按下”和“弹起”两个动态的动作,我们选择在“弹起”时对数码管进行加 1 操作。理论是如此,大家可以在板子上用K4 按键做做实验试试,多按几次,是不是会发生这样一种现象:有的时候我明明只按了一下按键,但数字却加了不止 1,而是 2 或者更多?但是我们的程序并没有任何逻辑上的错误,这是怎么回事呢?于是我们就得来说说按键抖动和消抖的问题了。
作者:seven-soft
来源:CSDN
原文:https://blog.csdn.net/softn/article/details/51836059
版权声明:本文为博主原创文章,转载请附上博文链接! -
矩阵键盘扫描原理详解——单片机
2019-04-23 10:50:26矩阵键盘扫描原理详解 根据原理图 键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低... -
4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键
2021-01-02 19:30:14按键是一种常开型按钮开关,与单片机的常见接法如图所示。按键未按下时两个触点断开,单片机I/O口输入高电平;当按键闭合时,I/O口输入低电平。一、按键讲解当I/O口为P0口时,由于没有内部上拉电阻,所以必须外接上... -
c语言学 判断按键_MCS-51单片机4×4矩阵按键的扫描
2020-12-11 06:57:09以金沙滩工作室的STC89C52单片机开发板为例,记录学习51单片机的笔记,本文章主要讲解了4×4矩阵按键的扫描,教材是金沙滩工作室(www.kingst.org )宋雪松老师编著的《手把手教你学51单片机-C语言版》,所用的... -
4x4矩阵键盘工作原理及扫描程序_【单片机自学】5.独立按键与矩阵键盘
2020-12-29 01:07:481独立按键独立按键模块位置示意图硬件连接原理:图1.2独立按键原理图把对应的端口赋值高电平,即“1”,按键按下,端口被拉低至低电平,即“0”,通过检测该端口的电平即可判断按键是否按下。去抖分析:按键是机械... -
按键扫描
2012-11-14 15:15:23按键作为人类向单片机传递指令的载体,在单片机控制系统中,占有重要的地位,按键失灵,如同人失聪一样不听使唤,使控制系统陷入失控状态。按结构原理来分,按键有机械按键、薄膜按键、电容式触摸按键和电阻式触摸... -
基于proteus的51单片机仿真实例五十三、4个按键的组成的按键扫描实例
2017-05-08 21:24:49本系列文章讲述了基于proteus仿真的51单片机学习,内容全面,不仅讲解电路原理,还讲解了单片机c语言,实例丰富,内容全面。 -
蓝桥杯模块练习之按键扫描
2020-11-20 11:08:40按键扫描原理及实现 在独立键盘模式时,要将J5跳在BTN模式。也就是J5中2,3短路。此时S7,S6,S5,S4一端直接接地,一端连接P30,P31,P32,P33。按键按下时P30,P31,P32,P33都为低电平。在程序中判断即可,为了防止抖动... -
单片机学习笔记——按键和LED复用扫描程序
2019-12-14 10:11:56在我们的实际产品开发过程中,为了节省成本,常常会...(上一讲已经讲过,我个人比较喜欢状态机编程,因此这里还是采用状态机编程的方法,来实现按键和LED复用扫描功能)。 一、按键和LED复用原理图如下: LED... -
4x4矩阵键盘工作原理及扫描程序_AVR单片机扫描4X4矩阵键盘并数码管显示程序
2020-12-30 14:27:31要点 : 在扫描按键时运用了比较复杂的两个for()循环嵌套式扫描方案,大大减少了程序量,循环嵌套方案让我纠结了好久,键值有0~9,上,下,左,右,确认,清零;体会: 又一个里程碑,泪奔啊...我似乎成了 代码男神 啊...;实验... -
蓝桥杯单片机——独立按键、矩阵按键
2020-07-08 18:11:58当按键按下时,相应的P30-33口输入为低电平,由此编写独立按键扫描函数。 矩阵按键 跳线帽需要短接J5口的1和2引脚,按键能使用16个(即上图中S4-S19)。矩阵按键的扫描方法可采用行列扫描法,分为两步: 将行的输出... -
51单片机入门教程(4)——按键控制
2018-11-17 00:20:10按键输入一、独立按键1.1 独立按键的原理1.2 独立按键的仿真电路1.3 按键消抖二、矩阵键盘2.1 矩阵键盘原理2.2 矩阵键盘扫描原理矩阵键盘扫描程序 单片机与外界的信息交互主要有两大类,输入信息和输出信息。 之前的... -
51单片机之矩阵按键
2019-07-20 13:57:14区别:矩阵按键为4*4即16个按键,如果都采用独立按键的解法,那么需要占用16个I/O接口,对于单片机而言是极大的浪费。 工作原理: 先见下图: 他有两种识别方式:逐行扫描、行列扫描。 (1)逐行扫描: 通俗... -
4x4矩阵键盘工作原理及扫描程序_单片机学习第四课——行列式键盘
2020-12-30 13:33:35获得更多单片机以及c相关的资料以及源代码例程,请私信回复 “单片机”一,键盘接口的设计需要解决的问题需要判断是否有按键按下,如果有,那么进入下一个动作。识别是哪一个按键被按下?并求出相应的键值。根据键值... -
【51单片机】矩阵按键
2020-09-09 10:28:34矩阵按键,顾名思义,就是形成矩阵的按键,一般由多行多列组成,如下图是一个4*4的矩阵按键;如果是独立按键,需要占用16个MCU引脚,而使用矩阵按键只需要8个 其原理图如下: 矩阵按照是如何检测哪个按下的呢? ... -
4x4矩阵键盘工作原理及扫描程序_51单片机小项目分析2—矩阵键盘
2020-12-24 13:48:0812.1 项目分析 矩阵键盘,是一种在节省端口的前提下控制大量按键的一种方法,对于传统的独立对地键盘,一个按键就需要占用一个单片机IO口,虽然有时候会加一些扩展芯片之类的用于一个端口控制多个按键,但是电路结构... -
51单片机NOKIA5110屏幕按键手机模仿
2017-11-29 10:02:47这是一个基于普通51单片机和SIM800A模块的按键手机模拟的代码,附原理图,看完代码,你就可以掌握NOKIA5110屏幕的使用方法,矩阵按键在中断中扫描,检索字符串等等技能! -
51单片机实验7:矩阵按键
2019-01-21 21:32:08矩阵按键扫描原理 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按... -
矩阵按键行列反转扫描法
2019-10-29 18:49:4851单片机 | 矩阵键盘行扫描 ———————————————————————————————————————————— 分类: 按结构原理分: 触点式开关按键 无触点开关按键 接入方式 独立式... -
单片机与DSP中的PIC单片机人机接口4×4行列式键盘的工作原理
2020-11-14 05:58:17(1)单片机系统键盘原理 行列式键盘的接法比独立式键盘的接法复杂,编程实现上也会比较复杂。但是,在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多,其原理图如图1所示。 ... -
51单片机LCD1602显示矩阵按键键值
2019-02-11 18:24:16矩阵按键原理图 矩阵按键怎么变成独立按键 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一... -
AVR单片机 实验五 矩阵键盘扫描实验
2020-08-21 19:35:44AVR单片机 实验五 矩阵键盘扫描实验 1 实验目的 掌握矩阵式键盘扫描方法与定时器中断原理,以实现多键输入判别及4位数码管显示的应用。 2 实验内容 (1) 实现矩阵式键盘扫描。 (2) 设定定时中断,实现按键除抖动作,... -
单片机4*4矩阵键盘的原理
2020-04-13 21:21:49单片机4*4矩阵键盘的扫描原理 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪... -
51单片机外设之——按键的检测(快速识别)
2018-04-30 12:46:49而现在介绍的按键扫描法是“快速识别”方法(以独立按键为例,因为矩阵键盘的扫描与独立按键类似)。 首先附上按键的原理图: 用跳帽连接排针 J5 的2脚与3脚,将键盘设置为独立按键(只有S4~S7有效)。此时,S4~S7...
-
java判断字符串中是否含有某个字符串
-
蓝蓝路
-
从零突破日销上千美金,2021起步跨境尚不晚!
-
opencv和numpy以及pillow处理图片时数据各个维度的布局
-
ssm框架整合的第五个阶段:测试了mybats-plus的cuid功能,添加@DeleteMapping、@PostMapping等注解 完成了springmv
-
前端入门part21之2D转换模块
-
PW2057_2.0.pdf
-
vuex 状态管理模式
-
Wintermute完成2000万美元B轮融资,投资方包括光速创投和Pantera Capital,将拓展OTC、衍生品及亚洲业务
-
PostgreSQL全局替换字符串函数
-
[译] 编写AndroidStudio插件(二):持久化数据
-
2021最新Kubernetes(k8s)集群实战精讲
-
JSP详尽攻略-动力节点
-
PW2228A-1.8.pdf
-
SQL Server 2016 高可用灾备技术合集
-
云队友丨复星全球合伙人:那些真正高效的团队是怎么工作的?
-
转行做IT-第5章 流程控制语句
-
uni-app实战专题
-
面试不知道如何做准备? 来看看这一套BATJ最爱问的面试题精选吧
-
PW2312_2.0.pdf