键盘与接口显示电路EDA.docx

上传人:scccc 文档编号:12958077 上传时间:2021-12-08 格式:DOCX 页数:20 大小:174.56KB
返回 下载 相关 举报
键盘与接口显示电路EDA.docx_第1页
第1页 / 共20页
键盘与接口显示电路EDA.docx_第2页
第2页 / 共20页
键盘与接口显示电路EDA.docx_第3页
第3页 / 共20页
键盘与接口显示电路EDA.docx_第4页
第4页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《键盘与接口显示电路EDA.docx》由会员分享,可在线阅读,更多相关《键盘与接口显示电路EDA.docx(20页珍藏版)》请在三一文库上搜索。

1、河南科技大学课程设计说明书课程名称题目学院班级学生姓名指导教师EDA 技术键盘及接口显示电路车辆与动力工程学院农业电气化与自动化091卢浩冉罗四倍日期2012年7月12号键盘及接口显示电路摘要本文通过对 4×4 矩形键盘的信息采集,并能够在数码显示管上显示所按下的信息。通过循环输出行信号,检测列信号输入,将行列信号相并,来达到采集信号的目地,并通过译码在 7 段数码管上显示出来。 此次设计,为了防止抖动引起的混乱,加入了一个防抖动环节。在译完一个键值后,加了一个计算环节,一旦检测到列信号后,译码,紧跟着进入计数环节,此时键抖动不会进入其他环节,这样可以防止抖动。给精度较高的场合应用提

2、供了良好的条件,为以后高精度的应用创造良好空间。设计中通过按键控制可以显示字符串, 例如 “HELLO”,较小的改动可以任意显示 5 个字符,这在广告中的用处随处可见,给现代生活带来了方便。关键词 :键盘扫描 译码显示 字符串2/19目录第一章 绪论 .4§1.1设计目的和意义 .4§1.2设计任务及要求 .4第二章 总体设计 .5§2.1工作原理 .5§2.2设计思路 .5§2.3数码管显示译码模块设计 .6§2.4 字符串“ HELLO”的模块实现. 7§2.4.1七段数码管译码扫描显示. 7§2.4.2原理图

3、 .8第三章仿真 .9§3.1键盘扫描功能的仿真 .9§3.2字符串的仿真 .10第四章程序 .11§4.1键盘扫描程序 .11§4.2字符串显示程序 .16第五章 结论 .18参考文献 .193/19第一章绪论§1.1 设计目的和意义本次设计的目的就是通过实践深入理解计算机组成原理,了解EDA 技术并掌握 VHDL 硬件描述语言的设计方法和思想。以计算机组成原理为指导,通过学习的VHDL 语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识和基本单元电路的综合设计应用。通过对掌握4×4 键盘的扫描的巧妙实现和对字符串的显示过程

4、 .巩固和综合运用所学知识,提高IC 设计能力,提高分析、解决计算机技术实际问题的独立工作能力。§1.2 设计任务及要求1. 键盘扫描功能:能够对矩形键盘信息采集;2. 显示功能:能够显示相应的按键信息, 并能够在按键控制下切换为字符串显示 “HELLO”!3. 掌握数码管工作的原理, 并能够对设计的程序进行仿真和测试, 以实现相应的功能。4/19第二章总体设计§2.1 工作原理可编程器件的KEY_HANG3.0行信号输出端不停循环输出“ 1110”“ 1101”“ 1011。”“当没0111有键”按下时可编程器件的KEY_LIE3.0 列信号输入端检测到的是 “1111。

5、”当有按键按下时,如按下1,此时 KEY_HANG3.0 行信号输出为 “0111,”即 KEY_HANG3.0 的 3 管脚为 “0,”可由电路看出, 此时输入端KEY_LIE3.0 检测到的将是 “ 0111。”KEY_LIE3.0 的 3 管脚为 0,可以在编写程序时,将输出信号KEY_HANG3.0 与输入信号 KEY_LIE3.0 同时判断,比如可以认为当数据 “KEY_HANG&KEY_”LIE为 “01110111时”,可译码成数据1,。同理可得其他按键的编码。根据不同数据的编码译成不同的数据。§2.2 设计思路1.循环输出行信号,检测列信号输入,将行列信号相并

6、。2.译键值。3.去抖动。在译没一个键值后,为了防止抖动,加了一个计算环节,一旦检测到列信号后,译码,紧跟着进入计数环节,此时键抖动不会进入其他环节,这样可以防止抖动。4.数码管译码、循环显示。电路的具体功能罗列如下:1) 采用 4×4矩阵键盘作为操作数和操作符的输入设备。2) 采用 2位8段数码管作为输出显示设备,显示按下的数字及简单的功能。3) 由于所有键盘在按下或者弹起的时候均有按键抖动,所以应该采用去抖电路,当检测到有按键按下去的时候,应该延时 20ms后,再进行检测,如果仍有键盘按键被按下去的话,则进行键盘读值。5/19当CLK_1K 上升沿到来时状态转为 state0,然

7、后判断列与非后的值,看是否有按键按下,如果有输入数据,则自动启动 20ms的计数器,当计满数后,产生一个指示信号,此信号为 1bit,高电平有效。当读到此指示信号后,便再次将 row信号锁存至寄存器,便得到键盘的一个返回值。如果 row没有变化,则 state转换为 state2,对第二行进行按键扫描。依此类推,扫描第三行与第四行。因为普通的按键都是接触式的,当按键闭合或释放时,上下接触面都会产生一个很短暂的抖动,如图 2.2所示,这个抖动时间一般都会持续 5-10ms,虽然这个抖动时间很短,但对于 FPGA工作在 50M 的高频率上的器件来说, 还是可以捕捉的到的。 为了使 CPU对于一次按

8、键操作只处理一次,在软件中必须加入去除抖动处理。如图2.1所示图 2.1 按键闭合时产生的抖动由图中可以看出,最简单的去抖方法就是每隔一段时间读一次键盘,时间间隔大于10ms 即可。如果连续两次检测都有按键被按下,则可以肯定有按键被按下,而且也进入闭合稳定期。§2.3 数码管显示译码模块设计数码管显示译码电路主要用来对实际的二进制数据装换为 8段数码管的实际显示控制码,采用两个 2位的 8段共阴极数码管,数码管的显示方式有两种:静态显示和动态显示。具体如下 :静态显示方式:所谓静态显示就是指无论是多少位数码管,同时处于显示状态需要的硬件电路较多 (每一个数码管都需要一个锁存器) ,将

9、造成很大的不便, 同时由于所有数码管都处于被点亮状态, 所以需要的电流很大, 当数码管的数量增多时,6/19对电源的要求也就随之增高。所以,在大部分的硬件电路设计中,很少采用静态显示方式。动态显示方式:所谓动态显示,是指无论在任何时刻只有一个数码管处于显示状态,每个数码管轮流显示。动态显示的优点是: 硬件电路简单 (数码管越多, 这个优势越明显),由于每个时刻只有一个数码管被点亮,所以所有数码管消耗的电流较小;缺点是:数码管亮度不如静态显示时的亮度高,例如有 8个数码管,以 1秒为单位,每个数码管点亮的时间只有 1/8秒,所以亮度较低;如果刷新率较低,会出现闪烁现象;如果数码管直接与单片机连接

10、,软件控制上会比较麻烦等。显示译码方式如下:1) 时钟上升沿到来时分别对位选和段选进行译码。2) 将输入的 2bite位选数据译码成 4比特数据控制数码管的 2位,由于是共阴极数码管要选定相应的数码管则使该位位低电平,其它位为高电平即可,如:0000译码为 0111_1111,对应于实验板上的左边第一位数码管。3) 将输入的 4bite段选数据译码为 8比特数据控制 8个LED 的亮灭,最高位接A, 最低位接小数点位 DP。若要显示 0则对应的译码为8 b1111_1100。§2.4 字符串 “HELLO”的模块实现§七段数码管译码扫描显示clk:时钟输入端,此信号是串行扫

11、描的同步信号。data_control7.0: 8 个分别控制数码管显示的输入信号;led_addr7.0:对 8 个数码管进行串行扫描的输出控制信号;seg7_data6.0:驱动 7 段数码管各显示段的输出信号;7/19§原理图图 2.2 字符串显示原理图8/19第三章仿真§3.1 键盘扫描功能的仿真没有键按下时行循环输出“ ”“ ”“ ”“ ”图 3.1 无按键时波形当随机按下时行保持所按下的状态不变图 3.2 随机按键时波形9/19§3.2 字符串的仿真图 3.3 字符串显示10/19第四章程序§4.1 键盘扫描程序library ieee;en

12、tity jp isport(clk,start:in std_logic;kbcol:in std_logic_vector(3 downto 0);-行扫描信号kbrow:out std_logic_vector(3 downto 0);-列扫描信号seg7_out:out std_logic_vector(6 downto 0);-显示控制信号scan:out std_logic_vector(7 downto 0) -数码管地址选择控制信号);end jp;architecture one of jp issignal count,sta:std_logic_vector(1 down

13、to 0);signal seg7:std_logic_vector(6 downto 0);signal dat:std_logic_vector(4 downto 0);signal fn:std_logic; -按键标志位,判断是否有键被按下 beginscan<="00000001"-只使用一个数码管显示-循环扫描计数器process(clk)beginif clk'event and clk='1'thencount<=count+1;end if;11/19end process;-循环列扫描process(clk)begin

14、if clk'event and clk='1'thencase count iswhen "00"=>kbrow<="0001"sta<="00"when "01"=>kbrow<="0010"sta<="01"when "10"=>kbrow<="0100"sta<="10"when "11"=>kbrow&l

15、t;="1000"sta<="11"when others=>kbrow<="1111"end case;end if;end process;-行扫描译码process(clk,start)beginif start='0'thenseg7<="0000000"12/19elsif clk'event and clk='1'thencase sta iswhen "00"=>case kbcol iswhen "0

16、001"=>seg7<="1111001"dat<="00011"when "0010"=>seg7<="1101101"dat<="00010"when "0100"=>seg7<="0110000"dat<="00001"when "1000"=>seg7<="1111110"dat<="00000&q

17、uot;when others=>seg7<="0000000"dat<="11111"end case;when "01"=>case kbcol iswhen "0001"=>seg7<="1111000"dat<="00111"when "0010"=>seg7<="1011111"dat<="00110"13/19when "0100&qu

18、ot;=>seg7<="1011011"dat<="00101"when "1000"=>seg7<="0110011"dat<="00100"when others=>seg7<="0000000"dat<="11111"end case;when "10"=>case kbcol iswhen "0001"=>seg7<="0011

19、111"dat<="01011"when "0010"=>seg7<="1110111"dat<="01010"when "0100"=>seg7<="1111011"dat<="01001"when "1000"=>seg7<="1111111"dat<="01000"when others=>seg7<=&quo

20、t;0000000"dat<="11111"end case;14/19when "11"=>case kbcol iswhen "0001"=>seg7<="1000111"dat<="01111"when "0010"=>seg7<="1001111"dat<="01110"when "0100"=>seg7<="0111101&qu

21、ot;dat<="01101"when "1000"=>seg7<="1001110"dat<="01100"when others=>seg7<="0000000"dat<="11111"end case;when others=>seg7<="0000000"end case;end if;end process;-产生按键标志位,用于存储按键信息fn<=not (dat(0) and dat

22、(1) and dat(2) and dat(3) and dat(4);process(fn)beginif fn'event and fn='1'then-按键信息存储15/19seg7_out <=seg7;end if;end process;end one;§4.2 字符串显示程序library ieee;entity Scan8led isport(clk:in std_logic;data_control:in std_logic_vector(4 downto 0);led_addr:out std_logic_vector(4 down

23、to 0);seg7_data:out std_logic_vector(6 downto 0);end entity scan8led;architecture one of scan8led istype aaaa is array (0 to 3)of integer;constant a:aaaa:=(0,1,2,3);type seg7_data_type is array(natural range<>)of std_logic_vector(6 downto 0); constant seg7_data_table:seg7_data_type(0 to 5):=(-

24、gfedcba"1110110","1111001","0111000","0111000","0011111","0000000");type led_addr_type is array(natural range<>)of std_logic_vector(7 downto 0); constant led_addr_table:led_addr_type(0 to 4):=(-dizhibiao16/19"00000001","

25、;00000010","00000100","00001000","00010000");beginprocess(clk)variable count:integer range 0 to 4:=0;beginif(clk'event and clk='1')thencount:=count+1;led_addr<=led_addr_table(count);if(data_control(count)='1')thenseg7_data<=seg7_data_table

26、(count);elseseg7_data<=seg7_data_table(5);end if;end if;end process;end architecture one;17/19第五章结论这次 EDA课程设计历时十天,学到很多很多的东西。同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对 EDA 的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,都会很高兴。在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误。排除困难后,程序编译就通过了。在波形仿真时, 也遇到了一

27、点困难, 想要的结果不能在波形上得到正确的显示,后来,经过屡次的调试之后,才发现在写代码之前对信号的相位考虑不足。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为以后的工作所服务。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。总的来说,这次设计还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤指导下,终于迎刃而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的老师和所有同学再次表示忠心的感谢!18/19参考文献1 徐志军 .徐光辉 CPLD/FPGA 的开发与应用 .2001.电子工业出版社2 朱正伟 EDA 技术及应用 清华大学出版社3 延明、张亦华 数字电路 EDA 技术入门 北京邮电大学出版社4 EDA 技术与 VHDL 徐志军、王金明、尹延辉 北京: 电子工业出版社5 于润伟 .数字系统设计与 EDA 技术 . 北京 :机械工业出版社19/19

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1