行列反转扫描法在矩阵键盘中的应用及编程思想
扫描矩阵键盘简介以及其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单片机矩阵键盘线反转法体会独立式键盘扫描只需读取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

二. 逐行扫描法与行列互换法
输入情况检测:
第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为接地端
[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得
![[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得](https://img.taocdn.com/s3/m/f25e771e4531b90d6c85ec3a87c24028915f8505.png)
[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得实验五矩阵键盘实验一、实验内容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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间: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; }。