2022年2022年矩阵键盘设计 .pdf

上传人:C****o 文档编号:33395761 上传时间:2022-08-10 格式:PDF 页数:12 大小:1.10MB
返回 下载 相关 举报
2022年2022年矩阵键盘设计 .pdf_第1页
第1页 / 共12页
2022年2022年矩阵键盘设计 .pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《2022年2022年矩阵键盘设计 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年矩阵键盘设计 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、EDA 技术实训第 1 页周次第七周备注章节名称项目四、矩阵键盘设计教学方式理论课()上机课()实验课()教学方法讲授法时间安排4 课时教学目标1、掌握按键消抖原理及其实现方法。2、掌握矩阵键盘扫描电路原理及其实现方法。3、掌握矩阵键盘扫描程序的不同设计方法。教学重点1、同步整形法与计数法进行按键防抖的原理及其实现方法。2、矩阵键盘行扫描法的实现。教学难点1、矩阵键盘行扫描法的设计重点。2、按键防抖和行扫描法的综合设计。板书安排下划线的内容为板书。任务 1 按键消抖电路原理与实现外部按键在闭合与释放瞬间,输入信号会有毛刺, 如果不进行消抖处理, 系统就会将这些毛刺误以为是用户的输入,导致系统的

2、误操作。 毛刺的出现和按键过程的抖动有关, 而这种抖动是不可避免的, 因此有必要设计专门的按键消抖电路以消除毛刺的影响,减少系统误操作。本节利用同步整形法和计数消抖法分别实现该电路。一、同步整形法同步整形电路也可以用于消除毛刺引起的系统误操作。只要毛刺不出现在时钟的上升沿处,电路就不会把它当做一次有效的输入,因此不输出高电平脉冲。由于毛刺持续的时间一般较短(所以才叫毛刺) ,因此只要时钟信号的周期足够大,毛刺出现在其上升沿处的概率就非常小。 另一方面,正常输入信号的持续时间只要足够一个时钟周期(起始位置可以随机),就能正常被识别为输入信号而在sout输出一个脉冲。从而实现消除毛刺的目的。综上,

3、为了有效识别毛刺应该尽量增大时钟信号的周期,时毛刺出现在时钟沿的概率尽量减小; 另外,为了识别正常的输入, 应保证正常输入的持续时间足够一个时钟周期, 但是不能由于时钟周期太大而降低识别正常输入信号的灵敏度。因此,实际应用中,该时钟周期可以取101000Hz。 若时钟周期取为100 Hz, 这就要求按键时间至少0.01s ,且无论按键持续多长时间都被识别为只输入一次。二、计数法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - E

4、DA 技术实训第 2 页计数法实现消抖的原理是对异步输入信号进行检测,当输入为高电平时对其计数,该高电平只有在保持一段时间不改变(计数器达到一定值),才确认它为有效值;若持续时间不够计数器达到一定值,则判其无效并复位计数器。【例程 -1】计数器实现按键消抖LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY antitwitter IS PORT( clk:IN STD_LOGIC; sin:IN STD_LOGIC; sout:OUT STD_LOGIC); END antitwitter; ARCHITECTURE beh OF antitwi

5、tter IS CONSTANT n:INTEGER:=7; SIGNAL cnt:INTEGER RANGE 0 TO n; BEGIN PROCESS(clk) BEGIN IF (clkEVENT AND clk=1) THEN IF (sin=0) THEN sout=0;cnt=0; ELSE IF (cnt=n) THEN -计数器 n 达到预先设定数值,说明按键保持了一段较长时间sout=1; - 信号有效cnt=0; - 计数器清零ELSE cnt=cnt+1; END IF; END IF; END IF; END PROCESS; END beh; 由上例的仿真波形图可知,

6、当输入 sin持续时间为时钟周期的8 倍以上时才被认为是有效输入,且多个连续的有效输入被认为是同一次。当输入信号持续时间不足时,被判无效,且计数器复位。而当输入还不满一个时钟周期时, 根本就不能被电路识别 (计数器不工作)。为了提高正常输入和毛刺的辨别能力,可以增大计数器的最大值, 并减少时钟信号的周期。例如,取 N 为 63,则正常输入被有效识别的时间为时钟周期的64 倍,即按键的持续时间至少为64 倍的时钟周期。 因此该程序中时钟周期不能取太大,而应该越小名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -

7、- - - - - 第 2 页,共 12 页 - - - - - - - - - EDA 技术实训第 3 页越好,但又不能太小以至将毛刺也识别为正常输入。任务 2 矩阵键盘基础知识一、矩阵键盘基础知识在许多数字系统中, 经常采用按键作为系统的输入方式之一,为系统提供数据输入或者命令输入。当案件数目较多时,把每一个按键连接到键盘矩阵中行和列的交叉点,如下图所示,一个4*4 行列结构可构成有16个按键的矩阵。开发板上设计了行列式矩阵编码键盘,规模为 4*4,可作为外部输入。 采用矩阵编码键盘可以减少对I/O 口的占用。开发板上的矩阵编码键盘有4 条行线, 4 条列线。行线和列线的交叉处不直接连接,

8、而是通过一个按键加以连接。这样就构成4*4=16 个按键输入, 比之直接将信号线用于键盘多出了一倍,而且线数越多, 区别越明显, 比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9 键) 。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些, 如图列线通过电阻接正电源,并将 行线所接的 FPGA、CPLD 的 I/O 口作为输出端 ,而列线所接的 I/O名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -

9、第 3 页,共 12 页 - - - - - - - - - EDA 技术实训第 4 页口则作为输入 。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平, 一旦有键按下, 则输入线就会被拉低, 这样,通过读入输入线的状态就可得知是否有键按下了。二、行扫描法基础知识行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。第一种(列扫描):1、判断键盘中有无键按下:将全部行线Y0-Y3 置低电平,然后检测列线的状态。只要有一列的电平为低, 则表示键盘中有键被按下, 而且闭合的键位于低电平线与4 根行线相交叉 的 4 个按键之中。若所有列线均为高电平,则键盘中

10、无键按下。2、判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平, 即在置某根行线为低电平时,其它线为高电平。 在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低, 则该列线与置为低电平的行线交叉处的按键就是闭合的按键。第二种:实验例程中采用(行扫描)1、等待按键并识别按键位置:按一定的频率用低电平循环扫描行线Y0-Y3 ,同时检测列线的状态,一旦判断有一列为低则表示有键被按下, 停止扫描并保持当前行线的状态,再读取列线的状态从而得到当前按键的键码。2、等待按键弹起:检测到各列线都变成高点平后,重新开始扫描过程,等待下一次按键

11、。【例程 -2】向用户介绍矩阵键盘扫描实现的方法,没有考虑去抖和判断键弹起的问题;把相应的键值显示在数码管上。设计重点:1、如何让行线扫描循环起来。2、如何读取那个键被按下。library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY KEYSCAN IS PORT ( clk : IN std_logic; rst : IN std_logic; row : OUT std_logic_vector(3 DOWNTO 0); -

12、行线column : IN std_logic_vector(3 DOWNTO 0); - 列线dataout : OUT std_logic_vector(7 DOWNTO 0); - 数码管显示数据en : OUT std_logic); - 数码管显示使能名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - EDA 技术实训第 5 页END KEYSCAN; ARCHITECTURE arch OF KEYSCAN IS SI

13、GNAL div_cnt : std_logic_vector(24 downto 0); -分频计数器SIGNAL scan_key : std_logic_vector(3 DOWNTO 0); -扫描码寄存器,其实就是行值row SIGNAL key_code : std_logic_vector(3 DOWNTO 0); -保存行扫描码SIGNAL dataout_tmp : std_logic_vector(7 DOWNTO 0); - dataout 的寄存器BEGIN row = scan_key; dataout = dataout_tmp; en = 0; PROCESS(c

14、lk,rst) -分频计数器,此处的分频为非50%分频BEGIN IF (NOT rst = 1) THEN div_cnt = 0000000000000000000000000; ELSIF(clkEVENT AND clk = 1)THEN div_cnt scan_key scan_key scan_key scan_key=0111; -判断第四行是否有键按下END CASE; END PROCESS; PROCESS(clk,rst) - 此进程用于读取那个键被按下BEGIN IF (NOT rst = 1) THEN key_code -当行扫描第一行时CASE column I

15、S WHEN 1110 = -如果第一列为低电平,那么第一行和第一列相交键被按下key_code -如果第二列为低电平,那么第一行和第二列相交键被按下key_code -如果第三列为低电平,那么第一行和第三列相交键被按下key_code -如果第四列为低电平,那么第一行和第四列相交键被按下key_code NULL; END CASE; WHEN 1101 = -当行扫描第二行时CASE column IS 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - -

16、 - - - - - - - EDA 技术实训第 6 页WHEN 1110 = -如果第一列为低电平,那么第二行和第一列相交键被按下key_code key_code key_code key_code NULL; END CASE; WHEN 1011 = CASE column IS WHEN 1110 = key_code key_code key_code key_code NULL; END CASE; WHEN 0111 = CASE column IS WHEN 1110 = key_code key_code key_code key_code NULL; END CASE;

17、WHEN OTHERS = key_code dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp dataout_tmp NULL; END CASE; END PROCESS; END arch; 任务 3 矩阵键盘扫描程序【例程 -3】矩阵键盘扫描程序LIbrary IEEE; USE

18、IEEE.STD_LOGIC_1164.ALL; ENTITY keyscanning IS PORT(clk,oe:IN STD_LOGIC; colum:IN STD_LOGIC_VECTOR(3 DOWNTO 0); -列码row:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -行码d_out:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);-编码输出(按下键所代表的数值)d_avail:OUT STD_LOGIC); -数据有效信号END keyscanning; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -

19、- - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - EDA 技术实训第 8 页ARCHITECTURE bhv OF keyscanning IS SIGNAL freeze :STD_LOGIC; -数据有效信号的内部寄存器SIGNAL d:STD_LOGIC_VECTOR(3 DOWNTO 0); -保存最后形成的值BEGIN PROCESS(clk) V ARIABLE r_counter:STD_LOGIC_VECTOR(3 DOWNTO 0); -行扫描码循环计数器,用于形成行扫描信号BEGIN IF

20、 (clk=1 AND clkEVENT ) THEN IF freeze=0 THEN - freeze=0才进行状态转换,否则保存当前值不变CASE r_counter IS-环形计数器,用于让四行扫描循环起来,状态转换WHEN 1110 =r_counter:=1101; -当第一行被扫描,那么接下来扫描第二行,状态转换WHEN 1101 =r_counter:=1011; -当第二行被扫描,那么接下来扫描第三行,状态转换WHEN 1011 =r_counter:=0111; -当第三行被扫描,那么接下来扫描第四行,状态转换WHEN 0111 =r_counter:=1110; -当第四

21、行被扫描,那么接下来扫描第一行,状态转换WHEN OTHERS =r_counter:=1110; END CASE; END IF; d_avail=freeze; END IF; rowd(3 DOWNTO 2)d(3 DOWNTO 2)d(3 DOWNTO 2)d(3 DOWNTO 2)d(3 DOWNTO 2)d(1 DOWNTO 0)=00;freezed(1 DOWNTO 0)=01;freezed(1 DOWNTO 0)=10;freezed(1 DOWNTO 0)=11;freezed(1 DOWNTO 0)=00;freeze=0; END CASE; IF (freeze=

22、1 AND oe=1) THEN d_out=d; ELSE d_outr_counter :=“1110” ;当检测到有按键按下时,freeze=1 ,环形计数器保持当前状态不变,直到此键释放。 这一功能是通过IF-THEN 语句实现的,即如果freeze=0不成立,则不执行描述环形计数器的CASE 语句。由于 IF-THEN 语句是不完整条件语句,电路中会自动引入锁存器,保持原状态不变。2、行编码和列编码每个键代表行号和列号的唯一组合,通过对列和行进行编号,并把行和列编号的二进制数形成四位二进制数表示相对应的各个按键。由程序可见,对行和列的编码是通过两组 CASE 语句实现的,其区别在于C

23、ASE 与 IS 之间的表达式不同,环形计数器的值决定行编码的值,所检测到反映各列状态的column值决定列编码的值。行编码决定按键数字的高两位,列编码决定按键数字的低两位。3、多键被同时按下的处理结果分析注意到由于环形计数器正常工作后,只会在1110 、1101、1011、0111 这四个状态之间循环, 故在正常工作状态下, 不会出现同时有两行被扫描的情况。但有可能出现同时两个按键被按下的情况, 譬如在同一行中同时多个按键被按下,则在列编码的 CASE语句的将会执行下面的语句: WHEN OTHERS=d(1 downto 0)=“00” ;freeze=0; 因此,进程结束时, d_out

24、=“ZZZZ” ,输出数据端为高阻态,输出数据有效信号d_avail为 0。 而当不同行有多个键被同时按下时, 最先扫描的一行具有输出编码优先权。【例程 -4】45 矩阵键盘扫描程序设计1、底层模块设计键盘防抖动源程序设计如下:library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; library altera; use altera.maxplus2.all; entity debouncing is port(d_in,clk: in std_logic; d_out: out std_logi

25、c); end; architecture art of debouncing is signal vcc,inv_d: std_logic; signal d1,d0,q1,q0: std_logic; begin vcc = 1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - EDA 技术实训第 10 页inv_d d_in,q = q0,clk = clk,clrn = vcc,prn = vcc); dff2: df

26、f port map(d = q0,q = q1,clk = clk,clrn = vcc,prn = vcc); process(clk) begin if (clkevent and clk=1) then if(q0=1 and q1=1) then d_out = 1; elsif(q0=0 and q1=0) then d_out=0; end if; end if; end process; end art; 2、顶层模块设计45 矩阵键盘的源程序如下:library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_ari

27、th.all; use ieee.std_logic_unsigned.all; library altera; use altera.maxplus2.all; entity key45 is port ( clk_in: in std_logic; -系统原始时钟脉冲row_in: in std_logic_vector(3 downto 0); -行输入column_scan: out std_logic_vector(4 downto 0); -列扫描out_value: out std_logic_vector(4 downto 0); -数字输出bcd: out std_logic

28、_vector(6 downto 0); -数码管显示输出end; architecture art of key45 is component debouncing port(d_in: in std_logic; clk: in std_logic; d_out: out std_logic); end component; signal clk: std_logic; signal column_keyboard: std_logic_vector(2 downto 0); signal row_debounce: std_logic; signal row_keyboard: std_

29、logic_vector(3 downto 0); signal n: std_logic_vector(4 downto 0); signal sel: std_logic_vector(4 downto 0); begin counter: block signal q: std_logic_vector(5 downto 0); -任意计数signal sel:std_logic_vector(4 downto 0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,

30、共 12 页 - - - - - - - - - EDA 技术实训第 11 页begin process(clk_in) -设置行值输出周期begin if clk_inevent and clk_in=1 then q=q+1; end if; -行值输出周期为系统时钟周期的8 倍column_keyboard = q(5 downto 3); clk = q(0); -q 最低位的变化转换为时钟信号,控制行扫描end process; sel=11110 when column_keyboard = 0 else -键盘第一列有键按下,第一列为低电平11101 when column_ke

31、yboard = 1 else -键盘第二列有键按下,第二列为低电平11011 when column_keyboard = 2 else -键盘第三列有键按下,第三列为低电平10111 when column_keyboard = 3 else -键盘第四列有键按下,第四列为低电平01111 when column_keyboard = 4 else -键盘第五列有键按下,第五列为低电平11111; column_scan row_in(0), d_out = row_keyboard(0), clk = row_debounce); u2:debouncing port map -键盘第二

32、行防抖动( d_in = row_in(1), d_out = row_keyboard(1), clk = row_debounce); u3:debouncing port map -键盘第三行防抖动( d_in = row_in(2), d_out = row_keyboard(2), clk = row_debounce); u4:debouncing port map -键盘第四行防抖动( d_in = row_in(3), d_out = row_keyboard(3), clk = row_debounce); end block debounce; -键盘译码key_decod

33、er: block signal z: std_logic_vector(6 downto 0); -键盘值定位signal yout: std_logic_vector(6 downto 0); begin process(clk) begin z n = 00001 ; yout n = 00101 ; yout n = 01001 ; yout n = 01100 ; yout n = 00010 ; yout n = 00110 ; yout n = 00000 ; yout n = 01101 ; yout n = 00011 ; yout n = 00111 ; yout n =

34、01010 ; yout n = 01110 ; yout n = 00100 ; yout n = 01000 ; yout n = 01011 ; yout n = 01111 ; yout n = 10000 ; yout n = 10001 ; yout n = 10010 ; yout n = 10011 ; yout yout = 0000000; end case; end if; end process; bcd= yout; end block key_decoder; out_value=n; row_debounce=clk; end art; 作业课后练习教学总结及学生反应名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁