ccs 发表于 2011-5-24 18:03:43

谁搞过比较复杂一点的键盘显示

谁搞过比较复杂一点的键盘显示

伯尼 发表于 2011-5-24 18:09:15

--键盘扫描的VHDL

library 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]
查看完整版本: 谁搞过比较复杂一点的键盘显示