用VHDL编写行列式键盘扫描程序
24行列式键盘扫描程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY wsw IS
PORT (
clk: IN std_logic;
row:bufferstd_logic_vector(1 DOWNTO 0);
column: IN std_logic_vector(3 DOWNTO 0);
dyp: OUT std_logic_vector(8 DOWNTO 1):="11110011";
ledct: OUT std_logic_vector(5 downto 0):="000001");
END wsw;
ARCHITECTURE behave OF wsw IS
SIGNAL div_cnt: std_logic_vector(20 downto 0);
SIGNAL scan_key: std_logic_vector(1 DOWNTO 0);
SIGNAL key_code: std_logic_vector(3 DOWNTO 0);
SIGNAL dyp_tmp: std_logic_vector(8 DOWNTO 1);
BEGIN
row
dyp
ledct
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk = '1')THEN
div_cnt
END IF;
END PROCESS;
PROCESS(div_cnt(20))
BEGIN
CASE div_cnt(20) IS
WHEN '0'=>scan_key
WHEN '1'=>scan_key
when others=> null;
END CASE;
END PROCESS;
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
CASE scan_key IS
WHEN "10" =>
CASE column IS
WHEN "1110" =>
key_code
WHEN "1101" =>
key_code
WHEN "1011" =>
key_code
WHEN "0111" =>
key_code
WHEN OTHERS =>
NULL;
END CASE;
WHEN "01" =>
CASE column IS
WHEN "1110" =>
key_code
WHEN "1101" =>
key_code
WHEN "1011" =>
key_code
WHEN "0111" =>
key_code
WHEN OTHERS =>
NULL;
END CASE;
WHEN OTHERS =>
key_code
END CASE;
END IF;
END PROCESS;
PROCESS(key_code)
BEGIN
CASE key_code IS
WHEN "0000" =>
dyp_tmp
WHEN "0001" =>
dyp_tmp
WHEN "0010" =>
dyp_tmp
WHEN "0011" =>
dyp_tmp
WHEN "0100" =>
dyp_tmp
WHEN "0101" =>
dyp_tmp
WHEN "0110" =>
dyp_tmp
WHEN "0111" =>
dyp_tmp
WHEN "1000" =>
dyp_tmp
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS;
END behave;
用VHDL编写的一个简单4X4键盘扫描程序
标签: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
--dyp
ledct
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk = '1')THEN
div_cnt
END IF;
END PROCESS;
PROCESS(div_cnt(20 downto 19))
BEGIN
CASE div_cnt(20 downto 19) IS
WHEN "00"=>scan_key
WHEN "01"=>scan_key
WHEN "10"=>scan_key
WHEN "11"=>scan_key
END CASE;
END PROCESS;
PROCESS(clk)
BEGIN
-- IF (NOT rst = '1') THEN
-- key_code
--ELS
IF(clk'EVENT AND clk='1')THEN
CASE scan_key IS --检测何处有键按下
WHEN "1110" =>
CASE column IS
WHEN "1110" =>
key_code
WHEN "1101" =>
WHEN "1011" => key_code
WHEN "0111" => key_code
WHEN OTHERS => NULL;
END CASE; WHEN "1101" =>
CASE column IS
WHEN "1110" => key_code
WHEN "1101" => key_code
WHEN "1011" => key_code
WHEN "0111" => key_code
WHEN OTHERS => NULL;
END CASE; WHEN "1011" =>
CASE column IS
WHEN "1110" => key_code
WHEN "1101" => key_code
WHEN "1011" => key_code
WHEN "0111" => key_code
WHEN OTHERS => NULL;
END CASE; WHEN "0111" =>
CASE column IS
WHEN "1110" => key_code
WHEN "1101" => key_code
WHEN "1011" =>
WHEN "0111" => key_code
WHEN OTHERS => NULL;
END CASE; WHEN OTHERS =>
key_code
END CASE;
END IF;
END PROCESS;
-----显示键值
PROCESS(key_code)
BEGIN
CASE key_code IS
WHEN "0000" =>
dyp_tmp
WHEN "0001" =>
dyp_tmp
WHEN "0010" =>
dyp_tmp
WHEN "0011" =>
dyp_tmp
WHEN "0100" =>
dyp_tmp
WHEN "0101" =>
dyp_tmp
WHEN "0110" =>
dyp_tmp
WHEN "0111" =>
dyp_tmp
WHEN "1000" =>
dyp_tmp
WHEN "1001" =>
dyp_tmp
WHEN "1010" =>
dyp_tmp
WHEN "1011" =>
dyp_tmp
WHEN "1100" =>
dyp_tmp
WHEN "1101" => dyp_tmp dyp_tmp dyp_tmp NULL;
END CASE;
END PROCESS; END arch;