⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.vhd

📁 程序主要是用硬件描述语言(VHDL)实现: 4*4键盘扫描
💻 VHD
字号:
Library IEEE;
Use IEEE.Std_Logic_1164.All;
Use IEEE.Std_Logic_Unsigned.All;

Entity Keyboard Is
Port     
(clk:In Std_Logic;
--Clock:in std_logic;             --扫描时钟频率不宜过高,一般在1KHz以下
KIN:In Std_logic_Vector(3 downto 0);    --读入行码
ScanSignal:Out Std_Logic_Vector(3 downto 0);--输出列码(扫描信号)
Num:Out Integer Range 0 To 15;          --输出键值,15表示无键按下
enter,ci:out std_logic
);
End;

Architecture Scan Of Keyboard Is
Signal Clock_1:Std_Logic_Vector(14 downto 0);
Signal Clock:Std_Logic;
Signal ScanS:Std_Logic_Vector(7 downto 0);
Signal SCN:Std_Logic_Vector(3 downto 0);
Signal Counter:Integer Range 0 To 3;--用以计数产生扫描信号
Signal CounterB:Integer Range 0 To 3;--用以计算

Begin
process(clk,Clock_1)
 Begin
   If rising_edge(clk)then
      if Clock_1="100111000100000" then
         Clock_1<="000000000000000";
      else
         Clock_1<=Clock_1+1;
      end if;
   end if;
Clock<=Clock_1(14);
end process;   
Process(Clock)
 Begin
  If rising_edge(Clock) then
   If Counter=3 then
     Counter<=0;
   Else
     Counter<=Counter+1;
   End If;
  Case Counter Is              --产生扫描信号
   When 0=>SCN<="1110";
   When 1=>SCN<="1101";
   When 2=>SCN<="1011";
   When 3=>SCN<="0111";
  End Case;
 End If;
End Process;

Process(Clock)
Begin
  If falling_edge(Clock) then  ---上升沿产生扫描信号,下降沿读入行码  
    If KIN="1111" then        ---如果连接检测到4次“0000”,表示无键按下 
      If CounterB=3 then
         Num<=15;             ---15为无效值,用以指示无键按下
         CounterB<=0;
         ci<='0';
         enter<='1';
      Else
       CounterB<=CounterB+1;
      End If;
     Else
     CounterB<=0;
     
     --wei<=wei+1;
     Case ScanS Is
     When "11101110"=>Num<=0;enter<='1';ci<='1'; 
     When "11101101"=>Num<=1;enter<='1';ci<='1'; 
     When "11101011"=>Num<=2;enter<='1';ci<='1'; 
     When "11100111"=>Num<=3;enter<='1';ci<='1'; 
     When "11011110"=>Num<=4;enter<='1';ci<='1'; 
     When "11011101"=>Num<=5;enter<='1';ci<='1'; 
     When "11011011"=>Num<=6;enter<='1';ci<='1';
     When "11010111"=>Num<=7;enter<='1';ci<='1';
     When "10111110"=>Num<=8;enter<='1';ci<='1';  
     When "10111101"=>Num<=9;enter<='1';ci<='1';
     When "10111011"=>Num<=10;enter<='0';ci<='0';  
     When "10110111"=>Num<=11;enter<='0';ci<='0'; 
     When "01111110"=>Num<=12;enter<='0';ci<='0'; 
     When "01111101"=>Num<=13;enter<='0';ci<='0'; 
     When "01111011"=>Num<=14;enter<='0';ci<='0'; 
     When Others=>Null;enter<='1';--ci<='0';
   End Case;
  End If;
 End If;
End Process;
ScanS<=SCN&KIN;
ScanSignal<=SCN;

End scan;



     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -