ImageVerifierCode 换一换
格式:DOCX , 页数:42 ,大小:459.83KB ,
资源ID:5788410      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5788410.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(矩阵键盘显示.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

矩阵键盘显示.docx

1、矩阵键盘显示 EDA基础实验分册 矩阵键盘显示电路的设计一、 键盘显示原理1 键盘实现方案 实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。作为一个嵌入系统设计人员,总是会关心产品成本。目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方法有助于缩减一个系统的重复开发成本,且只需要很少的CPU 开销。嵌入式控制器的功能很强,可能充分利用这一资源,这里就介绍一下软键盘的实现方案。图10-1 简单键盘电路2 键盘抖动的产生及去抖通常在一个键盘中使用了一个瞬时接触开关,并且用如图10-1 所示的简单电路,微处理器可以容易地检测到闭合。当开关打开时,通过处理器

2、的I/O 口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的/IO 口的输入将被拉低得到逻辑0。可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1 或者0。尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。当触点闭合时,其弹起就像一个球。弹起效果将产生如图10-2 所示的好几个脉冲。弹起的持续时间通常将 维持在5ms30ms 之间。我们可以在时钟的上升沿捕获一个稳定的按键值,从而达到消抖的目的。图10-2 按键抖动3 键盘扫描键盘上阵列这些开关最有效的方法(当需要5 个以上的键时)就形成了一个如图10-3 所示的二维矩阵。当

3、行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O 端被连接的时候)。一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。图10-3 矩阵键盘键盘扫描的实现过程如下:对于44键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位

4、为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。4*4的键盘面配置5 键盘键值的获取键盘上的每一个按键其实就是一个开关电路,当某键被按下时,该按键的接点会呈现0的状态,反之,未被按下时则呈现逻辑1的状态。扫描信号由Kr3Kr0进入键盘,变化的顺序依次为1110-1101-1011-0111-1110。每一次扫描一排,依次地周而复始。例如现在的扫描信号为1011,代表目前正在扫描2、5、8,0这一排的按键,如果这排当中没有按键被按下的话

5、,则由Kc3Kc0读出的值为1111;反之当7这个按键被按下的话,则由Kc3Kc0读出的值为1101。根据上面所述原理,我们可得到各按键的位置与数码关系如表所示。如表 按键位置与数码关系Kr3-kr001110111011101111011101110111011Kc3-kc001111011110111100111101111011110键值147142580Kr3-kr011011101110111011110111011101110Kc3-kc001111011110111100111101111011110键值3691510111213获取到行值和列值以后,组合成一个8位的数据,根据实

6、现不同的编码在对每个按键进行匹配,找到键值后在7段码管显示。二、 实验内容本实验要求完成的任务是通过编程实现对4X4矩阵键盘按下键的键值的读取,并在数码管上完成一定功能(如移动等)的显示。按键盘的定义,按下“*”键则在数码管是显示“E”键值。按下“#”键在数码管上显示“F”键值。其它的键则按键盘上的标识进行显示。在此实验中数码管与FPGA的连接电路和管脚连接在以前的实验中都做了详细说明,这里不在赘述。本实验箱上的4X4矩阵键盘的电路原理如图10-4所示。与FPGA的管脚连接如表10-1所示。图10-4 4X4矩阵键盘电路原理图信号名称对应FPGA管脚名说明KEY-C0AC18钜阵键盘的第1列选

7、择KEY-C1AC17钜阵键盘的第2列选择KEY-C2AD17钜阵键盘的第3列选择KEY-C3AC16钜阵键盘的第4列选择KEY-R0AD16钜阵键盘的第1行选择KEY-R1AC15钜阵键盘的第2行选择KEY-R2AD15钜阵键盘的第3行选择KEY-R3AC14钜阵键盘的第4行选择表10-1 4X4矩阵键与FPGA的管脚连接表三、 实验步骤1. 下面我们建立一个矩阵键盘显示的VHDL工程1)选择 开始 程序 Altera QuartusII5.1,运行QUARTUSII软件。或者双击桌面上的QUARTUSII的图标运行QUARTUSII软件,出现如图1-3所示。 图1-3 QUARTUSII软

8、件运行界面2)选择软件中的菜单File New Project Wizard,新建一个工程。如图1-4所示。 图1-4 新建工程对话框3)点击图1-4中的NEXT进入工作目录,工程名的设定对话框如图1-5所示。第一个输入框为工程目录输入框,用户可以输入如e:/eda等工作路径来设定工程的目录,设定好后,所有的生成文件将放入这个工作目录。第二个输入框为工程名称输入框,第三个输入框为顶层实体名称输入框。用户可以设定如EXP1,一般情况下工程名称与实体名称相同。使用者也可以根据自已的实际情况来设定工程名和顶层文件名。注:本处的顶层文件名必须和程序的实体名一致,否则编译会出错。图1-5 指定工程名称及

9、工作目录4)点击NEXT,进入下一个设定对话框,按默认选项直接点击NEXT进行器件选择对话框。如图1-6所示。这里我们以选用CycloneII系列芯片EP2C35F672C8为例进行介绍。用户可以根据使用的不同芯片来进行设定。图1-6 器件选择界面首先在对话框的左上方的Family下拉菜单中选取CycloneII,在中间右边的Speed grade下拉菜单中选取8,在左下方的Available devices框中选取EP2C35F672C8,点击NEXT完成器件的选取,进入EDA TOOL设定界面如图1-7所示。图1-7 EDA TOOL对话框5)按默认选项,点击Next出现新建工程以前所有的

10、设定信息,如图1-8所示,点击Finish完成新建工程的建立。图1-8 新建工程信息2、建立VHDL设计文件1)在创建好设计工程后,选择File NEW菜单,出现图1-9所示的新建设计文件类型选择窗口。这里我们以建立VHDL设计文件为例进行说明。图1-9 新建设计文件选择窗口2)在New对话框(图1-9)中选择Device Design Files页下的VHDL File,点击OK按钮,打开图形编辑器对话框,如图1-10所示。图中标明了常用的每个按钮的功能3) 在文本编辑器中输入如下VHDL程序:-下面是引用库 -library ieee; -库函数use ieee.std_logic_116

11、4.all;-定义了std_logic数据类型及相应运算use ieee.std_logic_arith.all;-定义了signed和unsigned数据类型、相应运算和相关类型转换函数use ieee.std_logic_unsigned.all;-定义了一些函数,可以使std_logic_vector类 -型被当作符号数或无符号数一样进行运算-下面是结构实体-entity exp10 is-exp10为实体名 port( Clk : in std_logic; -时钟信号 Kr : in std_logic_vector(3 downto 0); -键盘行 Kc : buffer std

12、_logic_vector(3 downto 0); -键盘列 a,b,c,d,e,f,g : out std_logic; -七段码管显示 Sa,sb,sc : buffer std_logic); -七段码管片选end exp10;-结束实体-architecture behave of exp10 is -behave为结构体名 signal keyr,keyc : std_logic_vector(3 downto 0);-键盘行 列 扫描 信号量 signal kcount : std_logic_vector(2 downto 0); signal dcount : std_log

13、ic_vector(2 downto 0); signal kflag1,kflag2 : std_logic; signal buff1,buff2,buff3,buff4,buff5,buff6,buff7,buff8 : integer range 0 to 15; signal Disp_Temp : integer range 0 to 15; signal Disp_Decode : std_logic_vector(6 downto 0); begin process(Clk) -扫描键盘 扫描键盘的列 begin if(Clkevent and Clk=1) then if(K

14、r=1111) then kflag1=0; kcount=kcount+1; if(kcount=0) then kc=1110;-扫描第一列 elsif(kcount=1) then kc=1101;-扫描第二列 elsif(kcount=2) then kc=1011;-扫描第三列 else kc=0111; -扫描第四列 end if; else kflag1=1; keyr=Kr; keyc=Kc; end if; kflag2=kflag1; end if; end process; process(Clk) -显示右移 begin if(Clkevent and Clk=1) t

15、hen-上升沿 if(kflag1=1 and kflag2=0 ) then buff1=buff2;-移位 buff2=buff3; buff3=buff4; buff4=buff5; buff5=buff6; buff6=buff7; buff7buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8buff8Disp_TempDisp_TempDisp_TempDisp_TempDisp_TempDisp_TempDisp_TempDisp_Temp=b

16、uff8; -1 end case; end process; process(Clk) begin if(Clkevent and Clk=1) then -扫描累加 dcount=dcount+1; a=Disp_Decode(0);-七段数码管a段赋值 b=Disp_Decode(1);-七段数码管b段赋值 c=Disp_Decode(2);-七段数码管c段赋值 d=Disp_Decode(3);-七段数码管d段赋值 e=Disp_Decode(4);-七段数码管e段赋值 f=Disp_Decode(5);-七段数码管f段赋值 g=Disp_Decode(6);-七段数码管g段赋值 sa

17、=dcount(0);-数码管的片选信号赋值第一位 sb=dcount(1);-数码管的片选信号赋值第二位 scDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_DecodeDisp_Decode=0000000; -全灭 end case; end process; end behave;关于VHDL,我们

18、以上面键盘显示程序为例来解释VHDL的语法构成,以使大家对VHDL有个整体的把握。一个VHDL程序有三部分构成,其为 : 1.库和包 library(设计资源);2. 实体 entity(外部端口)3. 结构体 architecture(内部结构) 库和包 library(设计资源)的介绍1.1 use ieee.std_logic_1164.all;-定义了std_logic数据类型及相应运算1.2 use ieee.std_logic_arith.all;-定义了signed和unsigned数据类型、相应运算-和相关类型转换函数1.3 use ieee.std_logic_unsigne

19、d.all;-定义了一些函数,可以使std_logic_vector-类型被当作符号数或无符号数一样进行运算本程序中用到3个库函数包:如下 : 补充:当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;每个实体都应独立进行库的说明;库的说明应该在实体之前;经过说明后,实体和结构体就可以自动调用库中的资源; 实体 entity(外部端口)entity exp10 is-exp10为实体名 port( Clk : in std_logic; -时钟信号 Kr : in std_logic_vector(3 downto 0); -键盘行 Kc : buffer std_logic

20、_vector(3 downto 0); -键盘列 a,b,c,d,e,f,g : out std_logic; -七段码管显示 Sa,sb,sc : buffer std_logic); -七段码管片选end exp10;-结束实体实体说明主要描述对象的外貌,即对象的输入和输出(I/O)的端口信息,它并不描述器件的具体功能。在电路原理图上实体相当于元件符号。 Clk a-g Kr kc Sa Sb Sc 结构体 architecture(内部结构)结构体具体指明了该设计实体的行为,定义了该设计实体的功能,规定了该设计实体的数据流程,指派了实体中内部元件的连接关系。architecture b

21、ehave of exp10 is -behave为结构体名 signal keyr,keyc : std_logic_vector(3 downto 0);-键盘行 列 扫描 信号量 signal kcount : std_logic_vector(2 downto 0); signal dcount : std_logic_vector(2 downto 0); signal kflag1,kflag2 : std_logic; signal buff1,buff2,buff3,buff4,buff5,buff6,buff7,buff8 : integer range 0 to 15; s

22、ignal Disp_Temp : integer range 0 to 15; signal Disp_Decode : std_logic_vector(6 downto 0); begin process(Clk) -扫描键盘 扫描键盘的列 begin if(Clkevent and Clk=1) then if(Kr=1111) then kflag1=0; kcount=kcount+1; if(kcount=0) then kc=1110;-扫描第一列 elsif(kcount=1) then kc=1101;-扫描第二列 elsif(kcount=2) then kc=1011;

23、-扫描第三列 else kc=0111; -扫描第四列 end if; else kflag1=1; keyr=Kr; keyc=Kc; end if; kflag2=kflag1; end if; end process; process(Clk) -显示右移 begin if(Clkevent and Clk=1) then-上升沿 if(kflag1=1 and kflag2=0 ) then buff1=buff2;-移位 buff2=buff3; buff3=buff4; buff4=buff5; buff5=buff6; buff6=buff7; buff7=buff8; end if; end if; en

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1