集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1146|回复: 1

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

[复制链接]
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);  --行扫描信号

              kbrowut std_logic_vector(3 downto 0);  --列扫描信号

              seg7_outut std_logic_vector(6 downto 0);--显示控制信号

              scanut 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 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-17 18:13 , Processed in 0.116577 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表