谁搞过比较复杂一点的键盘显示
谁搞过比较复杂一点的键盘显示 --键盘扫描的VHDLlibrary ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jp is
port(
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 is
signal count,sta:std_logic_vector(1 downto 0);
signal seg7:std_logic_vector(6 downto 0);
signal dat:std_logic_vector(4 downto 0);
signal fn:std_logic;--按键标志位,判断是否有键被按下
begin
scan<="00000001";--只使用一个数码管显示
--循环扫描计数器
process(clk)
begin
if clk'event and clk='1'then
count<=count+1;
end if;
end process;
--循环列扫描
process(clk)
begin
if clk'event and clk='1'then
case count is
when "00"=>
kbrow<="0001";
sta<="00";
when "01"=>
kbrow<="0010";
sta<="01";
when "10"=>
kbrow<="0100";
sta<="10";
when "11"=>
kbrow<="1000";
sta<="11";
when others=>
kbrow<="1111";
end case;
end if;
end process;
--行扫描译码
process(clk,start)
begin
if start='0'then
seg7<="0000000";
elsif clk'event and clk='1'then
case sta is
when "00"=>
case kbcol is
when "0001"=>
seg7<="1111001";
dat<="00011";
when "0010"=>
seg7<="1101101";
dat<="00010";
when "0100"=>
seg7<="0110000";
dat<="00001";
when "1000"=>
seg7<="1111110";
dat<="00000";
when others=>
seg7<="0000000";
dat<="11111";
end case;
when "01"=>
case kbcol is
when "0001"=>
seg7<="1111000";
dat<="00111";
when "0010"=>
seg7<="1011111";
dat<="00110";
when "0100"=>
seg7<="1011011";
dat<="00101";
when "1000"=>
seg7<="0110011";
dat<="00100";
when others=>
seg7<="0000000";
dat<="11111";
end case;
when "10"=>
case kbcol is
when "0001"=>
seg7<="0011111";
dat<="01011";
when "0010"=>
seg7<="1110111";
dat<="01010";
when "0100"=>
seg7<="1111011";
dat<="01001";
when "1000"=>
seg7<="1111111";
dat<="01000";
when others=>
seg7<="0000000";
dat<="11111";
end case;
when "11"=>
case kbcol is
when "0001"=>
seg7<="1000111";
dat<="01111";
when "0010"=>
seg7<="1001111";
dat<="01110";
when "0100"=>
seg7<="0111101";
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(1) and dat(2) and dat(3) and dat(4));
process(fn)
begin
if fn'event and fn='1'then --按键信息存储
seg7_out <=seg7;
end if;
end process;
end one;
页:
[1]