📄 keyscan.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 + -