行列反转扫描法在矩阵键盘中的应用及编程思想

合集下载

扫描矩阵键盘简介以及其FPGA设计思路

扫描矩阵键盘简介以及其FPGA设计思路

扫描键盘的设计思想和代码技巧非常值得学习。

首先扫描键盘可以节省FPGA 的引脚资源,例如一个4x4的扫描键盘有16个按键,如果不用扫描方式而是直接把16跟控制线接入FPGA ,就要16个引脚,而用扫描方式只需要4+4=8个引脚。

尤其是随着键盘的增大,比如8x9=72的键盘,用扫描方式只需要17个引脚。

要想了解扫描键盘的原理,首先要知道矩阵键盘的电路结构。

如上图所示,矩阵键盘的某一个按钮按下会使对应的一条行线和列线导通,为了便于分析扫描过程做如下简化:3.3v Row0Row1 Row2Row3 Col 0 Col 1 Col 2 Col 3Row0Row1Row2Row3Col 0 Col 1 Col 2 Col 33 5 A E D C 2 B 9 8 F4 6 0 1 7 接高电平 由FPGA 输出给键盘高低电平的组合,即是扫描码键盘行线高低电平的变化输入给FPGA扫描键盘的工作状态分为两种:第一种状态是判断是否有键按下,该状态下四根列线对应的电平状态是{col 0,col 1,col 2,col 3}=0000 。

四根行线左端都接高电平,没有键被按下时,四根行线右端的状态是{row0,row1,row2,row3}=1111 。

假如上图中按键3被按下了,也就是说row0和col 0接通了。

那么四根行线右端的状态将会是{row0,row1,row2,row3}=0111 。

也就是说,在第一种状态下,只要键盘行线输入FPGA的状态不是1111,就说明有键被按下了。

马上进入第二状态。

第二种状态是判断具体哪个键被按下了。

该状态下四根行线左端接高电平不变,四根列线对应的电平状态不断变化,由FPGA的输出的扫描码控制四根列线的电平状态。

由第一状态的行线输入已经可以确定按键所处的行了。

接下来只要再确定按键所处的列就可以确定到底哪个键被按下了。

如何根据行线的输入确定按键所处的列,奥妙就在于扫描码了。

让列线以1000、0100、0010、0001的电平状态不断循环。

51单片机矩阵键盘线反转法体会

51单片机矩阵键盘线反转法体会

51单片机矩阵键盘线反转法体会独立式键盘扫描只需读取IO口状态,而矩阵式键盘描通常有两种实现方法:逐行扫描法和线反转法。

(1)逐行扫描法依次从第一至最末行线上发出低电平信号, 如果该行线所连接的键没有按下的话, 则列线所接的端口得到的是全“1”信号, 如果有键按下的话, 则得到非全“1”信号。

(2)线反转法线反转法比行扫描速度快,原理是先将行线作为输出线, 列线作为输入线, 行线输出全“0”信号, 读入列线的值, 那么在闭合键所在的列线上的值必为0;然后从列线输出全“0”信号,再读取行线的输入值,闭合键所在的行线值必为 0。

这样,当一个键被按下时, 必定可读到一对唯一的行列值。

再由这一对行列值可以求出闭合键所在的位置。

/*在TX-1C实验板上实现如下描述:实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0~F,6个数码管同时显示。

这里用“线反转”的方法写,可以代替郭天祥书上例【4.2.1】该书上使用逐行扫描的方式。

*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit duan=P2^6; //打开位选和段选sbit wei=P2^7;uchar code table[]={ //数码管显示数值表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(uint x) //毫秒级延时函数{uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void xianshi(uchar num) //段选显示函数{P0=table[num];duan=1;duan=0;}uchar keyscan(void) //矩阵键盘扫描函数{uchar h,l; //定义行、列值中间变量P3=0x0f; //列线输出全为0h=P3&0x0f; //读入行线if(h!=0x0f) //检测有无按键按下{ delay(10); //延时去抖if(h!=0x0f) //如果确实按下{h=P3&0x0f; //再次读入行线P3=0xf0; //输出当前列线值,行线反转l=P3&0xf0; //读入列线值return (h+l); //键盘最后组合编码值,也就是键值}}return 0xff; //其余情况返回该值}void main(){uchar key;P0=0; //关闭所有数码管段选,实验板上电数码管不显示duan=1;duan=0;P0=0xc0; //选中6位数码管wei=1;wei=0;while(1){key=keyscan(); //用key读取keyscan()的值switch(key){case 0xee: key=0; while(keyscan()!=0xff); xianshi(key); break;//while(keyscan()!=0xff)是松手检测语句,松手时检测case 0xde: key=1; while(keyscan()!=0xff); xianshi(key); break; //keyscan()函数会得到返回值0xff,!=oxff时表示按下去了case 0xbe: key=2; while(keyscan()!=0xff); xianshi(key); break;case 0x7e: key=3; while(keyscan()!=0xff); xianshi(key); break;case 0xed: key=4; while(keyscan()!=0xff); xianshi(key); break;case 0xdd: key=5; while(keyscan()!=0xff); xianshi(key); break;case 0xbd: key=6; while(keyscan()!=0xff); xianshi(key); break;case 0x7d: key=7; while(keyscan()!=0xff); xianshi(key); break;case 0xeb: key=8; while(keyscan()!=0xff); xianshi(key); break;case 0xdb: key=9; while(keyscan()!=0xff); xianshi(key); break;case 0xbb: key=10; while(keyscan()!=0xff); xianshi(key); break;case 0x7b: key=11; while(keyscan()!=0xff); xianshi(key); break;case 0xe7: key=12; while(keyscan()!=0xff); xianshi(key); break;case 0xd7: key=13; while(keyscan()!=0xff); xianshi(key); break;case 0xb7: key=14; while(keyscan()!=0xff); xianshi(key); break;case 0x77: key=15; while(keyscan()!=0xff); xianshi(key); break;default: break;}}}/*后记*//*刚开始写这个程序时我把主函数里面的switch—case语句这样写的,while(1){key=keyscan(); //用key读取keyscan()的值switch(key){case 0xee: key=0; break;case 0xde: key=1; break;case 0xbe: key=2; break;case 0x7e: key=3; break;case 0xed: key=4; break;case 0xdd: key=5; break;case 0xbd: key=6; break;case 0x7d: key=7; break;case 0xeb: key=8; break;case 0xdb: key=9; break;case 0xbb: key=10; break;case 0x7b: key=11; break;case 0xe7: key=12; break;case 0xd7: key=13; break;case 0xb7: key=14; break;case 0x77: key=15; break;default: break;}xianshi(key);}运行程序后发现当手按下按键时会有数码的显示,但是一旦放开按键数码管就什么都不显示了。

矩阵键盘的原理及应用

矩阵键盘的原理及应用

矩阵键盘的原理及应用1. 矩阵键盘的原理矩阵键盘是一种常见的输入设备,由多个按键组成,可以同时检测多个按键的状态。

它采用了行列交叉的按键排列方式,通过按键的组合来实现多个输入选项。

其原理主要包括以下几个方面:1.1. 电路结构矩阵键盘的电路结构也称为“行列式键盘”,主要由行线(Row)和列线(Column)组成。

行线和列线通过导线互相交叉连接形成一个矩阵,每个按键都对应矩阵中的一个交叉点。

按键按下时,会导通对应的行线和列线,从而实现按键的状态检测。

1.2. 矩阵扫描矩阵键盘的工作原理是通过矩阵扫描来检测按键状态。

扫描过程由控制器完成,控制器通过逐行扫描的方式检测按键状态。

具体流程如下:1.所有行线置为高电平,所有列线设置为输入模式。

2.逐行将某一行设置为低电平,同时读取列线上的状态。

3.根据读取到的列线状态,确定按下的按键。

4.更新按键的状态,并记录下来。

5.重复以上步骤,直到扫描结束。

1.3. 按键编码矩阵键盘检测到按键状态后,需要进行按键编码,将按键状态转化为数字或字符。

常见的按键编码方式有两种:•行列编码:将矩阵键盘的行和列对应关系转化为一个唯一的值,通常使用二进制编码来表示。

•状态编码:通过按键的状态(按下或释放)来表示,通常使用两个状态位来编码。

2. 矩阵键盘的应用矩阵键盘由于其结构简单、使用方便等特点,在多个领域都得到了广泛的应用。

以下是矩阵键盘的一些常见应用场景:2.1. 电子产品矩阵键盘在电子产品中被广泛应用,比如手机、电视遥控器、计算器等。

它可以提供多个输入选项,方便用户进行操作。

矩阵键盘的结构紧凑,可与其他电路板集成,节省空间,适用于小型电子产品。

2.2. 工业控制矩阵键盘在工业控制领域也有重要应用。

比如工控终端设备、仪表仪器等,可以利用矩阵键盘实现数据输入和操作控制。

由于矩阵键盘可以同时检测多个按键的状态,因此非常适合于工业环境中需要同时输入多个信号的场合。

2.3. 家用电器矩阵键盘在家用电器中也有广泛应用,如洗衣机、微波炉、冰箱等。

单片机矩阵键盘扫描的两种方式

单片机矩阵键盘扫描的两种方式

单片机矩阵键盘扫描的两种方式单片机矩阵键盘扫描的两种方式矩阵键盘扫描方式:第一种:逐行扫描法,就是一行一行的扫描。

实现代码如下(键盘连接P2口):#define NO_KEY 0XFF#define KEY_LO() P2 &= 0XF0#define KEY_HI() P2 |= 0X0F#define KEY_L(i) P2 &= ~(1<<i)#define KEY_RD() ((P2>>4) & 0x0f)UINT8 OnceKey(void){UINT8 line = 0;UINT8 key = NO_KEY;//key valueKEY_LO();if (KEY_RD() == 0X0F){KEY_HI();return NO_KEY;}for (line=0; line<4; line ++){KEY_HI();KEY_L(line);key = KEY_RD();switch (key){case ROW_FIRST:key = 4*line + 0;break;case ROW_SECOND:key = 4*line + 1;break;case ROW_THIRD:key = 4*line + 2;break;case ROW_FOURTH:key = 4*line +3;break;default :key = 0x0f;break;}if (key < 0x10){return key;}}return NO_KEY;}第二种,线性反转法。

就是行和列分别读出。

实现代码如下:#define CVT(i) ((i)==(~1)&0x0f)? 0: ((i)==(~2)&0x0f)? 1: ((i)==(~4)&0x0f)? 2: ((i)==(~8)&0x0f)? 3: 4;#define KEY0_3HI() P2 |= 0X0F#define KEY0_3LO() P2 &= 0XF0#define KEY4_7HI() P2 |= 0XF0#define KEY4_7LO() P2 &= 0X0F#define KEY0_3RD() (P2 & 0X0F)#define KEY4_7RF() ((P2>>4) & 0X0F)UINT8 OnceKey(void){UINT8 line = NO_KEY;UINT8 row = NO_KEY;UINT8 key;KEY0_3HI();KEY4_7LO();line = KEY0_3RD();//读入行的值if (0x0f == line){key = NO_KEY;}else{KEY0_3LO();KEY4_7HI();row = KEY4_7RD();//读入列的值if (0x0f == row){key = NO_KEY;}else{key = CVT(line)*4 + CVT(row);}}KEY0_3HI();KEY4_7HI();return key; }。

矩阵式键盘的接口设计与编程

矩阵式键盘的接口设计与编程

;<--------------------------判断是否真的有键按下--------------------->
T_KEY:
ACALL
DL_20MS
;调用延时子程序
ACALL
P_KEY
;再次调用“有无按键按下子程序”
JNZ
IN_SCAN
;若有键按下,则执行逐行扫描程序
AJMP
SCAN
;若无键按下,则不断查询
;<--------------------------扫描数据初始化----------------------->
单片机原理及应用技术
—1—
one 矩阵式键盘接口设计——基于行反转法
4×4矩阵式键盘接 口设计如图所示
—2—
图中P1口的低4位作为行线,P2口的低4位作为列线。行线通过74LS21进行逻辑与操作后作为单 片机的外部中断源输入,当有键按下时以中断形式去执行相应的按键处理程序。
行反转法因判键时将输入与输出线反转互换而得名,步骤如下:
PB口作为扫描口需要设为输出,PA口设为读入。 逐行扫描时,PB口的状态为:
PB7 PB6 PB5 PB4 111 1 111 1 111 1 111 1 111 0 110 1 101 1 011 1
PB3 PB2 PB1 PB0 1 110 1 101 1 011 0 111 1 111 1 111 1 111 1 111
—3—
【例9-3】 行反转法判断按键编号,并存入40H单元,程序如下
ORG
0000H
LJMP
MAIN
ORG
0003H
LJMP
INT0
ORGБайду номын сангаас

矩阵键盘的工作原理及应用

矩阵键盘的工作原理及应用

矩阵键盘的工作原理及应用1. 简介矩阵键盘是一种常见的输入设备,广泛应用于电子产品、计算机等领域。

它的工作原理是利用矩阵排列的按键,通过行列的交叉点来进行按键扫描和识别。

本文将介绍矩阵键盘的工作原理,并探讨其在不同领域的应用。

2. 工作原理矩阵键盘由多行多列的按键组成,每个按键都与一个行线和一个列线相连。

当按下某个按键时,行线和列线之间会形成一个闭合的电路。

通过扫描行线和列线的电平状态,就可以确定用户按下的具体按键。

3. 矩阵键盘的扫描方法矩阵键盘的扫描过程分为两个步骤:行扫描和列扫描。

3.1 行扫描行扫描是通过将每一行的行线设置为低电平,其他行线设置为高电平,然后检测列线的状态来判断是否有按键按下。

如果某一行的行线低电平与某一列的列线低电平相交,就说明该按键按下。

3.2 列扫描列扫描是通过将每一列的列线设置为低电平,其他列线设置为高电平,然后检测行线的状态来判断是否有按键按下。

如果某一列的列线低电平与某一行的行线低电平相交,就说明该按键按下。

4. 应用场景4.1 电子产品矩阵键盘广泛应用于各种电子产品,如手机、平板电脑、数码相机等。

它们通常用作输入设备,方便用户进行文字输入、功能选择等操作。

矩阵键盘的紧凑设计和按键间距的合理安排使得用户可以快速而准确地完成操作。

4.2 计算机在计算机上,矩阵键盘也被广泛应用于输入设备,比如台式机的键盘和笔记本电脑的内置键盘。

通过连接到计算机主机或者通过无线传输,矩阵键盘可以实现与计算机的交互,使用户可以方便地输入文字、操作软件等。

4.3 安防系统矩阵键盘在安防系统中也有重要的应用。

比如,一些门禁系统和报警系统需要用户输入密码或者进行特定操作来进行识别和控制。

矩阵键盘可以提供安全、方便的用户输入接口,确保系统的可信度和可靠性。

4.4 工业控制在工业控制领域,矩阵键盘通常被用作控制面板的一部分。

例如,机械设备控制面板上的按键,用来进行参数设置、启动停止等操作。

矩阵键盘的稳定性和可靠性非常重要,可以确保设备的正常运行和操作的准确性。

独立式键盘与矩阵键盘原理逐行扫描法与行列互换法 键盘编码器芯片74C922

独立式键盘与矩阵键盘原理逐行扫描法与行列互换法 键盘编码器芯片74C922

二. 逐行扫描法与行列互换法
输入情况检测:
第1行检测
第2行检测
第3行检测
第4行检测
二. 逐行扫描法与行列互换法
第2列扫描: 第2列输出0,其余列输出1
输入情况检测:
第1行检测
第2行检测
第3行检测
第4行检测Biblioteka 二. 逐行扫描法与行列互换法
第3列扫描: 第3列输出0,其余列输出1
输入情况检测:
第1行检测
第2行检测
第3行检测
第4行检测
二. 逐行扫描法与行列互换法
第4列扫描: 第4列输出0,其余列输出1
输入情况检测:
第1行检测
第2行检测
第3行检测
第4行检测
二. 逐行扫描法与行列互换法
逐行扫描法的 另一种写法:
第1列输出0的情况:
其余情况类似,这里省略
二. 逐行扫描法与行列互换法
行列互换法:
将两次读入的端口电平值进行 “或” 运算,则结果中只有对 应闭合键所在行、列位置的数值为0,其余皆为1。
口线,那么CPU就可以通过向此
I/O口发出读指令来得到当前按键 的状态。
一.独立式按键与矩阵式键盘原理
2.矩阵式按键 在独立式按键结构下,如果连接 16个按键则需要占用16个I/O资 源,而矩阵式按键结构只需要8
个I/O 口。因此在需要大量按键
的情况下,矩阵式按键结构比独 立式按键节约I/O口的资源
根据预先制定的规则,利用查表法可求出代表闭合键编号的 键模值。
二. 逐行扫描法与行列互换法
三. 键盘编码器芯片74C922
各引脚功能如下: Y1—Y4为行键输入端; X1—X4为列键输入端; OSC为振荡器的外接引线端,可用 外部的输入脉冲或电容器; DA—DD为数据输出端,可与微机 直接接口;KBM为键颤屏蔽端; OE 为数据输出允许端,低电平有 效; DAV为数据输出有效,高电平有效; VCC为电源端,接3—5V; GND为接地端

[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得

[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得

[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得实验五矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。

按其它键退出。

2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。

可定义“A”键为“+”键,“B”键为“=”键。

二、实验目的学习独立式按键的查询识别方法。

2、非编码矩阵键盘的行反转法识别方法。

三、实验说明1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。

2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。

3、识别键的闭合,通常采用行扫描法和行反转法。

行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。

行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。

然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。

这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。

由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。

行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0某F0;假如此时没有人按键,从P1口读出的值应仍为0某F0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0某B0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0某BF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0某BE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

矩阵式键盘的按键识别方法

矩阵式键盘的按键识别方法

矩阵式键盘的按键识别方法矩阵式键盘是一种常见的电子输入设备,它由多个按键组成,这些按键以矩阵的形式排列在键盘上。

在使用矩阵式键盘时,我们需要将按下的按键与相应的键值进行关联,以实现按键的识别。

下面将介绍几种常见的矩阵式键盘按键识别方法。

1.矩阵扫描法矩阵扫描法是最常见的一种按键识别方法。

在矩阵式键盘上,按键被组织成不同的行和列。

通过扫描每一行和每一列,我们可以确定按下的按键。

具体操作步骤如下:-所有行设置为输出,所有列设置为输入。

-循环扫描每一行,将当前行设置为高电平,然后读取所有列的状态。

-如果其中一列的状态为低电平,说明当前位置的按键被按下。

-记录下按下按键的位置(行和列),以及对应的键值。

2.矩阵编码法矩阵编码法是一种较为高级的按键识别方法,它通过给每个按键分配一个唯一的编码,以实现按键的识别。

具体操作步骤如下:-所有行和列都需要连接到对应的编码器上。

-当按键被按下时,编码器会生成一个唯一的编码,表示按下的按键。

-通过读取编码器的输出,我们可以确定按下的按键以及对应的键值。

3.容量触摸法除了物理按键,一些矩阵式键盘还具有触摸功能。

这种键盘使用触摸传感器来检测手指触摸的位置,以实现按键的识别。

具体操作步骤如下:-键盘上的每个按键都带有一个触摸传感器。

-当手指触摸一些按键时,触摸传感器会检测到电容的变化。

-根据电容的变化,我们可以确定手指触摸的位置,从而确定按下的按键以及对应的键值。

总结起来,矩阵式键盘的按键识别方法可以通过矩阵扫描法、矩阵编码法和容量触摸法来实现。

无论采用哪种方法,都需要通过适当的硬件和软件设计来实现按键的检测和识别。

这些方法的选择通常取决于键盘的设计要求和成本限制。

矩阵键盘——精选推荐

矩阵键盘——精选推荐

矩阵键盘1.⾏扫描法⼯作原理(查询法)判别键盘中有⽆键按下。

向⾏线输出全0,读⼊列线状态。

如果有键按下,总有⼀列线被拉⾄低电平,从⽽使列输⼊不全为1。

查找按下键所在位置。

依次给⾏线送低电平,查列线状态。

全为1,则所按下的键不在此⾏;否则所按下的键必在此⾏且是在与零电平列线相交的交点上的那个键。

对按键位置进⾏编码。

找到所按下按键的⾏列位置后,对按键进⾏编码,即求得按键键值。

#includechar key(){char row,col, k =-1; //定义⾏、列、返回值P1=0xf0;if((P1&0xf0)==0xf0)return k; //⽆键按下,返回delay20ms(); //延时去抖if((P1&0xf0)==0xf0)return k; //抖动引起,返回for(row=0;row<4;row++) //⾏扫描{ P1=~(1<k=P1&0xf0;if(k!=0xf0) //列线不全为1,{ while(k&(1<<(col+4))) //所按键在该列col++; //查找为0列号k=row*4+col; //计算键值P1=0xf0;while((P1&0xf0)!=0xf0); //等待键释放break;} }return k; //返回键值}3.⾏列反转法⼯作原理判别键盘中有⽆键按下。

(⽅法同⾏扫描法)输⼊变输出,再读。

将上⼀步读取到的列线输⼊值从列线输出,读取⾏线值。

定位求键值。

根据上⼀步输出的列线值和读取到的⾏线值就可以确定所按下键所在的位置,从⽽查表确定键值。

#includechar key(){char code keycode[]= {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}char row,col,k=-1,i;P1=0xf0;if((P1&0xf0)==0xf0)return k; //⽆键按下,返回-1 delay20ms(); //延时去抖if((P1&0xf0)==0xf0)return k; //抖动引起,返回-1 P1=0xf0;col=P1&0xf0; //⾏输出全0,读取列值P1=col|0x0f;row=P1&0x0f; //列值输出,读取⾏值//查找⾏列组合值在键盘表中位置for(i=0;i<16;i++)if((row|col)==keycode[i]) //找到,i即为键值,{ //否则,返回-1key=i; //对重复键,该⽅法break; //处理为⽆键按下}P1=0xf0;while((P1&0xf0)!=0xf0); //等待键释放return k; //返回键值}。

行列反转扫描法在矩阵键盘中的应用及编程思想

行列反转扫描法在矩阵键盘中的应用及编程思想

行列反转扫描法在矩阵键盘中的应用及编程思想我现在正在学习51单片机,学到矩阵键盘时,遇到了一些小问题,感觉行列扫描法原理简单,但编程较啰嗦,而且没有固定的编程模式,一个人一个编法,代码复杂,一会儿就能把人绕晕。

于是我就想寻找有没有一种编程思想灵巧,代码简便的程序,通过苦苦在网上寻觅,终于找到了反转法。

行列反转扫描法法可能有些教材资料里都有,但是介绍都不够详细,我找到一个资料,代码非常简单,但是并不好理解,我苦苦思索了一个晚上才弄明白。

于是根据反转法的思想,我写了一个代码不是最少,但却是非常容易理解的程序,在此拿来与大家共享。

此程序已在开发板及Proteus软件中仿真成功。

电路原理图:P1口接矩阵键盘,其中P1.0~P1.3接行线,P1.4~P.7接列线,P0口接共阴极7段数码管。

反转法的原理:反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。

for example:如图1所示,取P1口的低四位为行线,高四位为列线。

1.我们给P1口赋值0x0f,即00001111,假设0键按下了,则这时P1口的实际值为00001110;2.我们给P1口再赋值0xf0,即11110000,如果0键按下了,则这时P1口的实际值为11100000;3.我们把两次P1口的实际值相加得11101110,即0xee。

由此我们便得到了按下0键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。

对应关系见图2.以下为程序:/*反转法矩阵键盘的应用,我认为这是一个编程简便又容易理解的矩阵键盘编程应用*/#include<reg52.h> //头文件#define uchar unsigned char //宏定义#define uint unsigned intuchar key,n; //定义变量uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7 ,0xb7,0x77}; //反转法矩阵键盘的各个按键的计算值uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管显示0~Fvoid delay(uint i) //延时函数{while(i--);}void keyscan(){uchar l,h,i; //定义局部变量,用l得出低4位的值,用h得出高4位的值P1=0x0f; //给P1赋值00001111l=P1&0x0f;if(l!=0x0f){delay(100);if(l!=0x0f)l=P1&0x0f; //若有键按下,得出低四位的值}P1=0xf0; //给P1赋值11110000h=P1&0xf0;if(h!=0xf0){delay(100);if(h!=0xf0)h=P1&0xf0; //若有键按下,得出高4位的值}key=l+h; //高4位的值与低4位的值相加for(i=0;i<16;i++){if(key==table[i]) //通过查表得出n的值n=i;}}void main(){while(1){keyscan();P0=yin[n]; //在数码管上显示相应的键值}}temp_key=P2; //0键按下时P2=0000 1110;temp1=temp_key|0xf0;//确定了在哪一行temp1=1111 1110 P2=temp1;//temp_key=P2;确定了在哪一列//temp_key=1110 1110 P3=0xf0;temp=P3;if(temp!=0xf0){delay(5);P3=0xf0;temp=P3;if(temp!=0xf0){P3=0x0f;temp2=P3;if(temp2!=0x0f){temp3=temp|temp2; }。

经典的矩阵键盘扫描程序

经典的矩阵键盘扫描程序

经典的矩阵键盘扫描程序矩阵键盘是一种常见的输入设备,广泛应用于电子产品中。

为了实现对矩阵键盘的扫描和输入响应,需要编写一个矩阵键盘扫描程序。

本文将详细介绍如何编写一个经典的矩阵键盘扫描程序。

1. 程序功能描述矩阵键盘扫描程序的主要功能是实现对矩阵键盘的扫描,并根据按键的状态进行相应的处理。

程序需要实现以下功能:- 扫描矩阵键盘的按键状态;- 根据按键状态进行相应的处理;- 输出按键的值或执行相应的操作。

2. 程序设计思路矩阵键盘通常由多行多列的按键组成,每个按键都有一个唯一的行列地址。

程序的设计思路如下:- 初始化矩阵键盘的引脚和状态变量;- 循环扫描矩阵键盘的按键状态;- 检测按键状态变化,并根据变化进行相应的处理;- 输出按键的值或执行相应的操作。

3. 程序代码示例下面是一个简单的矩阵键盘扫描程序的代码示例:```#include <stdio.h>#include <stdbool.h>// 定义矩阵键盘的行列数#define ROWS 4#define COLS 4// 定义矩阵键盘的引脚int rowPins[ROWS] = {2, 3, 4, 5}; int colPins[COLS] = {6, 7, 8, 9}; // 定义矩阵键盘的按键值char keys[ROWS][COLS] = {{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'*', '0', '#', 'D'}};// 初始化矩阵键盘void setup() {// 设置引脚模式为输入for (int i = 0; i < ROWS; i++) { pinMode(rowPins[i], INPUT); }// 设置引脚模式为输出for (int i = 0; i < COLS; i++) {pinMode(colPins[i], OUTPUT);}}// 扫描矩阵键盘void scanKeypad() {for (int i = 0; i < COLS; i++) {// 将当前列引脚设置为高电平digitalWrite(colPins[i], HIGH);for (int j = 0; j < ROWS; j++) {// 检测当前行引脚的状态bool state = digitalRead(rowPins[j]); // 如果按键状态发生变化if (state != lastState[i][j]) {// 更新按键状态lastState[i][j] = state;// 如果按键被按下if (state == LOW) {// 输出按键的值Serial.println(keys[j][i]);// 执行相应的操作switch (keys[j][i]) {case '1':// 执行操作1break;case '2':// 执行操作2break;// 其他按键的操作}}}}// 将当前列引脚设置为低电平 digitalWrite(colPins[i], LOW); }}void loop() {// 扫描矩阵键盘scanKeypad();// 延时一段时间,避免频繁扫描delay(10);}```4. 程序运行结果编写完成矩阵键盘扫描程序后,可以将程序上传到相应的开发板或单片机上进行测试。

矩阵按键的原理及代码实现

矩阵按键的原理及代码实现

矩阵按键的原理及代码实现
独⽴按键和矩阵按键:
矩阵按键扫描原理:
⽅法⼀、逐⾏扫描,我们可以通过⾼四位轮流输出低电平来对矩阵键盘进⾏扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪⼀位为0来判断是哪⼀个按键被按下。

⽅法⼆、⾏列扫描,我们可以通过⾼四位全部输出低电平,低四位输出⾼电平,当接收到的数据,低四位不全为⾼电平时,说明有按键按下,然后通过接受的数据值,判断是哪⼀列有按键按下,然后再反过来,⾼四位输出⾼电平,低四位输出低电平,然后根据接收到的⾼四位的值判断是哪⼀⾏有按键按下,这样就能够确定是哪⼀个按键按下了。

通常我们⽤到的是⾏列扫描
代码实现:(待更新)。

反转法键盘扫描原理

反转法键盘扫描原理

反转法键盘扫描原理
标题:反转法键盘扫描原理
引言概述:
反转法键盘扫描原理是一种常用的键盘输入检测方法,通过利用键盘矩阵的特性,实现对按键的扫描和识别。

本文将从五个大点来详细阐述反转法键盘扫描原理,包括键盘矩阵的构成、按键扫描的流程、按键状态的判断、消除按键冲突的方法以及常见的应用场景。

正文内容:
1. 键盘矩阵的构成
1.1 键盘矩阵的基本概念
1.2 键盘矩阵的物理结构
1.3 键盘矩阵的电气结构
2. 按键扫描的流程
2.1 初始化键盘矩阵
2.2 逐行扫描键盘矩阵
2.3 判断按键状态
2.4 输出按键值
3. 按键状态的判断
3.1 按键按下的检测
3.2 按键释放的检测
3.3 按键状态的保存与更新
4. 消除按键冲突的方法
4.1 基于时间分片的消除方法
4.2 基于硬件编码的消除方法
4.3 基于软件算法的消除方法
5. 常见的应用场景
5.1 电脑键盘
5.2 手机触摸屏键盘
5.3 数字键盘
5.4 游戏手柄
总结:
通过本文的阐述,我们了解了反转法键盘扫描原理的基本概念和工作原理。

键盘矩阵的构成、按键扫描的流程、按键状态的判断、消除按键冲突的方法以及常见的应用场景都被详细介绍。

反转法键盘扫描原理在各种输入设备中得到广泛应用,为我们提供了高效、准确的输入方式。

在今后的技术发展中,我们可以进一步优化反转法键盘扫描原理,提升输入设备的性能和用户体验。

4x4矩阵键盘扫描原理

4x4矩阵键盘扫描原理

4x4矩阵键盘扫描原理
4x4矩阵键盘扫描原理是一种常用的键盘扫描方法,也称为矩阵键盘扫描。

它可以将多个按键连接在一起并使用较少的引脚来检测按键的状态。

4x4矩阵键盘由4行和4列组成,共有16个按键。

通常使用单片机或电路来进行扫描,以下是简要的原理:
1. 行扫描:首先,将行引脚设置为输出,同时将列引脚设置为输入,并将其上拉或下拉。

所有行引脚中只有一个为低电平,其余为高电平。

然后逐行检测按键状态。

2. 列检测:对于每一行,将对应的行引脚置为低电平后,检测列引脚的电平状态。

如果有按键按下,则相应的列引脚会变为低电平。

通过读取列引脚的状态,可以确定按键的位置。

3. 组合键:由于只能一次检测一行,因此当同时按下多个按键时,可能会导致误检。

为了解决这个问题,可以在检测到按键按下时,延迟一段时间,并再次检测按键的状态。

如果在第二次检测时仍然检测到按键按下,则确认按键有效。

4. 反向扫描:为了检测按键的释放状态,可以将行引脚设置为输入,列引脚设置为输出,并将其置为低电平。

然后逐列检测行引脚的电平状态,如果有按键释放,则相应的行引脚会变为高电平。

通过不断地循环扫描所有的行和列,可以实时检测按键的状态,并根据需要进行相应的处理。

单片机矩阵式键盘连接方法及工作原理

单片机矩阵式键盘连接方法及工作原理

矩阵式键盘的连接方法和工作原理什么是矩阵式键盘?当键盘中按键数量较多时,为了减少I/O 口线的占用,通常将按键排列成矩阵形式。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样做有什么好处呢?大家看下面的电路图,一个并行口可以构成4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别就越明显。

比如再多加一条线就可以构成20 键的键盘,而直接用端口线则只能多出一个键(9 键)。

由此可见,在需要的按键数量比较多时,采用矩阵法来连接键盘是非常合理的。

矩阵式结构的键盘显然比独立式键盘复杂一些,识别也要复杂一些,在上图中,列线通过电阻接电源,并将行线所接的单片机4 个I/O 口作为输出端,而列线所接的I/O 口则作为输入端。

这样,当按键没有被按下时,所有的输出端都是高电平,代表无键按下,行线输出是低电平;一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了,具体的识别及编程方法如下所述:二.矩阵式键盘的按键识别方法确定矩阵式键盘上任何一个键被按下通常采用“行扫描法”或者“行反转法”。

行扫描法又称为逐行(或列)扫描查询法,它是一种最常用的多按键识别方法。

因此我们就以“行扫描法”为例介绍矩阵式键盘的工作原理:1.判断键盘中有无键按下将全部行线X0-X3 置低电平,然后检测列线的状态,只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中;若所有列线均为高电平,则表示键盘中无键按下。

2.判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:依次将行线置为低电平(即在置某根行线为低电平时,其它线为高电平),当确定某根行线为低电平后,再逐行检测各列线的电平状态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

下面给出一个具体的例子:单片机的P1 口用作键盘I/O 口,键盘的列线接到P1 口的低4 位,键盘的行线接到P1 口的高4位,也就是把列线P1.0-P1.3 分别接4 个上拉电阻到电源,把列线P1.0-P1.3 设置为输入线,行线P1.4-P1.7 设置为输出线,4 根行线和4 根列线形成16 个相交点,如上图所示。

矩阵键盘的工作原理和扫描确认方式

矩阵键盘的工作原理和扫描确认方式
在该方式中要使用mcu的一个定时器使其产生一个10ms的定时中断mcu响应定时中断执行键盘扫描当在连续两次中断中都读到相同的按键按下间隔10ms作为消抖处理mcu才执行相应的键处理程序中断方式
9.3.1 矩阵键盘的工作原理和扫描确认方式
来源:《AVR 单片机嵌入式系统原理与应用实践》M16 华东师范大学电子系 马潮 当键盘中按键数量较多时,为了减少对 I/O 口的占用,通常将按键排列成
矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图 9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交 点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行 或列线上的电平变化可以确定哪个按键被按下。
图 9-7 为一个 4 x 3 的行列结构,可以构成 12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个 16 键的键盘。很明显,在按键数量多的场合,矩 阵键盘与独立式按键键盘相比可以节省很多的 I/O 口线。
File name
: demo_9_3.c
Chip type
: ATmega16
Program type
: Application
Clock frequency
: 4.000000 MHz
// 输出行线电平 // 必须送 2 次!!!(注 1 // 读列电平 // 没有按键,继续扫描
// 有按键,停止扫描 // 转消抖确认状态
// 再次读列电平, // 与状态 0 的相同,确认按键 // 键盘编码,返回编码值
case 0b01000110:
key_return = K4_1;
break;
它们不仅与键盘的硬件连接有关系,同时还要注意他们在程序中是如何使用的, 其值的保存等等。

线反转法识别矩阵键盘的原理

线反转法识别矩阵键盘的原理

线反转法识别矩阵键盘的原理线反转法识别矩阵键盘的原理一、引言随着科技的不断发展,矩阵键盘已经成为了人们日常生活中不可或缺的一部分。

在现代社会中,矩阵键盘被广泛应用于各种设备中,如电脑、手机、ATM机等。

然而,在使用矩阵键盘时,我们往往需要对其进行输入操作。

如何对矩阵键盘进行输入操作以及如何识别用户的输入操作就成为了一个重要的问题。

二、矩阵键盘的基本结构矩阵键盘是由多个按键组成的,每个按键都有一个唯一的编号。

这些按键通常被排列成一个矩形网格,并被连接到一个控制器上。

控制器通过扫描每个按键来检测用户输入。

三、线反转法识别矩阵键盘原理1. 线反转法简介线反转法是一种常用于检测电路中是否有故障的方法。

它利用了电路中两条线之间相互影响的特性。

2. 线反转法在识别矩阵键盘中的应用在使用线反转法识别矩阵键盘时,我们需要将每个按键与一个独立的输入线连接起来。

这些输入线被分成两组:行线和列线。

行线连接到矩阵键盘的行端口,列线连接到矩阵键盘的列端口。

当用户按下某个按键时,该按键所在的行和列之间会形成一条电路。

此时,电路中的电流会通过该按键并流回控制器。

控制器会检测到这条电路并确定用户按下了哪个按键。

3. 矩阵键盘的扫描过程在使用线反转法识别矩阵键盘时,控制器会通过扫描每个按键来检测用户输入。

具体流程如下:(1)将所有列设置为输出模式,并将它们置为高电平;(2)将所有行设置为输入模式,并启动一个循环;(3)在循环中,逐一扫描每一行;(4)当扫描到某一行时,将该行置为低电平,并读取每一列的状态;(5)如果有某一列被检测到有低电平,则说明该列与当前扫描的行之间形成了一条电路,即有某个按键被按下了;(6)记录下被按下的按键的编号,并将该行恢复为高电平状态;(7)继续扫描下一行,直到所有行都被扫描完毕。

四、总结线反转法识别矩阵键盘的原理是基于电路中两条线之间相互影响的特性。

在使用线反转法识别矩阵键盘时,我们需要将每个按键与一个独立的输入线连接起来,并将这些输入线分成两组:行线和列线。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

行列反转扫描法在矩阵键盘中的应用及编程思想
我现在正在学习51单片机,学到矩阵键盘时,遇到了一些小问题,感觉行列扫描法原理简单,但编程较啰嗦,而且没有固定的编程模式,一个人一个编法,代码复杂,一会儿就能把人绕晕。

于是我就想寻找有没有一种编程思想灵巧,代码简便的程序,通过苦苦在网上寻觅,终于找到了反转法。

行列反转扫描法法可能有些教材资料里都有,但是介绍都不够详细,我找到一个资料,代码非常简单,但是并不好理解,我苦苦思索了一个晚上才弄明白。

于是根据反转法的思想,我写了一个代码不是最少,但却是非常容易理解的程序,在此拿来与大家共享。

此程序已在开发板及Proteus软件中仿真成功。

电路原理图:
P1口接矩阵键盘,其中P1.0~P1.3接行线,P1.4~P.7接列线,P0口接共阴极7段数码管。

反转法的原理:
反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算
法。

for example:
如图1所示,取P1口的低四位为行线,高四位为列线。

1.我们给P1口赋值0x0f,即00001111,假设0键按下了,则这时P1口的实际值为00001110;
2.我们给P1口再赋值0xf0,即11110000,如果0键按下了,则这时P1口的实际值为11100000;
3.我们把两次P1口的实际值相加得11101110,即0xee。

由此我们便得到了按下0键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。

对应关系见图2.
以下为程序:
/*反转法矩阵键盘的应用,我认为这是一个编程简便又容易理解的矩阵键盘编程应用*/
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar key,n; //定义变量
uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7 ,0xb7,0x77}; //反转法矩阵键盘的各个按键的计算值
uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0
x79,0x71}; //共阴极数码管显示0~F
void delay(uint i) //延时函数
{
while(i--);
}
void keyscan()
{
uchar l,h,i; //定义局部变量,用l得出低4位的值,用h得出高4位的值P1=0x0f; //给P1赋值00001111
l=P1&0x0f;
if(l!=0x0f)
{
delay(100);
if(l!=0x0f)
l=P1&0x0f; //若有键按下,得出低四位的值
}
P1=0xf0; //给P1赋值11110000
h=P1&0xf0;
if(h!=0xf0)
{
delay(100);
if(h!=0xf0)
h=P1&0xf0; //若有键按下,得出高4位的值
}
key=l+h; //高4位的值与低4位的值相加
for(i=0;i<16;i++)
{
if(key==table[i]) //通过查表得出n的值
n=i;
}
}
void main()
{
while(1)
{
keyscan();
P0=yin[n]; //在数码管上显示相应的键值
}
}
temp_key=P2; //0键按下时P2=0000 1110;
temp1=temp_key|0xf0;//确定了在哪一行temp1=1111 1110 P2=temp1;//
temp_key=P2;确定了在哪一列//temp_key=1110 1110 P3=0xf0;
temp=P3;
if(temp!=0xf0)
{
delay(5);
P3=0xf0;
temp=P3;
if(temp!=0xf0)
{
P3=0x0f;
temp2=P3;
if(temp2!=0x0f)
{
temp3=temp|temp2; }。

相关文档
最新文档