📄 keyboardscan.txt
字号:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity data_scanC is
PORT(
sys_clk : in STD_LOGIC; --系统同步时钟
k_data : in STD_LOGIC; --键盘数据
k_clock : in STD_LOGIC; --键盘时钟
reset : in STD_LOGIC;
data : buffer STD_LOGIC_VECTOR(7 DOWNTO 0); --扫描码输出
PA : buffer STD_LOGIC_VECTOR(7 DOWNTO 0);
ZHJS : buffer STD_LOGIC ; --扫描码转换结束信号
ascii : out STD_LOGIC_VECTOR(7 DOWNTO 0)
);
end data_scanC;
architecture behav of data_scanC is
signal tmp : STD_LOGIC_VECTOR(11 downto 0) :="000000000000";--用来记录一帧信号
signal enable : std_logic :='0'; --输出使能
signal now_kbclk,pre_kbclk : std_logic;
begin
process(reset,k_clock,sys_clk) --系统时钟(sys_clk)比键盘时钟(k_clock)快很多
variable started:STD_LOGIC :='0';
variable counter :integer range 0 to 11 :=0;
begin
if reset='0' then ZHJS<='0';counter:=0;
elsif rising_edge(sys_clk) then --系统时钟(sys_clk)比键盘时钟(k_clock)快很多
pre_kbclk <= now_kbclk;
now_kbclk <= k_clock;
if(pre_kbclk > now_kbclk) then --由时序图可知,如果有数据发送则键盘时钟(k_clock)作周期性变化;如果k_clock 一直是高电平,则表示键盘正准备要发送数据。
tmp(counter)<=k_data; --键盘数据存tmp,例如,起始位存tmp[0],8位数据存tmp[1]—tmp[8]
if counter=10
then ZHJS<='0'; --ZHJS=’0’表示接收结束
else ZHJS<='1';
end if;
if counter=11 then
counter:=1;
else counter:=counter+1; --通过加法器把键盘的串行数据变成并行数据,即存tmp[counter]里面,这样做可以减少占用芯片资源.
end if;
end if;
end if;
if(counter>1 and counter<10) then started:='1'; --started=’1’表示没有接收完.
else started:='0';
end if;
enable<=started;
end process;
PA<="00000000" when enable='1' else tmp(8 downto 1); --如果接收完,则将tmp[8..1]存PA
data<=PA;
process(PA)
begin
case PA is
when"01000101"=> ascii<="00110000"; --'0'
when"00010110"=> ascii<="00110001"; --'1'
when"00011110"=> ascii<="00110010"; --'2'
when"00100110"=> ascii<="00110011"; --'3'
when"00100101"=> ascii<="00110100"; --'4'
when"00101110"=> ascii<="00110101"; --'5'
when"00110110"=> ascii<="00110110"; --'6'
when"00111101"=> ascii<="00110111"; --'7'
when"00111110"=> ascii<="00111000"; --'8'
when"01000110"=> ascii<="00111001"; --'9'
when"00011100"=> ascii<="01100001"; --'a'
when"00110010"=> ascii<="01100010"; --'b'
when"00100001"=> ascii<="01100011"; --'c'
when"00100011"=> ascii<="01100100"; --'d'
when"00100100"=> ascii<="01100101"; --'e'
when"00101011"=> ascii<="01100110"; --'f'
when"00110100"=> ascii<="01100111"; --'g'
when"00110011"=> ascii<="01101000"; --'h'
when"01000011"=> ascii<="01101001"; --'i'
when"00111011"=> ascii<="01101010"; --'j'
when"01000010"=> ascii<="01101011"; --'k'
when"01001011"=> ascii<="01101100"; --'l'
when"00111010"=> ascii<="01101101"; --'m'
when"00110001"=> ascii<="01101110"; --'n'
when"01000100"=> ascii<="01111111"; --'o'
when"01001101"=> ascii<="01110000"; --'p'
when"00010101"=> ascii<="01110001"; --'q'
when"00101101"=> ascii<="01110010"; --'r'
when"00011011"=> ascii<="01110011"; --'s'
when"00101100"=> ascii<="01110100"; --'t'
when"00111100"=> ascii<="01110101"; --'u'
when"00101010"=> ascii<="01110110"; --'v'
when"00011101"=> ascii<="01110111"; --'w'
when"00100010"=> ascii<="01111000"; --'x'
when"00110101"=> ascii<="01111001"; --'y'
when"00011010"=> ascii<="01111010"; --'z'
when others=> ascii<="11111111";
end case;
end process;
end behav;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -