原创 矩阵键盘设计

2010-10-23 10:06 2343 6 5 分类: FPGA/CPLD

首先对矩阵键盘的每个按键进行编码,编码如图一所示(0000、0001、…、1110、1111)。由于COL通过电阻上拉到VCC,因此当没有键被按下时,COL的值为”1111”;当有键被按下(假设被按下的键是编码为”0000”的键),FPGA输出的行扫描信号ROW连续为”1110” => “1101” => “1011” => “0111”,当ROW等于”1110”即ROW0为低时,COL0也为低,则表示FPGA判断出编码为”0000”的按键被按下,FPGA输出有按键被按下的指示信号和该按键的编码。


 



VHDL代码如下:


library ieee;


use ieee.std_logic_1164.all;


use ieee.std_logic_unsigned.all;


 


entity matrikeyscan is


port(       clk : in std_logic; --系统时钟输入


              col          : in std_logic_vector(3 downto 0); --列扫描输入


              row        : out std_logic_vector(3 downto 0); --行扫描输出


              keyout     : out std_logic_vector(3 downto 0); --按键编码输出


putdown : out std_logic); --按键批示信号,’1’表示有键被按下,’0’表示没有键--被按下


end matrikeyscan;


 


architecture behave of matrikeyscan is


       signal rowreg : std_logic_vector(3 downto 0);


       signal con : std_logic_vector(7 downto 0);


       signal cnt : std_logic_vector(15 downto 0);


       signal clkreg : std_logic;


begin


--


--数字分频器,对系统时钟进行适当分频,得1~10KHz左右的时钟进行矩阵键盘扫描。


process(clk)


begin


       if clk'event and clk = '1' then


              if cnt = "1100001101001111" then


                     cnt <= "0000000000000000";


                     clkreg <= '0';


              elsif cnt = "0110000110100111" then


                     cnt <= cnt + "0000000000000001";


                     clkreg <= '1';


              else


                     cnt <= cnt + "0000000000000001";


              end if;


       end if;


end process;


--


--产生行扫描信号


process(clkreg)


begin


       if clkreg'event and clkreg = '1' then


              case rowreg is


                     when "1110" => rowreg <= "1101";


                     when "1101" => rowreg <= "1011";


                     when "1011" => rowreg <= "0111";


                     when "0111" => rowreg <= "1110";


                     when others => rowreg <= "1110";


              end case;


       end if;


end process;


 


--


--对行扫描信号和列扫描信号进行组合。


       row <= rowreg;


       con <= rowreg & col;


--


--对行扫描信号和列扫描信号进行CASE语句判断。得到是否有键被按下,输出按键按--键指示信号和按键的编码


process(clkreg)


begin


       if clkreg'event and clkreg = '1' then


              case con is


                     when "11101110" => keyout <= "0000"; putdown <= '1';


                     when "11101101" => keyout <= "0001"; putdown <= '1';


                     when "11101011" => keyout <= "0010"; putdown <= '1';


                     when "11100111" => keyout <= "0011"; putdown <= '1';


                     when "11011110" => keyout <= "0100"; putdown <= '1';


                     when "11011101" => keyout <= "0101"; putdown <= '1';


                     when "11011011" => keyout <= "0110"; putdown <= '1';


                     when "11010111" => keyout <= "0111"; putdown <= '1';


                     when "10111110" => keyout <= "1000"; putdown <= '1';


                     when "10111101" => keyout <= "1001"; putdown <= '1';


                     when "10111011" => keyout <= "1010"; putdown <= '1';


                     when "10110111" => keyout <= "1011"; putdown <= '1';


                     when "01111110" => keyout <= "1100"; putdown <= '1';


                     when "01111101" => keyout <= "1101"; putdown <= '1';


                     when "01111011" => keyout <= "1110"; putdown <= '1';


                     when "01111111" => putdown <= '0';


                     when "11101111" => putdown <= '0';


                     when "11011111" => putdown <= '0';


                     when "10111111" => putdown <= '0';


                     when "01111111" => putdown <= '0';


                     when others => null;


              end case;


       end if;


end process;


 


end behave;         

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户315677 2010-12-16 22:03

你好!请问一下键盘的时序问题,在CLK到来时,如何考虑键盘行输出和列输入的时序问题啊
相关推荐阅读
用户1132151 2011-12-10 19:55
《基于VHDL的FPGA与NIOS_II实例精炼》配套源代码与视频整理
[nobr] 《基于VHDL的FPGA与NIOS_II实例精炼》配套源代码与视频整理   下面是《基于VHDL的FPGA与NIOS_II实例精炼》配套源代码的下面地址,网友如果看不懂的可以购书配合学习...
用户1132151 2010-11-02 20:54
VHDL测试平台设计_4位计数器
VHDL测试平台设计_4位计数器VHDL设计实体,它是一个带低有效复位的4位计数器:library ieee;use ieee.std_logic_1164.all;use ieee.std_logi...
用户1132151 2010-10-23 10:26
10种软件滤波方法
1、限幅滤波法(又称程序判断滤波法)    A、方法:        根据经验判断,确定两次采样允许的最大偏差值(设为A)        每次检测到新值时判断:        如果本次值与上次值之差&...
用户1132151 2010-10-23 10:19
PCB设计基础知识
PCB设计基础知识印刷电路板(Printed circuit board,PCB)几乎会出现在每一种电子设备当中。如果在某样设备中有电子零件,那么它们也都是镶在大小各异的PCB上。除了固定各种小零件外...
用户1132151 2010-10-23 10:17
上拉和下拉电阻
上拉电阻:1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。2、OC门电路必须加...
用户1132151 2010-10-23 10:15
HDL设计探究
一.可移植性编码1.只使用IEEE标准类型(VHDL):(1)使用STD_LOGIC类型,而不是STD_ULOGIC类型;(2)设计中不要创建过多的的子类型;(3)不要使用BIT和BIT_VECTOR...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条