当前位置:文档之家› vhdl 4x4键盘扫描程序

vhdl 4x4键盘扫描程序

用VHDL编写的一个简单4X4键盘扫描程序(2007-07-27 19:07:07)标签:vhdl键盘扫描
没有考虑去抖和判断键弹起的问,把相应的键值显示在数码管上,VHDL程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY KEYDIS IS
PORT (
clk : IN std_logic;
row : OUT std_logic_vector(3 DOWNTO 0); -- 行线
column : IN std_logic_vector(3 DOWNTO 0); -- 列线
dyp : OUT std_logic_vector(7 DOWNTO 1):="1111001"; -- 数码管显示数据
ledct : OUT std_logic_vector(5 downto 0):="000001"); --数码管显示使能
END KEYDIS;

ARCHITECTURE arch OF KEYDIS IS

SIGNAL div_cnt : std_logic_vector(24 downto 0);
SIGNAL scan_key : std_logic_vector(3 DOWNTO 0); --扫描码寄存器
SIGNAL key_code : std_logic_vector(3 DOWNTO 0);
SIGNAL dyp_tmp : std_logic_vector(7 DOWNTO 1);

BEGIN
row <= scan_key;
--dyp <= dyp_tmp;
ledct<="000001";
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk = '1')THEN
div_cnt <= div_cnt + 1;
END IF;
END PROCESS;

PROCESS(div_cnt(20 downto 19))
BEGIN
CASE div_cnt(20 downto 19) IS
WHEN "00"=> scan_key<="1110";
WHEN "01"=> scan_key<="1101";
WHEN "10"=> scan_key<="1011";
WHEN "11"=> scan_key<="0111";
END CASE;
END PROCESS;

PROCESS(clk)
BEGIN

-- IF (NOT rst = '1') THEN
-- key_code <= "0000";
--ELS
IF(clk'EVENT AND clk='1')THEN
CASE scan_key IS --检测何处有键按下
WHEN "1110" =>
CASE column IS
WHEN "1110" =>
key_code <= "0000";
WHEN "1101" =>
key_code <= "0001";
WHEN "1011" =>
key_code <= "0010";
WHEN "0111" =>
key_code <= "0011";
WHEN OTHERS =>
NULL;

END CASE;
WHEN "1101" =>
CASE column IS
WHEN "1110" =>
key_code <= "0100";
WHEN "1101" =>
key_code <= "0101";
WHEN "1011" =>
key_code <= "0110";
WHEN "0111" =>
key_code <= "0111";
WHEN OTHERS =>
NULL;

END CASE;
WHEN "1011" =>
CASE column IS

WHEN "1110" =>
key_code <= "1000";
WHEN "1101" =>
key_code <= "1001";
WHEN "1011" =>
key_code <= "1010";
WHEN "0111" =>
key_code <= "1011";
WHEN OTHERS =>
NULL;

END CASE;
WHEN "0111" =>
CASE column IS
WHEN "1110" =>
key_code <= "1100";
WHEN "1101" =>
key_code <= "1101";
WHEN "1011" =>
key_code <= "1110";
WHEN "0111" =>
key_code <= "1111";
WHEN OTHERS =>
NULL;

END CASE;
WHEN OTHERS =>
key_code <= "1111";

END CASE;
END IF;
END PROCESS;

-----显示键值
PROCESS(key_code)
BEGIN
CASE key_code IS
WHEN "0000" =>
dyp_tmp <= "0000001";
WHEN "0001" =>
dyp_tmp <= "1100111";
WHEN "0010" =>
dyp_tmp <= "0010010";
WHEN "0011" =>
dyp_tmp <= "1000010";
WHEN "0100" =>
dyp_tmp <= "1100100";
WHEN "0101" =>
dyp_tmp <= "1001000";
WHEN "0110" =>
dyp_tmp <= "0001000";
WHEN "0111" =>
dyp_tmp <= "1100011";
WHEN "1000" =>
dyp_tmp <= "0000000";
WHEN "1001" =>
dyp_tmp <= "1100000";
WHEN "1010" =>
dyp_tmp <= "0001000";
WHEN "1011" =>
dyp_tmp <= "1100000";
WHEN "1100" =>
dyp_tmp <= "0110001";
WHEN "1101" =>
dyp_tmp <= "1000010";
WHEN "1110" =>
dyp_tmp <= "0110000";
WHEN "1111" =>
dyp_tmp <= "0111000";
WHEN OTHERS =>
NULL;

END CASE;

END PROCESS;
END arch;


相关主题
文本预览
相关文档 最新文档