基于CPLD的矩阵键盘扫描模块设计
- 格式:doc
- 大小:826.50 KB
- 文档页数:16
矩阵键盘电路设计矩阵键盘是一种常见的输入设备,它通过矩阵布局的按键组成,可以方便地输入数字、字母和其他符号。
在电子设备中,矩阵键盘通常采用扫描电路进行输入和控制。
在本文中,将探讨矩阵键盘电路的设计。
首先,我们需要确定矩阵键盘的布局。
一般情况下,矩阵键盘采用4×4或者3×4的布局。
每个按键都是一个开关,当按下时闭合,松开时断开。
接下来,我们需要设计输入电路。
输入电路通过扫描矩阵键盘的每一行和每一列来检测按键的状态。
为了实现这个功能,我们可以使用两个二进制计数器来控制扫描的行和列。
每当计数器增加时,就对应地扫描一行或者一列。
我们可以通过多路复用器和反向器将计数器输出与矩阵键盘的行和列相连。
当计数器的输出与矩阵键盘的行和列相连后,我们可以通过逐行或逐列地扫描矩阵键盘并检测按键的状态。
如果有按键按下,我们可以将对应的按键编码为数字信号。
在设计输入电路时,我们还需要考虑按键去抖动的问题。
按键去抖动是指当按键被按下或松开时,会产生多次开关闭合的现象。
为了解决这个问题,我们可以使用一个滤波器电路来消除按键的抖动。
滤波器电路可以采用RC滤波器或者Schmitt触发器等。
设计好输入电路后,接下来需要设计控制电路。
控制电路负责扫描矩阵键盘的每一行和每一列,以及对按键的状态进行控制。
我们可以使用计时器和计数器来控制扫描的速度和顺序。
当检测到按键按下时,控制电路会将对应的按键编码为数字信号并传递给接收端。
此外,在设计控制电路时,我们还需要考虑矩阵键盘的多键同时按下的问题。
当多个按键同时按下时,我们需要使用矩阵解码器来对这些按键进行解码,并将解码结果传递给接收端。
在进行电路设计时,我们还需要考虑一些其他的因素,比如布线、电源供应和接收端的设计等。
布线是指将电路中的各个元件和连接线布置在PCB板上的过程。
在布线时,我们需要确保信号传输的可靠性和稳定性。
电源供应是指提供电路所需的电源电压和电流的过程。
接收端的设计是指接收和处理从矩阵键盘电路传递过来的数字信号的过程。
Verilog实现4x4矩阵按键检测1 原理图4x4的矩阵按键,8个IO,检测原理是IO63、66、67、68作为输出信号,轮流赋值高电平,IO59、60、61、62作为输入信号,检测对应的按键按下。
比如,在IO68赋值高电平时,检测到IO59信号为高电平,则表示按键K1被按下。
拨码开关用于测试。
2 CPLD代码module key_array (clk_24m,reset_n,Hline, //输出4bit按键赋高电平信号。
Vline, //输入4bit按键检测信号。
ledline, //测试使用LED点灯信号switch //测试使用按键表现选择信号,因只有8个LED,而按键有16个,通过此信号来选择是表现K1-K8,还是K9-K16。
);input wire clk_24m;input wire reset_n;output wire [3:0] Hline;input wire [3:0] Vline;output reg [7:0] ledline;input wire switch;/****************************************************************************** 24M时钟分频,用于内部控制及计数等。
******************************************************************************/ reg [14:0] count_div1;wire condition_732; //732 Hz时钟信号。
always @ (posedge clk_24m or negedge reset_n)beginif(reset_n == 1'b0)count_div1 <= 15'h0000;elsecount_div1 <= count_div1 + 15'h0001;end/****************************************************************************** condition_732:732Hz时钟信号,高电平持续一个24MHz时钟周期,其余时间为低电平。
使用可编程逻辑器件实现矩阵键盘扫描模块的设计给出了CPLD 部分模块的VHDL 语言实现和仿真波形。
在矩阵键盘的扫描、编码、输出完全不需CPU 控制的前提下,实现标准键盘和矩阵键盘双键盘同时使用。
在基于PC104 的便携式野外测试设备的设计中,键盘是常用的输入设备。
对于便携式设备野外工作时,一般使用小型(4×4)矩阵键盘就能满足设备的信息输入需要;室内调试时,使用标准PS2 键盘更方便、灵活。
一般的做法是保留PC104 的键盘接口用于接标准键盘,利用扩展I/O接口完成小矩阵键盘的扫描和输入。
这样做虽然可以实现设备双键盘同时工作的功能,却需耗费大量的CPU 处理时间扫描矩阵键盘,造成CPU 处理其他信息的能力下降。
而本文设计的基于CPLD 的矩阵键盘扫描模块能够很好地解决上述问题。
1 矩阵键盘扫描原理图1 给出了4×4 矩阵键盘的电路图,在图1 中KX[3..0]为扫描码输入,KY[3..0]为扫描码输出。
键盘扫描开始时,首先置KX[3..0]=“0000”;键盘扫描码寄存器和键盘扫描码缓存器Kreg[15..0]和Kscan[15..0]置成“1111111111111111”(全1为没有键按下,有键按下时至少有一位为0),一旦有键按下,KY[3..0]输出不全为“0”的扫描码触发键盘扫描功能开始键盘扫描,扫描开始后,依次将KX3、KX2、KX1、KX0 置“0”,分别将对应的4 组KY[3..0]输入值保存于Kscan[15..12]、Kscan[11..8] 、Kscan[7..4] 、Kscan[3..0]中,而后比较Kscan 和Kreg 的大小,如果Kscan 小于Kreg,将Kscan 保存于Kreg 中,重复上述扫描过程直到Kscan[15..0]各位输出全为“1”时,说明按下的键全部抬起,Kreg[15..0]中的每一个为“0”的位对应一个按下的键,保留扫描过程中的Kreg 最小值就可以处理组合键。
矩阵键盘程序设计1. 引言矩阵键盘是一种常见的输入设备,广泛应用于电脑、方式等各种电子设备中。
将介绍如何设计一个简单的矩阵键盘程序。
2. 程序设计思路矩阵键盘由多个按键组成,每个按键对应一个特定的字符或功能。
通常情况下,矩阵键盘是通过行列扫描的方式来检测按键的状态,即通过扫描每行和每列的电平来判断是否有按键被按下。
要设计一个矩阵键盘程序,需要确定矩阵键盘的行列数,然后通过相应的硬件电路将其连接到控制器上。
接下来,程序需要循环扫描每行和每列的电平,并记录下按下的按键。
根据按键的状态来执行相应的操作,输出对应的字符或执行特定的功能。
3. 硬件设计硬件设计主要包括确定矩阵键盘的行列数以及将其连接到控制器上的电路设计。
通常情况下,矩阵键盘的行使用输出电平,列使用输入电平。
在连接到控制器之前,还需要添加电阻和二极管来保护电路和消除反馈。
4. 软件设计软件设计主要包括程序的循环扫描和按键状态的处理。
可以使用循环来不断扫描每行和每列的电平,当检测到按键被按下时,记录下按键的位置信息。
接下来,根据按键的状态,进行相应的处理操作,输出对应的字符或执行特定的功能。
程序还需要处理按键的反弹,以避免误操作。
5. 示例代码以下是一个简单的矩阵键盘程序设计的示例代码,采用C语言编写:cinclude <stdio.h>include <stdbool.h>// 定义矩阵键盘的行列数define ROWS 4define COLS 4// 定义矩阵键盘的字符映射表char keys[ROWS][COLS] = {{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'', '0', '', 'D'}};// 定义矩阵键盘状态数组bool keyState[ROWS][COLS] = {0};// 矩阵键盘扫描函数void scanKeyboard() {// 扫描行for (int row = 0; row < ROWS; row++) {// 将当前行的输出电平设置为低电平setRowLow(row);// 扫描列for (int col = 0; col < COLS; col++) {// 检测当前列的输入电平if (getColLevel(col)) {// 当检测到按键被按下时,更新按键状态 keyState[row][col] = true;} else {// 当检测到按键未按下时,更新按键状态 keyState[row][col] = false;}}// 将当前行的输出电平恢复为高电平setRowHigh(row);}}int mn() {while (1) {// 扫描矩阵键盘scanKeyboard();// 处理按键状态for (int row = 0; row < ROWS; row++) {for (int col = 0; col < COLS; col++) {// 检测到按键被按下时,输出对应的字符if (keyState[row][col]) { printf(\。
单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。
(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
操作方完成矩阵式键盘实验。
具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。
完成思考题。
三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。
来源:21IC-应用发布时间:2010-12-21 10:26 评论:0条阅读:304次发给好友在基于PC104的便携式野外测试设备的设计中,键盘是常用的输入设备。
对于便携式设备野外工作时,一般使用小型(4x4)矩阵键盘就能满足设备的信息输入需要;室内调试时,使用标准PS2键盘更方便、灵活。
一般的做法是保留PC104的键盘接口用于接标准键盘,利用扩展I/O接口完成小矩阵键盘的扫描和输入。
这样做虽然可以实现设备双键盘同时工作的功能,却需耗费大量的CPU处理时间扫描矩阵键盘,造成CPU处理其他信息的能力下降。
而本文设计的基于CPLD的矩阵键盘扫描模块能够很好地解决上述问题。
1 矩阵键盘扫描原理图1给出了4x4矩阵键盘的电路图,在图1中KX[3..0]为扫描码输入,KY[3..0]为扫描码输出。
键盘扫描开始时,首先置KX[3..0]=“0000”;键盘扫描码寄存器和键盘扫描码缓存器Kreg[15..0]和Kscan[15..0]置成“1111111111111111”(全1为没有键按下,有键按下时至少有一位为O),一旦有键按下,KY[3..0]输出不全为“O”的扫描码触发键盘扫描功能开始键盘扫描,扫描开始后,依次将KX3、KX2、KX1、KX0置“0”,分别将对应的4组KY[3..0]输入值保存于Kscan[15..12]、Kscan[11..8]、Kscan[7..4]、Kscan[3..0]中,而后比较Kscan和Kreg的大小,如果Kscan小于Kreg,将Kscan保存于Kreg中,重复上述扫描过程直到Kscan[15..0]各位输出全为“1”时,说明按下的键全部抬起,Kreg[15..0]中的每一个为“0”的位对应一个按下的键,保留扫描过程中的Kreg最小值就可以处理组合键。
根据记录的Kreg值可以判断是哪个或哪几个键按下,据此编码按键值后输出。
将KX[3..0]置为“0000”,等待下一次按键发生。
一种矩阵键盘的电路控制模块的制作方法
矩阵键盘的电路控制模块是一种常用的输入设备,可用于电子产品中,如计算机、手机和家电等。
本文将介绍一种制作矩阵键盘的电路控制模块的方法。
制作矩阵键盘的电路控制模块需要以下材料和工具:矩阵键盘、电路板、导线、焊锡、焊接工具和测试仪器。
首先,将矩阵键盘的引脚与电路板上的连接点对应起来。
矩阵键盘通常有多行
多列的引脚,根据键盘规格和需要的按键数量,确定连接方式。
接下来,使用导线将键盘的引脚与电路板上的连接点焊接在一起。
确保焊接牢固且接触良好。
然后,根据需要的按键数量,确定矩阵键盘的排列方式。
将键盘按键的行列进
行编码,并在电路板上绘制相应的电路连接。
使用导线将键盘按键与电路板上的相应行列连接点焊接在一起。
确保每个按键的连接都正确无误。
接着,进行焊接和连接点的检查。
检查焊接是否牢固,连接是否正确。
可以使
用测试仪器来检测按键和电路的连通性。
确保每个按键在按下时都能正确地触发相应的行列连接点。
最后,进行电路模块的调试和封装。
连接模块到相应的电子产品,测试按键是
否正常工作。
对于需要外部接口的电子产品,可以设计相应的信号转换电路,以适配键盘和电子产品的接口。
最终,将模块进行固定封装,以保护电路和提高外观。
上述是一种矩阵键盘的电路控制模块制作方法。
通过对键盘引脚的连接、焊接
和排列,以及对电路的调试和封装,可以制作出功能稳定、可靠性高的矩阵键盘电路控制模块。
这一模块在各种电子产品中得到广泛应用,并为用户提供更加便捷的输入方式。
《工业控制计算机》2018年第31卷第7期矩阵键盘是单片机应用系统中的一个重要部件,它能实现向单片机输入数据、传送命令等功能。
如要对键盘编码就需要识别按键,识别按键的方法很多,最常用的是扫描法。
基于扫描原理的常用编程方法在应用过程中不利于键盘的灵活编码,尤其是出于保密需要定期打乱键盘排序时更为不便。
1矩阵键盘扫描原理常用的矩阵键盘扫描方法有两种:一种是逐行扫描,通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
另一种是行列扫描,高四位全部输出低电平,低四位输出高电平。
当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下[1-2]。
以上两种方法在对矩阵键盘编码时常以一定规律进行。
比如用以上方法对4x4矩阵键盘编码时,定义了某一行或列4个按键的字符后,其余行列都必须以其四倍的数进行编码(常用的扫描程序见图1)。
这样会极大限制键盘使用的灵活性。
为此,本文将介绍在51单片机环境下,基于扫描原理的4x4矩阵键盘的一种编程方法。
图1常用的扫描程序2程序设计及仿真2.1编程原理如图2所示为典型4×4矩阵键盘按键定义的功能[3-5]。
图24×4矩阵键盘按键定义图为了便于区分,可将图2中所示的4x4矩阵键盘划分为1、2、3、4共四列和A 、B 、C 、D 共四行,四列接单片机P1端口高四位,四行接单片机P1端口低四位。
首先将高四位置1,低四位置0。
如果没有按键按下则返回11110000即0XF0。
如某列有按键按下则对应得到如表1所示值。
表1四列扫描结果值再将高四位置0,低四位置1。
如果没有按键按下则返回00001111即0X0F 。
矩阵键盘程序设计矩阵键盘程序设计引言矩阵键盘是一种常见的输入设备,它通常由多个按键组成,以矩阵的形式排列。
在程序设计中,需要对矩阵键盘进行读取和处理,以实现按键的功能。
本文将介绍如何进行矩阵键盘程序设计。
硬件结构矩阵键盘通常由多个按键和矩阵引脚组成。
按键按下时,相应的矩阵引脚会与对应的行和列接通,通过扫描行和列的方式来读取按键的状态。
矩阵键盘的硬件结构需要在程序设计中进行考虑。
程序设计初始化在进行矩阵键盘程序设计之前,我们首先需要对矩阵键盘进行初始化。
初始化的过程包括设置引脚的输入输出模式,设置引脚的上拉或下拉电阻等。
扫描按键矩阵键盘的按键扫描是矩阵键盘程序设计的核心部分。
一般来说,通过扫描行和列的方式可以实现对按键的读取。
具体的扫描流程如下:1. 将所有的行设置为输出模式,所有的列设置为输入模式。
2. 将所有的行置为高电平,所有的列置为低电平。
3. 逐行扫描按键,如果某一行的列引脚为低电平,则表示对应的按键按下。
4. 返回按键的状态。
处理按键在获取按键的状态后,我们可以根据需要对按键进行相应的处理。
处理按键的方式可以有很多种,例如触发事件、执行操作等。
根据实际需求,选择适合的方式进行处理。
循环扫描在实际应用中,矩阵键盘的扫描通常需要以循环的方式进行。
通过不断地扫描矩阵键盘的状态,可以及时获取按键的信息,并进行相应的处理。
循环扫描的方式可以保证按键的响应速度。
示例代码pythonimport RPi.GPIO as GPIO定义行和列的引脚row_pins = [11, 13, 15, 17]col_pins = [19, 21, 23, 25]初始化GPIOGPIO.setmode(GPIO.BOARD)设置引脚的输入输出模式GPIO.setup(row_pins, GPIO.OUT)GPIO.setup(col_pins, GPIO.IN)扫描按键def scan_keyboard():for row in row_pins:将当前行置为高电平GPIO.output(row, GPIO.HIGH)逐列扫描for col in col_pins:如果某一列为低电平,表示按键按下if GPIO.input(col) == GPIO.LOW:返回按键的状态return (row, col)将当前行置为低电平GPIO.output(row, GPIO.LOW)处理按键def process_key(row, col):根据行和列的值,进行相应的处理操作print(\。
单片机矩阵键盘设计方案一、设计目标设计一个8行8列的矩阵键盘,每个按键都有一个唯一的键码,能够正常读取用户的按键输入,并将按键对应的键码显示在LCD屏幕上。
二、硬件设计硬件设计包括键盘电路和显示电路两部分。
1.键盘电路设计矩阵键盘的硬件设计主要包括键盘矩阵、行扫描电路和列读取电路。
键盘矩阵由8行8列的按键构成,每个按键都连接到一个由二极管组成的矩阵。
行扫描电路使用8位输出的GPIO口,根据行的值来选通对应的行组。
列读取电路使用8位输入的GPIO口,根据列的值来读取对应的列组。
2.显示电路设计三、软件设计软件设计主要包括初始化设置、按键检测、键码解析和显示处理四个部分。
1.初始化设置首先需要对GPIO口进行初始化设置,将扫描行的GPIO口设置为输出模式,将读取列的GPIO口设置为输入模式。
同时需要对LCD屏幕进行初始化设置,设置显示模式、光标位置等参数。
2.按键检测循环扫描每一行,当其中一行被选通时,读取每一列的值。
如果其中一列的值为低电平,则表示对应的按键被按下。
将按下的按键的行和列的值保存下来,用于后续的键码解析。
3.键码解析根据行和列的值,通过查表的方式找到对应的键码。
将键码保存下来,用于后续的显示处理。
4.显示处理将键码传送给LCD屏幕,通过LCD屏幕的驱动芯片进行解析和显示。
根据LCD屏幕的显示方式,可以选择逐行显示或者按需显示的方式。
四、优化设计在以上基本设计方案的基础上,可以进行一些优化设计,以提高系统的性能和可靠性。
1.消除按键抖动按键在实际使用中会存在抖动现象,需要通过软件滤波来消除。
可设置一个适当的延时,当检测到按键按下后,延时一段时间再进行键码解析,只有在延时之后仍然检测到按键按下,才认为是一个有效的按键。
2.防止冲突按键由于矩阵键盘的性质,可能存在一些按键组合会产生冲突的情况。
可以通过硬件设计和软件处理来解决。
在硬件上,可以增加二极管来隔离不同的按键。
在软件上,可以通过扫描算法和按键排除的方式来避免冲突。
来源:21IC-应用发布时间:2010-12-21 10:26 评论:0条阅读:304次发给好友在基于PC104的便携式野外测试设备的设计中,键盘是常用的输入设备。
对于便携式设备野外工作时,一般使用小型(4x4)矩阵键盘就能满足设备的信息输入需要;室内调试时,使用标准PS2键盘更方便、灵活。
一般的做法是保留PC104的键盘接口用于接标准键盘,利用扩展I/O接口完成小矩阵键盘的扫描和输入。
这样做虽然可以实现设备双键盘同时工作的功能,却需耗费大量的CPU处理时间扫描矩阵键盘,造成CPU处理其他信息的能力下降。
而本文设计的基于CPLD的矩阵键盘扫描模块能够很好地解决上述问题。
1 矩阵键盘扫描原理图1给出了4x4矩阵键盘的电路图,在图1中KX[3..0]为扫描码输入,KY[3..0]为扫描码输出。
键盘扫描开始时,首先置KX[3..0]=“0000”;键盘扫描码寄存器和键盘扫描码缓存器Kreg[15..0]和Kscan[15..0]置成“1111111111111111”(全1为没有键按下,有键按下时至少有一位为O),一旦有键按下,KY[3..0]输出不全为“O”的扫描码触发键盘扫描功能开始键盘扫描,扫描开始后,依次将KX3、KX2、KX1、KX0置“0”,分别将对应的4组KY[3..0]输入值保存于Kscan[15..12]、Kscan[11..8]、Kscan[7..4]、Kscan[3..0]中,而后比较Kscan和Kreg的大小,如果Kscan小于Kreg,将Kscan保存于Kreg中,重复上述扫描过程直到Kscan[15..0]各位输出全为“1”时,说明按下的键全部抬起,Kreg[15..0]中的每一个为“0”的位对应一个按下的键,保留扫描过程中的Kreg最小值就可以处理组合键。
根据记录的Kreg值可以判断是哪个或哪几个键按下,据此编码按键值后输出。
将KX[3..0]置为“0000”,等待下一次按键发生。
2 基于CPLD的4x4矩阵键盘扫描模块设计根据上述扫描原理和工作流程,如果以PC104 CPU实现上述矩阵键盘的扫描过程,那么在有键按下后,CPU必须不停地扫描矩阵键盘电路,在此期间不能进行其他工作,降低了CPU工作效率,且CPU连续高速运转增加系统功耗。
本文的目的就是在不需要CPU参与的条件下以CPLD完成矩阵键盘按键事件触发、按键的扫描定位以及按键的编码和键值输出工作,CPU只需要定时查询有无键按下并读走按下键的按键值送入键盘缓冲区。
这样就使CPU从繁重的矩阵键盘扫描工作中解脱出来。
根据上述键盘扫描工作原理,基于CPLD的4x4矩阵键盘扫描模块功能框图如图2所示。
图中,模块KeyTri在时钟信号CLK的控制下实现按键事件触发和矩阵键盘扫描时序产生功能;模块keycode在时钟信号CLK和扫描时序码SCode的控制下完成输出键盘扫描码KX,同时记录16位键盘扫描数据等工作,并在所有键抬起后对按下的键编码完成输出功能;模块nread实现按键码的暂存、按键状态的置位和清除以及矩阵键盘的使能;模块PCPORT完成矩阵键盘与CPU的接口;模块OSC与CreatClock产生控制键盘扫描模块工作的3 KHz时钟信号CLK。
2.1 键盘扫描触发模块(KeyTri)的功能与时序仿真键盘扫描过程中,扫描信号不停变化,以判断键盘按键的按下和抬起。
高速变化的键盘扫描信号不仅使系统功耗增加,而且还会对其他敏感电路造成干扰。
因此在本设计中将键盘扫描模式设计成键按下触发扫描方式,只有当键盘有键按下后,才触发键盘扫描电路产生扫描键盘时序,所有键都放开后,停止对键盘的扫描,使电路处于相对静止状态,以减少对其他电路的干扰。
键盘按下时会有抖动,在按键抖动时扫描键盘,可能会使键盘扫描电路产生误判,因此在键盘按下与开始扫描之间应加入一段延时,延时结束后按键仍处于按下状态,才允许开始键盘扫描,这样做可以最大限度地避免扫描电路的误判和漏判。
键盘扫描触发模块实现的功能为:在KX="0000"的状态下,如果有任意一个键被按下,KY必然不全为…1‟,触发延时功能开始延时,延时结束后,如果KY仍不全为…1‟,说明该按键事件有效,启动扫描时序产生1H~BH的4位循环扫描时序码,控制后续的键盘扫描电路对键盘扫描,当ReSet变低时,立即将扫描时序码置为OH,停止本次键盘扫描并等待下一次键盘按下事件到来。
键盘扫描触发模块的VHDL语言实现如下:键盘扫描触发模块的时序仿真如图3所示。
在图3中,①和②之间的时间为去键盘抖动延时,为了方便仿真,此处把延时时间设定为4个周期,实际使用时,应保持在20~30 ms左右。
2.2 键盘扫描与编码输出模块(keycode)的功能与时序仿真所谓键盘扫描,就是在键盘的KX端依次送入扫描码,以便定位被按下的键。
键盘编码是对键盘扫描值译码得到按下键的按键值。
该模块完成的功能为:在扫描时序控制码SCode[3..0]和CLK的下降沿控制下依次输出4组扫描码“0111”、“1011”、“1101”、“11 10”扫描整个键盘,同时记录键盘的扫描值,将记录的4组扫描值组合成一组16位的键盘扫描值Kscan[15..0],如果Kscan[15..0]小于Kreg[15..O],将Kscan[15..0]保存于Kreg[15..0]中,当所有键放开后,对Kreg[15..0]译码产生按键编码并输出。
有一个键按下,16位的键盘扫描值中有且只有一位为O,多键组合按下时,键盘扫描值中就会有多个位为…0‟,因此在键盘扫描过程中,记录最小的键盘扫描值,使得扫描模块不仅能够处理单键,而且可以处理多键组合。
具体工作过程说明如下:当SCode [3..0]=0时,KX="0000",置16位键盘扫描值Kscan[15..0]和Kreg[15..0]为全…1‟,此时无论哪一个键按下,都可使KY不全为…1‟,从而触发扫描模块工作;当SCode[3..0]=1或2时,KX="0111",此时图1中K12~K15有按下的键时,KY 对应位为…0‟,其他位为…1‟,记录KY到键盘扫描码寄存器的Kreg[15..12];当SCode[3..0]=3或4时,KX=“1011”,此时图1中K08~K11有按下的键时,KY对应位为…0‟,其他位为…1‟,记录KY到键盘扫描码寄存器的Kreg[11..8];当SCode[3..0]=5或6时,KX=“1101”,此时图1中K04~K07有按下的键时,KY 对应位为…0‟,其他位为…1‟,记录KY到键盘扫描码寄存器的Kreg[7..4];当SCode[3..0]=7或8时,KX=“1110”,此时图l中K00~K03有按下的键时,KY 对应位为…O‟,其他位为…1‟,记录KY到键盘扫描码寄存器的Kreg[3..0];当SCode[3..0]=9和10时,如果Kscan[15..0]各位不全为“1”且Kscan[15..0]<Kreg[15..0],将Kscan[15..O]保存到Kreg[15..0];否则对Kreg[15..0]译码产生按键编码并输出;当SCode[3..0]=11且记录Kscan[15..0]各位为全“1”时,产生键盘复位信号ReSet,结束本次键盘扫描。
键盘扫描与编码输出模块的核心模块VHDL语言实现如下:键盘扫描与编码输出模块的时序仿真图如图4所示。
2.3 键盘编码输出模块(nread)的功能与时序仿真在该模块中,KeyrData的最高位KeyData(7)为键盘缓存状态指示位,当KeyData(7)=…0‟时,表示键盘缓存中没有按键码:当KeyData(7)=…1‟时,表示键盘缓存中有按键码等待CPU 读取。
KeyData[6..0]为按下键的编码。
ReSet的下降沿用于将KeyVal[6..0]存入KeyData[6..0],同时将KeyData(7)置成‟1‟。
enKeyOut用于使能矩阵键盘输出,当enKeyOut=…1‟时,允许矩阵键盘输出按键码;当enKeyOut=…0‟时,禁止矩阵键盘输出按键码。
ClrKey用于清除键盘缓存状态指示位KeyData(7),当ClrKey=…0‟时,置KeyData(7)为…O‟。
键盘编码输出模块的VHDL语言实现如下:键盘编码输出模块的时序仿真图如图5所示。
2.4 接口模块(PCPORT)的功能与时序仿真该模块用于实现CPU读入键盘码以及矩阵键盘控制信号的输出。
开始时,CPU首先应通过该模块送出OSCEn=…1‟信号,使振荡器模块(OSC)和时钟产生模块(CreatClock)开始工作,产生驱动扫描模块工作的时钟信号F3kHz:接下来送出键盘禁止信号enKeyOut=0;禁止矩阵键盘在稳定工作前随机输出按键值;其次送出清除键盘缓存状态指示位的ClrKey信号;最后再送出键盘使能信号enKeyOut=…1‟,开始模块扫描键盘工作。
接口模块的时序仿真图如图6所示。
2.5 其他模块的功能振荡器模块(OSC)为利用Altera公司的IP核产生的MAXII系列CPLD内带的振荡器,用于在使能信号的控制下产生3.3 MHz的时钟输出。
时钟产生模块(CreatClock),用于将3.3 MHz的时钟分频产生3 KHz的键盘扫描时钟,驱动整个键盘扫描模块工作。
3 控制软件的设计本文软件设计的基本思想是:CPU利用定时中断查询矩阵键盘状态并读入矩阵键盘的按键码,如果按键码为需要立即响应的特殊功能键(如热启动键),即在中断服务程序中作出处理,否则直接送入与标准键盘共用的键盘缓冲区,在键盘缓冲区与标准键盘送来的按键码一起排队等待CPU响应处理,从而实现双键盘同时工作。
在向键盘缓冲区写入按键值时,必须使用DOS软中断,否则会由于中断优先级的原因而使新写入的按键码得不到响应。
矩阵键盘的控制软件采用C语言编制,利用PC104的定时器中断定时查询矩阵键盘,如果有键值,将其存入PC104的键盘缓冲区,等待PC104使用。
控制程序的源码如下:4 测试结果本文所述的键盘扫描模块已经在多功能电法接收机中使用,在使用过程中对矩阵键盘的响应时间、准确度、CPU处理时间占用、以及双键盘同时工作性能等指标进行了测试分析,结果如下:1)矩阵键盘响应时间和准确度测试,理论上计算矩阵键盘的最短响应时间为T=t1+t2+t3+t4=55.9 ms(其中,t1为防抖动延时时间30ms;t2键盘扫描最短用时,共扫描2次用22个F3 kHz时钟周期6.6 ms;t3为键盘值暂存时间,3个F3kHz时钟周期1 ms;t4为查询键盘中断间隔18.3ms),考虑到操作键盘的速度,测试方法为全部16个键以3次/s的速度连续按6次,间隔5s换一个键,将键值输出到显示器观察输入情况,测试结果为:总按键数:96;显示按键数:96;漏判按键数:0;错判按键数:0;准确率:100%。