矩阵键盘检测

合集下载

实验一 矩阵键盘检测

实验一  矩阵键盘检测

实验一矩阵键盘检测一、实验目的:1、学习非编码键盘的工作原理和键盘的扫描方式。

2、学习键盘的去抖方法和键盘应用程序的设计。

二、实验设备:51/AVR实验板、USB连接线、电脑三、实验原理:键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。

我们可以通过键盘输入数据或命令来实现简单的人机通信。

1、按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。

前者造价低,后者寿命长。

目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。

按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。

编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。

全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。

非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。

由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。

2、按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。

也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。

此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。

当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。

因此,键信息输入是与软件结构密切相关的过程。

对于一组键或一个键盘,通过接口电路与单片机相连。

单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。

矩阵键盘的按键识别方法

矩阵键盘的按键识别方法

矩阵键盘的按键识别方法
在学习有关矩阵键盘的时候,往往要学会矩阵键盘的按键识别方法,那么矩阵键盘的按键识别方法有哪些呢?店铺带着你来了解方法一行扫描法
1、判断键盘中有无键按下将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态。

只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。

若所有列线均为高电平,则键盘中无键按下。

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

其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。

在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。

若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

方法二
先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。

再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。

将两次读取结果组合起来就可以得到当前按键的特征编码。

矩阵键盘的按键识别方法在学习有关矩阵键盘的时候,往往要学会矩阵键盘的按键识别方法,那么矩阵键盘的按键识别方法有哪些呢?店铺带着你来了解方法一行扫描法 1、判断键盘中有无键按下将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内推荐度:点击下载文档文档为doc格式。

实验6 矩阵键盘的检测

实验6 矩阵键盘的检测

实验6 矩阵键盘的检测一、实验目的1、掌握七段数码管显示的软件译码方法;2、掌握矩阵键盘的使用。

二、实验内容矩阵键盘来控制数码管显示:实验板上电时,数码管不显示,顺序按下4*4矩阵键盘后,在数码管上依次显示0-F,6个数码管同时静态显示即可。

三、实验方法和手段多媒体教学、演示、讲练结合、软件仿真、实物焊接四、实验条件实验指导书、计算机、Proteus软件、Keil C51软件、耗材、电烙铁五、实验学时2学时六、实验步骤1、Proteus设计电路原理图(1)按照图6-1,在Proteus软件中绘制好电路原理图。

图6-1 电路原理图说明:矩阵键盘行线接P3口低4位(第一行P3.0),列线接P3口高4位(第一列接P3.4)。

(2)电路原理图中所需要的元件见表6-1。

表6-1 元件列表元件名称型号数量Proteus中的名称单片机芯片AT89C51 1个AT89C51 晶振12MHz 1个CRYSTAL电容22PF 2个CAP电解电容22uF/16V 1个CAP-ELEC电阻1K 1个RES排阻1K 1个RESPACK_8 六位一体共阴极数码管1个7SEG-MPX6_CC 锁存芯片74HC573 2个74HC573按键开关16个BUTTON 2、编程控制在Keil软件中进行程序编制,完成目标:顺序按下4*4矩阵键盘后,6个数码管同时静态依次显示0-F。

将下面的参考程序补充完整,也可自行编写新程序。

参考程序代码如下:3、仿真调试将生成的HEX文件加载到Proteus中,进行软件仿真,查看效果。

4、实物调试(1)程序烧制(2)使用焊接成功的电路板,通电调试,查看效果。

七、思考题1、如果采用双数码管显示按键值(0-15),应如何修改程序代码?2、如果行线接P3口低4位,列线接P2口低4位,程序代码如何修改?。

矩阵键盘检测

矩阵键盘检测

实验报告九课程名称:微机原理与接口技术指导老师:李素敏学生姓名:向春霞学号:1243013 专业:通信工程日期:5月地点:理工603实验九矩阵键盘检测1. 实验目的和要求①学会使用编写关于矩阵按键的查询和显示的程序2. 主要仪器设备电脑,Keil软件3.实验内容实验内容:对实验板上4*4矩阵键盘的16个按键S6---S21进行按键次数统计。

键号06、07……21用最左边2位数码管显示,按键次数用右侧4位数码管显示。

有键按下时,显示相应键号和该键累计按键次数,没键按下时,数码管不亮。

(无论键号还是按键次数都用其十进制数显示。

)(1)设计思路:①利用反转法查询按键的键码②把按键键码的十位和各位分别表示出来。

③用30H到3FH单元记按键次数(2)源程序:ORG 0000HAJMP MAINORG 0030HMAIN: MOV R2,#10H ;给30H-3FH单元清零MOV R1,#30HMOV A,#00HXH: MOV @R1,AINC R1DJNZ R2,XHLOOP: LCALL KEYLCALL XSLJMP LOOPXS: MOV A,60HMOV P0,#0FFHMOV DPTR,#DUANMOVC A,@A+DPTR ;把十位给最左边的数码管MOV P0,ACLR P2.6SETB P2.7MOV P0,#0FEHCLR P2.7LCALL DEL0MOV A,61HMOVC A,@A+DPTR ;把个位数用数码管表示SETB P2.6MOV P0,#0FFHMOV P0,ACLR P2.6SETB P2.7MOV P0,#0FDHCLR P2.7LCALL DEL0MOV A,62HMOV P0,#0FFHMOVC A,@A+DPTRSETB P2.6MOV P0,ACLR P2.6SETB P2.7MOV P0,#0FBHCLR P2.7LCALL DEL0MOV A,63HMOVC A,@A+DPTR ;把个位数用数码管表示SETB P2.6MOV P0,ACLR P2.6SETB P2.7MOV P0,#0F7HCLR P2.7LCALL DEL0RETKEY : MOV P3,#0FH ;将P3的高四位给"0"MOV A,P3 ;读P3ANL A,#0FH ;判断p3的高4位有没有变化,给AMOV B,A ;将变换后的信息放入b暂存MOV P3,#0F0H ;给P3的低四位赋0ANL A,#0F0H ;判断p3的低4位有没有变化,给AORL A,B ;合成特征码CJNE A,#0FFH,KEY1AJMP RETNKEY1: MOV B,A ; 存特征码MOV DPTR,#TABLE ;取表头地址MOV R3,#0FFH ;给初值,也是空键的代码KEY2: INC R3MOV A,R3MOVC A,@A+DPTR ;查找键值CJNE A,B,KEY2 ;判断是否查完MOV A,R3 ;找到键值存入AADD A,#06MOV R6,A ;把A暂存到30H单元MOV B,#10DIV AB ;A/B=A.....BMOV 60H,AMOV 61H,BCOUNT: MOV A,R6ADD A,#2AHMOV R0,A ;按键计数INC @R0MOV A,@R0MOV B,#10DIV AB ;A/B=A.....BMOV 62H,AMOV 63H,BAG: MOV P3,#0FH ;将P3的高四位给"0"MOV A,P3 ;读P3CJNE A,#0FH,AG ;判断p3的高4位有没有变化,给A RETN: RETTABLE:DB 0EEH,0DEH,0BEH,7EH ;6-9DB 0EDH,0DDH,0BDH,7DH ;10-13DB 0EBH,0DBH,0BBH,7BH ;14-17DB 0E7H,0D7H,0B7H,77H ;18-21DB 0FFH ;空键DUAN:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;段选地址表DEL0: MOV R4,#2 ;延时1ms DEL1: MOV R5,#248NOPDEL2: DJNZ R5,DEL2DJNZ R4,DEL1RETEND。

矩阵键盘检测

矩阵键盘检测

很多盘检4*46个也就较好时,低电键按标,独立键盘多按键时就检测。

这里4键盘实现IO 口控无论是独就是检测与好检测,而,先送一列电平,若有按下,送下,然后对其盘与单片机就会浪费里以4*4现了用8控制9个按独立按键还与该键对而矩阵键盘列低电平有低电平则下一列低其编码后矩阵键盘机相连时,很多的IO 矩阵键盘个IO 口控按键,5*5还是矩阵键对应的IO 盘就需要,其余为则证明该电平,通编程扫描盘检测及,每个按键O 口,鉴于盘为例,下控制16个实现10键盘,单口是否为要人为控制高电平,该列有键按过这种方描了。

及其运用键都要占用于对IO 口下面是其与个按键,当个IO 口控片机检测为低电平。

制端口电平立即轮流按下,若无方法,我们用一个IO 口的节省,与单片机连当然也可以控制25个测的依据都独立按键平变化来检流检测一下无低电平证们便可以确O 口,当用引入矩阵连接电路以以3*3实个按键。

都是一样的键一端固定检测了。

检下各行是否证明该列没确定按键的用到阵键图:实现。

的,定比检测否有没有的坐以下是软件流程图:NYNNY N扫描四行按键程序会很长,下面我编程实现扫描出第一行按键,其他各行可用相同方法进行扫描:开始寄存器初始化IO口初始化检测是否有键按下延时10ms 检测是否真有键按下检测按键是否释放执行相应代码/*******************************************************// ////‐‐‐函数功能:扫描矩阵键盘,返回相应按键代表的值 ////‐‐‐主函数中可以利用这一返回值选择执行相关代码 ////‐‐‐这样就实现了矩阵按键对器件的操作 //// //*******************************************************/ unsigned char Matrixkeyscan(){unsigned char temp,key;P3=0xfe; //送一列低电平其余为高确定该列temp=P3; //将P3口的值读回来temp=temp&0xf0; //if(temp!=0xf0) //看是否有IO口为低电平{Delayms(10); //延时去抖temp=P3; //重新读回P3口的值temp=temp&0xf0;if(temp!=0xf0) //看是否真有键按下{temp=P3; //temp的值发生变化需重新读回switch(temp) //判断是哪一行按键被按下,确定按键位置{case 0xee:key=1;break;case 0xde:key=2;break;case 0xbe:key=3;break;case 0x7e:key=4;break;}while(temp!=0xf0)//松手检测 {temp=P3;temp=temp&0xf0;}}}//P3=0xfd; //扫描下一行//。

矩阵键盘扫描原理

矩阵键盘扫描原理

矩阵键盘扫描原理矩阵键盘是一种常见的输入设备,广泛应用于各种电子产品中,如计算机、手机、电视遥控器等。

它的原理是通过矩阵扫描技术来实现按键的检测和识别。

下面我们将详细介绍矩阵键盘的扫描原理。

首先,我们来了解一下矩阵键盘的结构。

矩阵键盘由若干行和若干列按键组成,每个按键都与一个行线和一个列线相连接。

当按下某个按键时,对应的行线和列线会发生连接,从而形成一个按键闭合的电路。

在正常情况下,行线和列线是断开的,不会导通。

为了检测按键的状态,需要通过矩阵扫描的方式来逐个检测每个按键。

扫描的原理是通过逐行逐列地扫描按键,从而确定哪些按键被按下。

具体来说,扫描的过程是这样的,首先,将所有的列线拉低,然后逐行地扫描每一行,检测每一行上的按键是否被按下。

如果某一行上有按键被按下,那么对应的列线和行线就会连接,从而形成一个闭合的电路。

通过这种方式,可以逐个检测每一个按键的状态。

在实际应用中,为了提高扫描的效率,通常会采用按键去抖技术和扫描周期的优化。

按键去抖技术是为了解决按键在按下和松开的过程中会产生抖动现象的问题,通过软件或硬件的方式来滤除抖动信号,从而确保按键状态的稳定性。

扫描周期的优化则是为了减少扫描的时间,提高系统的响应速度。

总的来说,矩阵键盘的扫描原理是通过逐行逐列地扫描按键,从而确定按键的状态。

通过合理的设计和优化,可以实现稳定、高效的按键检测和识别,从而为用户提供良好的输入体验。

总结一下,矩阵键盘扫描原理是通过逐行逐列地扫描按键,从而确定按键的状态。

通过合理的设计和优化,可以实现稳定、高效的按键检测和识别,为用户提供良好的输入体验。

希望本文能够帮助大家更好地理解矩阵键盘的工作原理。

实验三 矩阵键盘检测实验

实验三  矩阵键盘检测实验

实验三矩阵键盘识别实验
一、实验目的
掌握单片机I/O口的输入检测的方法、矩阵按键的识别方法、键盘消抖等。

学会实时程序的调试技巧。

二、实验原理
我们在手动按键的时候,由于机械抖动或是其它一些非人为的因素很有可能会造成误识别,一般手动按下一次键然后接着释放,按键两片金属膜接触的时间大约为50ms 左右,在按下瞬间到稳定的时间为5-10ms,在松开的瞬间到稳定的时间也为5-10ms,如果我们在首次检测到键被按下后延时10ms 左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。

三、实验内容
实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0到F,6个数码管同时静态显示即可。

下图中按键s6-s218条线分别联接p3口相连,p3.0~p3.3控制1~4行,p3.4~p3.7控制1~4列。

图1 实验板键盘电路原理图
四、实验步骤
1、按实验要求在Keil中创建项目,编辑、编译程序。

2、将编译生成的目标码文件(后缀为.Hex)传入实验板中。

3、在实验板上运行程序,观察实验运行结果并记录。

矩阵键盘的三种扫描方法

矩阵键盘的三种扫描方法

矩阵键盘的三种扫描方法矩阵键盘是一种常见的输入设备,它由多个按键组成,并通过矩阵扫描的方式来检测用户的按键输入。

矩阵键盘的扫描方法可以分为三种:行扫描、列扫描和交错扫描。

下面将详细介绍这三种扫描方法。

1.行扫描行扫描是最简单的一种扫描方法。

它的原理是将矩阵键盘的每一行连接到一个IO口,通过轮询检测每一行的电平变化来获取用户的按键输入。

行扫描的工作流程如下:1)将矩阵键盘的每一行连接到一个IO口,并设置为输入模式。

2)逐个地将每一行的IO口设置为高电平,并检测列的电平状态。

3)如果其中一列的电平为低电平,说明该列有按键按下。

此时,记录下这个按键的位置(行号和列号)以及按键的值(键码或字符),然后将这个按键的位置和值传递给上层应用或处理器。

4)将当前行的IO口设置为低电平,然后继续下一行的检测,重复2)~3)步骤,直到所有行都被检测完毕。

行扫描的优点是实现简单,只需要一个IO口来检测按键的状态。

但是它的缺点是扫描速度较慢,因为需要逐个地检测每一行。

2.列扫描列扫描是一种比较常用的扫描方法。

它的原理是将矩阵键盘的每一列连接到一个IO口,通过轮询检测每一列的电平变化来获取用户的按键输入。

列扫描的工作流程如下:1)将矩阵键盘的每一列连接到一个IO口,并设置为输入模式。

2)逐个地将每一列的IO口设置为高电平,并检测行的电平状态。

3)如果其中一行的电平为低电平,说明该行有按键按下。

此时,记录下这个按键的位置(行号和列号)以及按键的值(键码或字符),然后将这个按键的位置和值传递给上层应用或处理器。

4)将当前列的IO口设置为低电平,然后继续下一列的检测,重复2)~3)步骤,直到所有列都被检测完毕。

列扫描的优点是速度较快,因为只需要逐个地检测每一列。

但是它的缺点是需要多个IO口来检测按键的状态。

3.交错扫描交错扫描是一种综合了行扫描和列扫描的扫描方法,它可以有效地减少扫描的时间。

交错扫描的原理是将矩阵键盘的行和列交错地连接到多个IO口,通过并行检测行和列的电平变化来获取用户的按键输入。

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

C51矩阵键盘的检测
要求:扫描矩阵键盘,并将对应按键的值显示在LED上
方法一(传统检测):
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
//sbit key1=P3^4;
uchar code table[]={//共阳极LED数码管显示数字0~F
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan();
void display(uchar aa);
void main()
{
while(1)
{
display(keyscan());
}
}
void display(uchar aa)
{
/*先送数,后选通,延时以后,将所有端口都不选通,这样,拖影就消失了*/ dula=1;
P0=table[aa-1];
dula=0;
wela=1;
P0=0x01;
wela=0;
delay(5);
wela=1;
P0=0x00;
wela=0;
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:num=1;
break;
case0xde:num=2;
break;
case0xbe:num=3;
break;
case0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:num=5;
break;
case0xdd:num=6;
break;
case0xbd:num=7;
break;
case0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:num=9;
break;
case0xdb:num=10;
break;
case0xbb:num=11;
break;
case0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:num=13;
break;
case0xd7:num=14;
break;
case0xb7:num=15;
break;
case0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
方法二(技巧检测):
#include<reg51.h>
#include<intrins.h>
sbit dula=P2^6;
sbit wela=P2^7;
#define uint unsigned int
#define uchar unsigned char
//uchar code table[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01, 0x09};
uchar code table[]={//共阳极LED数码管显示数字0~F
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};
uchar Key_Value;
void Delay_1ms(uint x)
{
uchar i,j;
for(i=0;i<x;i++)for(j=0;j<=148;j++);
}
void Getkey()
{
uchar i,j,temp,num,Key_Temp1,Key_Temp2,Buffer[4]={0xfe,0xfd,0xfb, 0xf7};
for(j=0;j<4;j++)//循环四次
{
P3=Buffer[j];
_nop_();
_nop_();
temp=0x10;
for(i=0;i<4;i++)//循环四次
{
if(!(P3&temp))
{
num=i+j*4;//返回取得的按键值
}
temp<<=1;//换左边一位
}
}
P3=0xff;
Key_Temp1=num;//读入按键
if(Key_Temp1<16)//有键按下
{
Delay_1ms(5);//延时消抖
Key_Temp2=num;//再读一次
if(Key_Temp1==Key_Temp2)//两次相等
Key_Value=Key_Temp1;//就确认下来}
}
void Display(uchar k)
{
dula=1;
P0=table[k];
dula=0;
wela=1;
P0=0x01;
wela=0;
Delay_1ms(5);
wela=1;
P0=0x00;
wela=0;
}
void Main(void)
{
while(1)
{
Getkey();
Display(Key_Value);//显示键值
}
}。

相关文档
最新文档