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

合集下载

verilog-矩阵键盘

verilog-矩阵键盘

二、矩阵键盘显示电路设计(显示键盘值的平方)

矩阵键盘显示电路的设计

一、实验目的

1、了解普通4×4 键盘扫描的原理。

2、进一步加深七段码管显示过程的理解。

3、了解对输入/输出端口的定义方法。

二、实验原理

实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。作为一个嵌入系统设计人员,总是会关心产品成本。目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方法有助于缩减一个系统的重复开发成本,且只需要很少的CPU 开销。嵌入式控制器的功能能强,可能充分利用这一资源,这里就介绍一下软键盘的实现方案。

图10-1 简单键盘电路

通常在一个键盘中使用了一个瞬时接触开关,并且用如图10-1 所示的简单电路,微处理器可以容易地检测到闭合。当开关打开时,通过处理器的 I/O 口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的/IO口的

输入将被拉低得到逻辑0。可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的 1或者 0。尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。当触点闭合时,其弹起就像一个球。弹起效果将产生如图10-2所示的好几个脉冲。弹起的持续时间通常将维持在 5ms∼30ms 之间。如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。

图10-2 按键抖动

键盘上阵列这些开关最有效的方法(当需要5个以上的键时)就形成了一个如图10-3 所示的二维矩阵。当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O 端被连接的时候),一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。

verilog矩阵键盘

verilog矩阵键盘

二、矩阵键盘显示电路设计(显示键盘值的平方)

矩阵键盘显示电路的设计

一、实验目的

1、了解普通4×4 键盘扫描的原理。

2、进一步加深七段码管显示过程的理解。

3、了解对输入/输出端口的定义方法。

二、实验原理

实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。作为一个嵌入系统设计人员,总是会关心产品成本。目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方法有助于缩减一个系统的重复开发成本,且只需要很少的 CPU 开销。嵌入式控制器的功能能强,可能充分利用这一资源,这里就介绍一下软键盘的实现方案。

图10-1 简单键盘电路

通常在一个键盘中使用了一个瞬时接触开关,并且用如图 10-1 所示的简单电路,微处理器可以容易地检测到闭合。当开关打开时,通过处理器的I/O 口的一个上拉电阻提供逻辑 1;当开关闭合时,处理器的/IO口的

输入将被拉低得到逻辑 0。可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1或者0。尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。当触点闭合时,其弹起就像一个球。弹起效果将产生如图10-2所示的好几个脉冲。弹起的持续时间通常将维持在5ms∼30ms 之间。如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。

图10-2 按键抖动

键盘上阵列这些开关最有效的方法(当需要5个以上的键时)就形成了一个如图 10-3 所示的二维矩阵。当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O 端被连接的时候),一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。

矩阵式键盘扫描原理

矩阵式键盘扫描原理

矩阵式键盘扫描原理

矩阵式键盘是我们日常生活中经常接触到的一种输入设备,它广泛应用于计算机、手机、电视遥控器等各种电子产品中。那么,矩阵式键盘是如何实现按键扫描的呢?接下来,我们将深入探讨矩阵式键盘的扫描原理。

矩阵式键盘通常由若干行和若干列的按键组成。当用户按下某个按键时,按键

所在的行和列会产生连接,从而形成一个电路。为了检测用户按下的是哪个按键,系统需要对矩阵式键盘进行扫描。

首先,系统会将所有的列设置为输入状态,而所有的行设置为输出状态。接着,系统会逐一地将每一行的状态设置为高电平,然后读取所有的列的状态。如果某一列的状态为低电平,那么说明用户按下了与该列相对应的按键。通过这种方式,系统可以确定用户按下的是哪个按键。

在实际应用中,为了提高扫描的效率,系统会采用一种称为“轮询”的方法。

轮询是指系统会以一定的时间间隔不断地重复上述的扫描过程,从而实时地检测用户的按键操作。这样一来,即使用户按下按键的时间很短暂,系统也能够准确地捕捉到按键信息。

除了轮询方法,还有一种更高效的扫描方式,即采用中断的方式。在这种方式下,系统会通过硬件中断或者定时器中断来实现按键的扫描。当用户按下按键时,会触发相应的中断,系统会立即停止当前的任务,转而处理按键事件,从而提高了对按键的响应速度。

总的来说,矩阵式键盘的扫描原理是通过设置行和列的输入输出状态,逐一扫

描每一行的状态,并读取所有列的状态,从而确定用户按下的是哪个按键。在实际应用中,系统会采用轮询或中断的方式来实现对按键的实时检测和响应。

通过对矩阵式键盘扫描原理的深入了解,我们不仅能够更好地理解矩阵式键盘的工作原理,还能够为我们设计和开发新的输入设备提供一定的参考和启发。希望本文能够对大家有所帮助,谢谢阅读!

矩阵键盘

矩阵键盘

FPGA学习心得——矩阵键盘

1、行列式键盘概述

为了减少键盘与单片机接口时所占用I/O口线的数目,在键数较多时,通常都将键盘排列成行列矩阵式,行列式键盘又叫矩阵式键盘。用带有I/O口的线组成行列结构,按键设置在行列的交点上。例如用2*2的行列结构可以构成4个键的键盘,4*4的行列结构可以构成有16个键的键盘。这样,当按键数量平方增长时,I/O口线只是线性增长,这样就可以节省I/O口线。

2、行列式键盘原理

教研室已有薄膜矩阵键盘,其实物图如图所示。

其电路原理图如下图所示。

由行列式键盘的原理可以知道,要正确地完成按键输入工作必须有按键扫描电路产生keydrv3~keydrv0信号。同时还必须有按键译码电路从keydrv3~keydrv0信号和keyin3~keyin0信号中译码出按键的键值。此外,一般还需要一个按键发生标志信号用于和其他模块接口,通知其它模块键盘上有按键动作发生,并可以从键盘模块中读取按键键值。由于各个模块需要的时钟频率是不一样的,因此时钟产生模块就是用于产生各个模块需要的时钟信号。因此得到键盘接口电路的结构如图2所示。

图2 键盘接口电路结构图

行列式键盘电路的FPGA实现主要解决三个问题,一是如何检测是否有按键按下并防止采集到干扰信号;二是在按键闭合时如何防止抖动;三是如何判断为哪一个按键位动作,并对其进行译码。因此,为了解决这些问题,程序中使用不同的进程分别实现键盘扫描信号的产生、键盘去抖以及键盘的译码。

3、源程序

[plain]view plaincopy

1.----------------------------------------------------------------------------

4X4矩阵键盘及显示电路设计

4X4矩阵键盘及显示电路设计

4X4矩阵键盘与显示电路设计

FPGA在数字系统设计中的广泛应用,影响到了生产生活的各个方面。在FPGA 的设计开发中,VHDL语言作为一种主流的硬件描述语言,具有设计效率高,可靠性好,易读易懂等诸多优点。作为一种功能强大的FPGA数字系统开发环境,Altera公司推出的Quar-tUSⅡ,为设计者提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程,为使用VHDL语言进行FPGA设计提供了极大的便利。矩阵键盘作为一种常用的数据输入设备,在各种电子设备上有着广泛的应用,通过7段数码管将按键数值进行显示也是一种常用的数据显示方式。在设计机械式矩阵键盘控制电路时,按键防抖和按键数据的译码显示是两个重要方面。本文在QuartusⅡ开发环境下,采用VHDL语言设计了一种按键防抖并能连续记录并显示8次按键数值的矩阵键盘与显示电路。

一、矩阵键盘与显示电路设计思路

矩阵键盘与显示电路能够将机械式4×4矩阵键盘的按键值依次显示到8个7段数码管上,每次新的按键值显示在最右端的第O号数码管上,原有第0~6号数码管显示的数值整体左移到第1~7号数码管上显示,见图1。总体而言,矩阵键盘与显示电路的设计可分为4个局部:

(1)矩阵键盘的行与列的扫描控制和译码。该设计所使用的键盘是通过将列扫描信号作为输入信号,控制行扫描信号输出,然后根据行与列的扫描结果进行译码。

(2)机械式按键的防抖设计。由于机械式按键在按下和弹起的过程中均有5~10 ms的信号抖动时间,在信号抖动时间内无法有效判断按键值,因此按键的防抖设计是非常关键的,也是该设计的一个重点。

FPGA综合设计实例

FPGA综合设计实例

• architecture bb of code_tran is
• begin
• process(clk)
• begin

if(clk'event and clk='1')then

if key_valid='1' then

case scan_cnt is 精选课件
9
• when"0000"=>butt_code<="0001";--1 • when"0001"=>butt_code<="0010";--2 • when"0010"=>butt_code<="0011";--3 • when"0011"=>butt_code<="1100";--c • when"0100"=>butt_code<="0100";--4 • when"0101"=>butt_code<="0101";--5 • when"0110"=>butt_code<="0110";--6 • when"0111"=>butt_code<="1101";--d • when"1000"=>butt_code<="0111";--7 • when"1001"=>butt_code<="1000";--8 • when"1010"=>butt_code<="1001";--9 • when"1011"=>butt_code<="1110";--e • when"1100"=>butt_code<="1010";--a • when"1101"=>butt_code<="0000";--0 • when"1110"=>butt_code<="1011";--b • when others =>butt_code<="1111";--f • end case; • end if; end if; • end process;end ;

矩阵键盘扫描原理

矩阵键盘扫描原理

矩阵键盘扫描原理

矩阵键盘扫描原理是通过利用一组电路、芯片和管脚以及电源,对一个或多个矩阵键盘进行扫描。该原理的实现原理如下:

1、先分别将电路、芯片和管脚等连接到每一行和每一列,然后将电源连接到这样的结构;

2、接着,从键盘的第一行开始,将一个低电压电位分别接入行线,按顺序扫描每一行,当检测到开关按下时,则表明该行对应某个按键被按下;

3、接下来,从键盘的第一列开始,再把一个低电压电位接入列线,然后从第一行开始,再次扫描整个键盘,当检测到上一步中按下的按键也在此行时,则表明该按键已被正确检测;

4、当所有的按键都被按下时,则完成矩阵键盘的扫描,然后通过芯片最终将按键信息传送出去。

矩阵键盘扫描原理是一个简单、高效的扫描方式,它不但可以实现键盘按键的快速检测,还可以提高系统的效率。

矩阵键盘的三种扫描方法

矩阵键盘的三种扫描方法

矩阵键盘的三种扫描方法

矩阵键盘是一种常见的输入设备,它由多个按键组成,并通过矩阵扫

描的方式来检测用户的按键输入。矩阵键盘的扫描方法可以分为三种:行

扫描、列扫描和交错扫描。下面将详细介绍这三种扫描方法。

1.行扫描

行扫描是最简单的一种扫描方法。它的原理是将矩阵键盘的每一行连

接到一个IO口,通过轮询检测每一行的电平变化来获取用户的按键输入。行扫描的工作流程如下:

1)将矩阵键盘的每一行连接到一个IO口,并设置为输入模式。

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

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

下这个按键的位置(行号和列号)以及按键的值(键码或字符),然后将

这个按键的位置和值传递给上层应用或处理器。

4)将当前行的IO口设置为低电平,然后继续下一行的检测,重复

2)~3)步骤,直到所有行都被检测完毕。

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

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

2.列扫描

列扫描是一种比较常用的扫描方法。它的原理是将矩阵键盘的每一列

连接到一个IO口,通过轮询检测每一列的电平变化来获取用户的按键输入。列扫描的工作流程如下:

1)将矩阵键盘的每一列连接到一个IO口,并设置为输入模式。

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

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

下这个按键的位置(行号和列号)以及按键的值(键码或字符),然后将

这个按键的位置和值传递给上层应用或处理器。

4x4矩阵键盘扫描原理

4x4矩阵键盘扫描原理

4x4矩阵键盘扫描原理

4x4矩阵键盘扫描原理是一种常用的键盘扫描方法,也称为矩阵键盘扫描。它可以将多个按键连接在一起并使用较少的引脚来检测按键的状态。

4x4矩阵键盘由4行和4列组成,共有16个按键。通常使用单片机或电路来进行扫描,以下是简要的原理:

1. 行扫描:首先,将行引脚设置为输出,同时将列引脚设置为输入,并将其上拉或下拉。所有行引脚中只有一个为低电平,其余为高电平。然后逐行检测按键状态。

2. 列检测:对于每一行,将对应的行引脚置为低电平后,检测列引脚的电平状态。如果有按键按下,则相应的列引脚会变为低电平。通过读取列引脚的状态,可以确定按键的位置。

3. 组合键:由于只能一次检测一行,因此当同时按下多个按键时,可能会导致误检。为了解决这个问题,可以在检测到按键按下时,延迟一段时间,并再次检测按键的状态。如果在第二次检测时仍然检测到按键按下,则确认按键有效。

4. 反向扫描:为了检测按键的释放状态,可以将行引脚设置为输入,列引脚设置为输出,并将其置为低电平。然后逐列检测行引脚的电平状态,如果有按键释放,则相应的行引脚会变为高电平。

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

经典的矩阵键盘扫描程序

经典的矩阵键盘扫描程序

经典的矩阵键盘扫描程序

矩阵键盘是一种常见的输入设备,广泛应用于电子产品中。为了实现对矩阵键盘的扫描和输入响应,需要编写一个矩阵键盘扫描程序。本文将详细介绍如何编写一个经典的矩阵键盘扫描程序。

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'}

史上最详细矩阵键盘原理

史上最详细矩阵键盘原理

1
P1.3
1
1
0
1
1
P1.2
case(0X0d): KeyValue=2;break;
1
0
1
1
1
P1.1
0
1
1
1
1
P1.0
case(0X0e): KeyValue=3;break;
按键 0 按下 0X0e
按键 0 按下 0X0d
按键 1 按下 0X0b
按键 0 按下 0X07
无按值按下 0X0F
}
GPIO_KEY=0XF0; //接下来赋值给 P1,检测行,赋初值给 P1。由上图可知,P1.4-P1.7 为行//
}
}
#include "reg52.h"
//此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义,最值范围 0-65535// typedef unsigned char u8; //对数据类型进行声明定义,最值范围 0-255// #define GPIO_DIG P0 //定义 P0 口// #define GPIO_KEY P1 //定义 P1 口//
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;

矩阵式键盘扫描原理

矩阵式键盘扫描原理

矩阵式键盘扫描原理

矩阵式键盘扫描原理

将键值显示在七节显示器上的单片机源码。把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,比对之后就可知道是哪个键被按下。

比如说扫描码送入01111111,前面的0111是代表扫描第一行P1.0列,而后面的1111是让读取的4行接脚先设为VDD,若第一行的第三列按键被按下,那读取的结果就会变成01111101(注意1111变成1101),其中LSB的第三个bit会由1变成0,这是因为这个按键被按下之后,会被垂直的扫描码电位short,而把读取的LSB的bit电位拉到0,此即为扫描原理。

由于这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,为了避免让8051误判为多次输入同一按键,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。

矩阵键盘程序设计

矩阵键盘程序设计

矩阵键盘程序设计

1. 引言

矩阵键盘是一种常见的输入设备,广泛应用于电脑、方式等各种电子设备中。将介绍如何设计一个简单的矩阵键盘程序。

2. 程序设计思路

矩阵键盘由多个按键组成,每个按键对应一个特定的字符或功能。通常情况下,矩阵键盘是通过行列扫描的方式来检测按键的状态,即通过扫描每行和每列的电平来判断是否有按键被按下。

要设计一个矩阵键盘程序,需要确定矩阵键盘的行列数,然后通过相应的硬件电路将其连接到控制器上。接下来,程序需要循环扫描每行和每列的电平,并记录下按下的按键。根据按键的状态来执行相应的操作,输出对应的字符或执行特定的功能。

3. 硬件设计

硬件设计主要包括确定矩阵键盘的行列数以及将其连接到控制器上的电路设计。通常情况下,矩阵键盘的行使用输出电平,列使用输入电平。在连接到控制器之前,还需要添加电阻和二极管来保护电路和消除反馈。

4. 软件设计

软件设计主要包括程序的循环扫描和按键状态的处理。可以使用循环来不断扫描每行和每列的电平,当检测到按键被按下时,记录下按键的位置信息。接下来,根据按键的状态,进行相应的处理操作,输出对应的字符或执行特定的功能。程序还需要处理按键的反弹,以避免误操作。

5. 示例代码

以下是一个简单的矩阵键盘程序设计的示例代码,采用C语言编写:

c

include <stdio.h>

include <stdbool.h>

// 定义矩阵键盘的行列数

define ROWS 4

define COLS 4

// 定义矩阵键盘的字符映射表

char keys[ROWS][COLS] = {

基于VHDL的矩阵键盘及显示电路设计

基于VHDL的矩阵键盘及显示电路设计

基于VHDL的矩阵键盘及显示电路设计

FPGA/CPLD 在数字系统设计中的广泛应用,影响到了生产生活的各个方面。在FPGA/CPLD 的设计开发中,VHDL 语言作为一种主流的硬件描述语言,具有设计效率高,可靠性好,易读易懂等诸多优点。作为一种功能强大的FPGA/CPLD 数字系统开发环境,Altera 公司推出的Quar-tUSⅡ,为设计者提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程,为使用VHDL 语言进行FPGA/-CPLD 设计提供了极大的便利。矩阵键盘作为一种常用的数据输入设备,在各种电子设备上有着广泛的应用,通过7 段数码管将按键数值进行显示也是一种常用的数据显示方式。在设计机械式矩阵键盘控制电路时,按键防抖和按键数据的译码显示是两个重要方面。本文在QuartusⅡ开发环境下,采用VHDL 语言设计了一种按键防抖并能

连续记录并显示8 次按键数值的矩阵键盘及显示电路。1 矩阵键盘及显示电路设计思路矩阵键盘及显示电路能够将机械式4 乘以4 矩阵键盘的按键值依次显示到8 个7 段数码管上,每次新的按键值显示在最右端的第O 号数码管上,原有第0~6 号数码管显示的数值整体左移到第1~7 号数码管上显示,见图1。总体而言,矩阵键盘及显示电路的设计可分为4 个部分:(1)矩阵键盘的行及列的扫描控制和译码。该设计所使用的键盘是通过将列扫描信号作为输入信号,控制行扫描信号输出,然后根据行及列的扫描结果进行译码。(2)机械式按键的防抖设计。由于机械式按键在按下和弹起的过程中均有5~10 ms 的信号抖动时间,在信号抖动时间内无法有效判断按键值,因此按键的防抖设计是非常关键的,也是该设计的一个重点。(3)按键数值的移位寄存。由于该设计需要在8 个数码管上依次显示前后共8 次按键的数值,因此对已有数据的存储和调用也是该设计的重点所在。(4)数码管的扫描和译码显示。由于该设计使用

经典的矩阵键盘扫描程序

经典的矩阵键盘扫描程序

键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。

4*4矩阵键盘的结构如图1

(实物参考见万用板矩阵键盘制作技巧)。

在本例中,矩阵键盘的四列依次接到单片机的P1.0~P1.3,四行依次接到单片机的

P1.4~P1.7;同时,将列线上拉,通过10K电阻接电源。

查找哪个按键被按下的方法为:一个一个地查找。

先第一行输出0,检查列线是否非全高;

否则第二行输出0,检查列线是否非全高;

否则第三行输出0,检查列线是否非全高;

如果某行输出0时,查到列线非全高,则该行有按键按下;

根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。

下面是具体程序:

1 / 2

void Check_Key(void)

{

unsigned char row,col,tmp1,tmp2;

tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0

for(row=0;row<4;row++) // 行检测

{

P1 = 0x0f; // 先将p1.4~P1.7置高

P1 =~tmp1; // 使P1.4~p1.7中有一个为0

tmp1*=2; // tmp1左移一位

if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测

{

tmp2 = 0x01; // tmp2用于检测出哪一列为0

矩阵键盘扫描原理

矩阵键盘扫描原理

矩阵键盘扫描原理

矩阵键盘是由多个按键组成的矩阵状排列的结构。一般来说,矩阵键

盘包含若干行和若干列的按键。每个按键都有一个唯一的行列位置,行和

列之间的交叉点称为键盘矩阵。键盘矩阵中的每个按键都有一个数字或字

符与之对应,这个对应关系通常是由键盘的硬件设计确定的。

在矩阵键盘中,按下按键会导致连接到该按键所在行和列的电信号发

生变化。这些变化可以通过电流或电压的改变来表示。矩阵键盘扫描的原

理就是通过检测这些电信号的变化来确定用户按下了哪个按键。

在按键检测阶段,通过扫描矩阵键盘的每一行和每一列,将每个按键

的行和列连接到输入/输出端口(通常是微控制器或计算机)。通过对每

一行依次设置为高电平,然后读取每一列的电平状态,可以检测到按下的

按键。

例如,假设我们要检测第一行的按键状态,我们将第一行设置为高电平,然后读取每一列的电平状态。如果一些按键按下了,那么在对应列的

输入/输出端口上会读取到低电平信号。通过依次扫描每一行和每一列,

可以确定用户按下了哪个按键。

在按键解码阶段,我们将检测到的按键行列位置与事先设定的按键值

进行对比,以确定用户按下的是哪个键。

例如,如果我们检测到第一行第二列的按键被按下了,与之对应的按

键值是数字“2”。在解码阶段,我们将按键行列位置与按键值进行对比,从而确定用户按下了数字“2”。

需要注意的是,由于矩阵键盘的按键数量有限,不同的按键可能会共用同一行或同一列。这就需要在解码阶段进行额外处理,以区分这些共用行或列上的按键。

总结起来,矩阵键盘扫描的原理是通过扫描每一行和每一列的电信号变化来检测用户按键,并通过解码将按键的行列位置与按键值进行对比,从而确定用户按下的是哪个键。这种原理简单而高效,被广泛应用于各种输入设备中。

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

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

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

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

如上图所示,矩阵键盘的某一个按钮按下会使对应的一条行线和列线导通,为了便于分析扫描过程做如下简化:

3.3v Row0

Row1 Row2

Row3 Col 0 Col 1 Col 2 Col 3

Row0

Row1

Row2

Row3

Col 0 Col 1 Col 2 Col 3

3 5 A E D C 2 B 9 8 F

4 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的电平状态不断循环。假设上一状态确定按键处于row0行,那么随着扫描的进行,行线输入的变化规律如下表:

1000 0100 0010 0001 1000 0100 0010 0001 1000 0100 0010 0001 扫描

Row0 1 0 0 0 1 0 0 0 1 0 0 0

Row1 1 1 1 1 1 1 1 1 1 1 1 1

Row2 1 1 1 1 1 1 1 1 1 1 1 1

Row3 1 1 1 1 1 1 1 1 1 1 1 1

观察上表可以发现,在row0是1的时候与之对应的扫描码可以体现出按键所在列。

一个随之而来的设计思路是在第一状态确定按键所在行,然后在第二状态捕捉特定行是高电平的时候所对应的扫描码。

但是这里有一个不可避免的实际问题,那就是机械键盘的抖动!这种抖动主要体现在两个方面:第一,我们手指按某个键的时候可能由于接触面积大无意中碰到周围的键。第二,在按着一个键的时候由于力度不均或者接触不良,行线和列线并不能时刻保持接通的状态。下图来自网络上,描述的是单片机的机械键盘,借用一下。

如何避免抖动的影响才是矩阵键盘设计的难点。 由于抖动的存在,我们在第一状态下只能确定有键按下了,并不确定是哪一行的键被按下了。所以第一状态的任务是判断是否有键按下,如果有就进入第二状态,如果没有,就从第二状态回到第一状态。

第二状态开始输出扫描码给键盘的列,同时从键盘的行收集行线的电平状态作为输入。然后根据行线输入和扫描码判断按键位置。

还要有一个消抖模块,消除抖动影响的原理就是抖动时间都很短,例如在0.5秒内循环扫描了200次,其中150次扫描结果都显示按键6被按下了,32次显示按键5被按下了,18次显示按键2被按下了。那么就可以确定按键是6,并且按键的人力度偏向于右上方。如果抖动时间是10ms 的话,我们设定扫描结果中某个按键连续出现了16ms 以上的时间,则该按键有效,小于16ms 的按键都视为抖动被“过滤”掉。

在总体架构的设计中,根据行线输入和扫描码判断按键位置的功能可以独立作为一个模块。先用组合逻辑试试。输出是4位的二进制数,从0到F 代表按键位置的编号,如图二矩阵键盘简化示意图所示。

其中en 是使能信号,en 为高电平时模块开始判断按键位置。

由行线输入和扫描码判断按键位置的具体原理是什么呢?还是要分别确定行和列。首先看行线输入,如果是0111 。就确定是第一行。如果是0100就确定是第二行……如果是1111,就捕捉对应的扫描码。将行与扫描码对应就得到按键位置。

在没有键按下的时候列线电平状态是{col 0,col 1,col 2,col}=0000 。一旦有键按下立即输出列线扫描码key_col_scan 和始能信号给key_position 模块,没有键按下就回到{col 0,col 1,col 2,col}=0000的状态同时把en 拉低。此功能可独立作为一个模块。前面分析可知,只要key_row_in 不是4’b1111就是有键按下了。扫描码的频率取多少合适呢?夏老师的参考代码中扫描码的变换速度是1ms 一次。一秒钟循环扫描250次。还需要写一个分频模块了。

Key_position

en Key_row_in Key_col_scan Key_position Key_judge Key_row_in Clk Rst en Key_col_scan

分频模块:

系统时钟依然是50MHZ 。clk_period=20ns clk_divide_period=1ms; 1ms=106ns=5x104clk_period

由写数码管驱动时的分析可知,Binary[n]每隔十进制数值加2n+1循环一次。而且0和1各占半个周期。216=65536,215=32768 。取n+1=15,用binary[14]来分频。

通过分频模块,key_position 模块,key_judge 模块可以得到按键的位置信息。有键按下时1ms 得到一个按键位置。相同的按键位置持续20ms 以上才算有效。可以用状态机实现这种判断。接下来的问题是一个有效按键持续的时间需要被记录么?比如某些手机上有长按某键开关机的功能,那就是记录了按键的时长。还有某些计算器上持续按一个键一段时间屏幕上会显示一串字符,那一定是不管按键是否抬起,只要持续一定时长就算一次按键。

由此看来,为了实现更多功能,我们有必要记录按键时长。方法就是设置一个计数器,在en 为高的状态下相同按键持续20ms 算一次有效,计数器加一。计数器所记录的就是按键有效了多少次。当en 为低的时候说明按键被松开了,计数器清零。 把按键有效位置和有效次数都作为驱动程序的输出,至于数码管如何显示就要看实际的需求了。

下一个问题是16ms 算一次有效只需要写一个16状态的状态机。如果遇到200,2000ms 有效的情况呢?一个思路是继续分频,加大判断的时间间隔。但这并不是好方法。听李老师说可以用generate 写数量大的状态机。

下面是总体架构:

Clk rst

en Key_position Key_valid_position Valid_counter Filter_shake

Divide

clk Rst_n Clk_divide Key_judge Key_row _in

Clk Rst

en Key_col _scan Clk rst en Key_posit

ion

Key_valid_positi on

Valid_cou nter Filter_sha

ke

Key_position en Key_row_i Key_col_sc an Key_positio

相关文档
最新文档