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

📄 keyscan.vhd

📁 在ACEX EP1K30TC144-3实现了闹钟功能,并能修改定时,和当前时间
💻 VHD
字号:
--键盘扫描模块,用状态机实现,
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.P_ALARM.ALL;
ENTITY KEYSCAN IS 
    PORT(clk_kb :  in  std_logic;                --输入,键盘扫描的触发时钟,频率为25Hz
         reset :   in  std_logic;                --输入,复位信号
         row :     in  std_logic_vector(0 to 3); --输入,为延时后的行扫描输入信号
         col :     out std_logic_vector(0 to 3); --输出,列扫描信号
         keyvalue :out T_DIGITAL; --输出,按键的二进制编码
         keypress :out std_logic); --输出按键状态,未测到键按下是为0,当测到有按键按下时跳变为1。
END ENTITY KEYSCAN;
--------------------------------------
ARCHITECTURE ART OF KEYSCAN IS
    signal cntscn: std_logic_vector(2 downto 0);
    signal scanin: std_logic_vector(3 downto 0);
    signal keyflag: std_logic;
BEGIN
    keyflag<=not(row(0) and row(1) and row(2) and row(3));
------------------------------------------------------------
    process(clk_kb)--20ms       
    --variable keyf : std_logic;
    begin
        if (clk_kb'event and clk_kb = '1') then
            --keyf:=not(keyin(0) and keyin(1) and keyin(2) and keyin(3));
            --keyflag<=not(keyin(0) and keyin(1) and keyin(2) and keyin(3));
            if(keyflag='0') then--
                if (cntscn = "111") then
                    cntscn <= "000";
                else
                    cntscn <= cntscn+1;
                end if;
            else cntscn <= cntscn;
            end if;
            case cntscn is
                when "000" => scanin <= "0111";
                when "001" => scanin <= "0111";
                when "010" => scanin <= "1011";
                when "011" => scanin <= "1011";
                when "100" => scanin <= "1101";
                when "101" => scanin <= "1101";
                when "110" => scanin <= "1110";
                when "111" => scanin <= "1110";
                when others => null;
            end case;
      end if;
  end process;
------------------------------------------------
    value:process(clk_kb) is
    --value:process(keyflag) is
    variable stt : std_logic_vector(7 downto 0);
    begin
       stt := (row & scanin);  --行列值
       if(clk_kb 'event and clk_kb='1') then
            case stt is
            when "01110111"=>keyvalue<=0;--"0000";--K1,第1行
            when "01111011"=>keyvalue<=1;--"0001";--K2
            when "01111101"=>keyvalue<=2;--"0010";--K3
            when "01111110"=>keyvalue<=3;--"0011";--K4
            when "10110111"=>keyvalue<=4;--"0100";--K5,第2行
            when "10111011"=>keyvalue<=5;--"0101";--K6
            when "10111101"=>keyvalue<=6;--"0110";--K7
            when "10111110"=>keyvalue<=7;--"0111";--K8
            when "11010111"=>keyvalue<=8;--"1000";--K9,第3行
            when "11011011"=>keyvalue<=9;--"1001";--K10
            when "11011101"=>keyvalue<=10;--"1010";--K11
            when "11011110"=>keyvalue<=11;--"1011";--K12
            when "11100111"=>keyvalue<=12;--"1100";--K13,第4行
            when "11101011"=>keyvalue<=13;--"1101";--K14
            when "11101101"=>keyvalue<=14;--"1110";--K15
            when "11101110"=>keyvalue<=15;--"1111";--K16
            --when others    =>keyvalue:="ZZZZZZZZ";--"ZZZZ"; --高阻,无效按键
            when others    =>null;--"ZZZZ"; --高阻,无效按键
            end case;
            keypress<=keyflag;
        --else     keyvalue<="ZZZZZZZ"; --高阻,无按键或按键释放
        end if;
    --if(keyflag'event and keyflag='1') then
        --p0<=keyvalue;
    --end if;
    end process value;
-----------------------------------------------
    --scan<=scanin;
    col<=scanin;
    --keypress<=keyflag;
----------------------------------------------
END ARCHITECTURE ART; 

⌨️ 快捷键说明

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