?? 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; --系統(tǒng)同步時鐘
k_data : in STD_LOGIC; --鍵盤數(shù)據(jù)
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 ; --掃描碼轉(zhuǎn)換結(jié)束信號
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) --系統(tǒng)時鐘(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 --系統(tǒng)時鐘(sys_clk)比鍵盤時鐘(k_clock)快很多
pre_kbclk <= now_kbclk;
now_kbclk <= k_clock;
if(pre_kbclk > now_kbclk) then --由時序圖可知,如果有數(shù)據(jù)發(fā)送則鍵盤時鐘(k_clock)作周期性變化;如果k_clock 一直是高電平,則表示鍵盤正準(zhǔn)備要發(fā)送數(shù)據(jù)。
tmp(counter)<=k_data; --鍵盤數(shù)據(jù)存tmp,例如,起始位存tmp[0],8位數(shù)據(jù)存tmp[1]—tmp[8]
if counter=10
then ZHJS<='0'; --ZHJS=’0’表示接收結(jié)束
else ZHJS<='1';
end if;
if counter=11 then
counter:=1;
else counter:=counter+1; --通過加法器把鍵盤的串行數(shù)據(jù)變成并行數(shù)據(jù),即存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;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -